一、建模 在FPGA中没有负数的概念,要是用intetger 类型变量来实现正负数,显然过于浪费逻辑资源,因为他为32位数据。
怎样用reg类型来建模呢,迫在眉睫。。。。。。。。。。
8位数在c语言中的表示范围:
无符号: 0 ~ 255
有符号:-128 ~ 127
在FPGA中如此表示:定义reg 【7:0】 a;
0 a=0
1 a=1
2 a=2
3 a=3
--------------
---------------
127 a=127
-128 a=128
-1 a=255
-1 = 256-1=255为-1的补码
又例如:在FPGA中如此表示:定义reg 【2 :0】 a; 0,1,2,3 有符号数的范围为-2 ~ 1
-2 a=2
-1 a=3
0 a=0
1 a=1
二、大小比较 翻译C语言语句 a 8位的char型数据
if(a>0) 翻译为verilog为 if(a>0 && a<=127)
if (a<5) 翻译为verilog为 if( a<5 || a>=127 || a<256 )
if (a<-5) 翻译为verilog为 if( a>=128 || a<256-5 )
三、移位运算 翻译C语言语句 a 8位的char型数据
a=5>>1=2; 翻译为verilog为 a=5>>1=2; 或者a=5/2(和C语言一样)
a=-5>>1=-3; 5>>1=2 取反 =-3
a=-6>>1=-3; 6>>1=3 取反+1=-3
翻译为verilog为:
思想:偶数 将a取反+1变为正数 移位后取反+1变为负数
思想:奇数 将a取反+1变为正数 移位后取反 变为负数(不加一也就是对负数减一 -5>>1=-2-1=-3)
case(a[0])
0:if(a[8]==0)B_r=B_r>>1;else begin a=~a+1;a=B_r>>1;a=~a+1; end//为偶数时
1:if(a[8]==0)B_r=B_r>>1;else begin a=~a+1;a=B_r>>1;a=~a; end//为奇数时
endcase
四、溢出或出错
1、当不同位宽进行操作时会出错
如:reg[7:0] a; reg [15:0] b;
a=5;
b=-a; 原来的想法为让b=-5;但b却等于251
处理方法为:b={8‘H00,-a};结果正确为-5;
结论:最好是同位宽数据之间进行计算,否则会出错。