算法基础-数的建模

一、建模           在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;

 结论:最好是同位宽数据之间进行计算,否则会出错。

转载于:https://www.cnblogs.com/TFH-FPGA/archive/2012/07/30/2615325.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值