Verilog中的数据格式
1、基本概念
verilog中写一个数据的通用格式是 n'b000_000_···_000,表示一个n位的二进制数。基于这个通用式,可以将其分为三个部分:位数、加权数和实际数。改变位数自然可以改变该数的存储宽度。改变加权数则是改变数制。如使用b(二进制),d(十进制),h(十六进制)。八进制的表示没有注意过,用的也比较少,感兴趣可以去了解一下。改变实际数则是改变了数值的大小。这里可以推出申明常数的流程。先在内存确认空间。注意这里的长度都是基于二进制的。也好理解,毕竟存储在寄存器中的数据都是二进制的。而后确定描述形式。这个形式配合后面的实际数构成了这个数据的值。下面是几个例子:
1'b1; 2'd10; 3'hf; 4'b0001; 5'd32; 6'h3f;
在上面的几个数中,第一个是正确的。表示一位二进制1,第二个超出内存限制,实际值为2’d3。但是现在的编辑器会报错。编辑器可以将高位补0,但是不会承认溢出数据。其他几个也是采取同样的方法阅读。
接下来是几种简写的方式:
'b0001; 'd1000; 'hffee; 1; 2; 6;
前面三个数据省略内存申明,由具体的编译器补充。后面的则是默认32位十进制的数据。如果超出编译器则会拓展。
当然一般来说,只有十进制数一般不用于verilog中的数据赋值,而是用于判断语句或者位宽等值的使用。这样可以有效地分辨赋值数据的所在。至于第二种的缩写则是对于一些数据变化较大不好确认空间的数据。为什么会有常数数据变化呢?
这里常见的就是手动修改对应的数据大小。还有参数传递过程中也是有数据大小的变化的。
2、实际应用
在实际的运用中,有许多为了适应电路特性的编码方式。比较有名的是ASCII编码,BCD编码等方式。
其中ASCII码是8位宽的编码,也就是一个字节。在verilog可以直接使用" M "的方式表示M的ASCII码。
而BCD码则是一种无权码。其中常见的就是8421BCD码,就是使用四位表示0~9这10个十进制的数中的一个,然后拼接。简单理解,BCD,就是将一个十进制的每个权上的数取下来,由四位二进制表示,然后直接按照顺序拼接。感觉像将一列火车拆成一节一节,放在不同的轨道运行。
这也体现了BCD的优势所在,由于数字电路是支持位操作的,所以可以通过操作BCD码直接得到十进制数的高位的加减。这样可以避开不需要处理的低位数据。而缺点就是不能和十进制数据直接转化,需要经过二进制。具体举个例子:
8'd10+8'd20=8'd30; {4'd1 , 4'd0} + {4'd2 , 4'd0 }={4'd3,4'd0}
上面的是十进制的加法,下面是BCD加法的示意图。对于我们来说,判断逻辑是一样的,就是从低到高开始加,依次判断本位值和进位值。这是全加器的思路。而对于BCD码而言,可以直接对应到需要操作的位数。比如这里是十位直接相加,个位保持不变。这就将8位全加器的工作转化为4位全加器。当然,BCD码并不是用于计算的,从这里也可以看到计算结果并不能直接使用,计算反而麻烦。这个例子只是说明BCD码的模型。
那BCD的优势在具体应用中的有何体现呢。
BCD的主要特点是无权。所以在设计中可以直接拼接,所以对于那些只需要表示而不需要大量计算的十进制转化为BCD可以有效地提高电路处理速度。
3、总结
了解BCD是比较重要的,可以提高设计的效率和可读性。