明德扬肖老师 发表于 2020-9-7 18:44:28

【FPGA至简设计原理与应用】第一篇 第三章硬件描述语言Verilog第5节二进制是基础


本案例的编号为:001500000159,如果有疑问,请按编号在下面贴子查找答案:MDY案例交流【汇总贴】_FPGA-明德扬科教 (mdy-edu.com)
本文为明德扬原创及录用文章,转载请注明出处
大家好,近期我们会连载《FPGA至简设计原理与应用》一书,有兴趣的同学可以学习,也希望大家可以对我们的书提出宝贵的意见和建议。

《FPGA至简设计原理与应用》书籍连载索引目录

http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=989


读过的朋友可积极在贴后留言,书籍正式出版时,我们会从留言者中挑选20位幸运读者,幸运读者可获潘老师亲笔签名书籍一本。

注:手机浏览可能格式会乱,建议用电脑端进行浏览。






5.2.2 二进制是基础

本文档编号:001100000061
需要看对应的视频,请点击视频编号:001100000055
1. 本节主要进行组合逻辑的介绍,包括:程序语句(assign语句、always语句),数字进制(二进制、不定态、高阻态),算数运算符(加、减、乘、除运算符),逻辑运算符(逻辑与、或、非运算符),按位逻辑运算符(单目按位与、或、非运算符,双目按位与、或、异或运算符),关系运算符,移位运算符(左移、右移运算符),条件运算符(三目运算符、if语句、case语句、选择语句等),拼接运算符;
2. ALTERA和VIVADO文档



    在数字电路中如果芯片A给芯片B传递数据,例如传递0或者1信息,可以将芯片A和芯片B通过一个管脚进行相连,然后由芯片A控制该管脚输出为高电平或者低电平,通过高低电平来表示0和1。芯片B检测到该管脚为低电平时,表示收到0,芯片B检测到该管脚为高电平时,表示收到1。

http://www.fpgabbs.cn/data/attachment/forum/202005/14/094605yy9e0mbjl0lo59d5.jpg
反之,如果用低电平表示收到1,用高电平表示收到0可不可以呢?当然可以,只要芯片A和芯片B事先协定,芯片A要发数字1时会将该管脚置为低电平。芯片B检测到该管脚为低电平,表示收到了数字1,通信完成。

http://www.fpgabbs.cn/data/attachment/forum/202005/14/094638wmnkhvl1lv0hnn14.jpg
一个管脚拥有高低电平两种状态,可以分别表示数字0和1的两种情况。如果芯片A要发数字0、1、2、3给芯片B又要如何操作呢?
可以让芯片A和芯片B连接两根管脚,即两条线:a和b。当两条线都为低电平时,表示发送数字0;当a为高电平b为低电平时,表示发送数字1;当a为低电平b为高电平时,表示发送数字2;当两条线都是高电平时,表示发送数字3。


http://www.fpgabbs.cn/data/attachment/forum/202005/14/094758iciukq9ia9hhck9q.jpg
按照同样的道理,芯片A要发送数据4,5,6,7给芯片B时,只要再添加一条线就可以了。三根线一共有8种状态,可以表示8个数字。综上所述,线的不同电平状态可以表示不同的含义,有多少种不同状态就可以表示多少个数字。
下面来思考一下如果芯片A要发送+1,-1,0,+2等数字给芯片B,这里的正负又该如何表示呢?参考前面的思路,线的高低电平表示的含义是由芯片双方向事先约定好的,既然如此则可以单用一根线来表示符号,例如低电平表示正数,高电平表示负数。

http://www.fpgabbs.cn/data/attachment/forum/202005/14/094851iud4ycvpupd96iep.jpg

上图所示的三根线中用线c表示正负,其中0表示正数,1表示负数。用线a和线b表示数值,以3’b111为例,其可以解释为十进制数7,也可以解释为有符号数原码“-3”,也可以解释为有符号数补码“-1”,如何解释取决于工程师对二进制数的定义。只要该定义不影响到电路之间的通信就不会发生问题。因此数字中的“0”和“1”不仅可以表示字面上的数值含义,也可以表示其他意义,如正负符号等。同样的道理,在数字电路中二进制数是八进制、十进制、十六进制、有符号数、无符号数、小数等其他数制的根本。在FPGA设计中,不清楚小数、有符号数的计算方法的最根本原因是不清楚这些数据所对应的二进制值,只要理解了对应的二进制值,很多问题都可以解决。
下面通过例子让同学们更好的理解这一概念,很多初学者经常问,FPGA中如何实现小数计算呢?以“0.5+0.25”为例,众所周知0.5+0.25的结果为0.75,可以考虑0.5、0.25和0.75用二进制该如何表示?具体表示方法取决于工程师的做法,因为这种表示方法有很多种,例如定点小数,浮点小数,甚至如前面所讨论,用几根线自行来定义,只要能正常通信,那就没有问题。假设某工程师用三根线自行定义了二进制值所表示的小数值,如下表所示。
表1.3- 3自定义二进制数值表
二进制值定义二进制值定义
3’b0000.13’b1000.25
3’b0010.53’b1010.3
3’b0100.753’b1100.8
3’b0110.23’b1110

为了说明二进制值的意义是可以随便定义的,笔者特意将数字顺序打乱。当然,有读者可能说为什么只有这几种小数呢?这是因为假定中的系统就只有这几种数字,如果想表示更多数字增加线的数量就可以了。
完成上面定义之后,要实现“0.5+0.25”就很容易了,其实就是3’b001和3’b100“相加”,期望得到3’b010。但是在该表中直接使用3’b001 + 3’b100,结果为“101”,这不是想要的结果,此时可以将代码写为:

12If(a==3’b001 && b==3’b100)c<= 3’b010;

当然,这只是其中一种写法,只要能实现所对应的功能且结果正确,任意写法都可以。
有读者可能会有疑问,0.1+0.8应该为0.9,但上面的表格中并没有0.9的表示。这其实是设计者定义的这个表格有缺陷,或者设计者认为不会出现这一情况。笔者此处要表达的是:只要定义好对应的二进制数,很多功能都是很容易设计的。当然,实际的工程中通常会遵守约定成俗的做法,没必要另辟蹊径。
例如,下表是常用的定点小数的定义:表1.3- 4常用定点小数定义
二进制值定义二进制值定义
3’b0000.03’b1000.5
3’b0010.1253’b1010.625
3’b0100.253’b1100.75
3’b0110.37253’b1110.8725

此时如果要实现0+0.5=0.5,也就是3’b000和3’b100相加,期望能得到3’b100。可以发现直接用二进制3’b000+3’b100就能得到3’b100。
同样地,要实现0.125+0.75=0.8725,也就是3’b001和3’b110相加,期望能得到3’b111。可以发现直接用二进制3’b001+3’b110就能得到3’b111。
如果要实现0.5+0.75=1.25这一计算,可以看出此时1.25已经超出了表示范围,可以通过增加信号位宽或只表示小数位的做法解决这一问题。如果只是表示小数位则结果就是0.25,即3’b100和3’b110相加,期望得到3’b010。不难发现3’b100 + 3’b110 = 4’b1010,用3位表示就是3’b010,也就是0.25。综上所述可以看出,定点小数的计算并不复杂,定义好定点小数与二进制值之间的关系后直接进行计算即可。

需要看对应的视频,请点击视频编号:001100000055


页: [1]
查看完整版本: 【FPGA至简设计原理与应用】第一篇 第三章硬件描述语言Verilog第5节二进制是基础