5、逻辑运算实例
Input
Output
①1bit的加法器——半加器 a0,a1
s,c1
全加器 c0,a0,a1
s,c1
全加器:
assign s = (a0^a1)^c0;
assign t1 = a0&c0;
assign t2 = a1&c0;
assign t3 = a0&a1;
assign c1 = (t1|t2)|t3;
②利用缩减运算进行操作——变量a,b
|a 缩减或 判断一个数全为0(若结果为0)
&a 缩减与 判断一个数全为1(若结果为1)
^a 缩减异或 判断一个数有奇数个1(若结果为1)
~^a 缩减同或 判断一个数有偶数个1(若结果为1)
|(a^b) 按位异或+缩减或判断两个数相等(若结果为0)
6、算术运算加减乘除
+ - * 可综合
a/b 不可综合 整数除法,结果取靠近0的整数,(b为0时,结果为x)
a%b 不可综合 结果与a的符号相同
a**b(ab)不可综合 ①操作数为实数、整数或带符号数,结果返回为实数
②操作数为无符号数,结果为无符号数
③a为0,且b<0,则输出为x
④a<0,且b不是整数,则输出为x
注:直接使用“/”时,会占用很多资源,且时钟频率上不去。因为不是完全不能使用“/”,而是适不适合使用。如果不用于复杂的Verilog算法,且对计算时间要求不严,是可以使用的。
7、移位操作①>> 逻辑右移 空位用0填充
<< 逻辑左移 空位用0填充
>>> 算术右移 无符号数,空位用0填充。有符号数,用其符号位填充
<<< 算术左移 空位用0填充
注:对于移位操作,移位的位数必须是常数值
有符号数 8’sb1000_1101>>>8’d2 = 8’sb1110_0011
②用移位代替*,可以节省资源
m = 17a = (16 + 1)*a = (a<<4) + a;
m = 6a = (8 - 2)*a = (a<<3) - (a<<1);
注:一些FPGA有DSP核,可将乘法器优化到这些硬核中去。
8、有符号数wire signed [7:0] a;
指定比特宽度的有符号数是可综合的。
9、加法电路分析注:减法一般可转化为加负的被加数处理。
4bit,无符号数加法器
逐次进位型:建立时间为各级半/全加器的建立时间之和。
当位宽很大时,这种单元可以允许的最高工作时钟频率是很低的。
设:全加器的处理速度是1ns,全加器之间的传输线上的时延是1ns。
则time = 4 + 3 = 7ns
∴ 4bit加法器需要7ns→142.857MHz
进而,10bit 10 + 9 = 19ns→52.631MHz
so,要提高工作的最高时钟频率,采用时序电路里的流水线方法。
10、关系操作> < >= <= == !=
注:对于无符号数和有符号数的比较,从代码上看是没有区别的。
但是,除了相等和不等操作外,这两类数值的比较在电路上有区别。11、高比特宽度比较 大于>方法:先扩展位数宽度一致,然后一位位比较,如果相同再向下比。
①a != b →a^b
②a > b →a&&(!b)
12、不同编码方式下,比大于操作原码 反码 补码非负数 ①去掉符号位后,按无符号数处理
负数 ①之后,结果取反
注:4位有符号二进制数的表示数值范围
原码 -7~7有+0和-0
反码 -7~7
有+0和-0
补码 -8~7
而补码的出现,使以前的-0变为了-128→1000
注意,补码-128并没有用原码和反码表示。
13、拼接操作 {signal1,signal2,......}signal可以是常数或变量,但位宽必须已知且不变。
①拼接操作实现全家器(1bit)
assign {c1,s1} = a0 + a1 + c0;
②乘法器 ×17 = ×16 +×1 8bit
assign mul = {4’b0000,a,4’b0000} + {8’h0,a};
优化:wire [8:0] sum_middle
assign sum_middle = {1’b0,a} + {5’b00000, a[7:4]};
assign sun = {3’b000, sum_middle, a[3:0]};
③一个数据全部颠倒
wire [7:0] forward;
wire [0:7] reversed;
assign reversed = forward; |