lcytms
发表于 2017-3-29 21:56:57
1147
如何把一个对应的数转成对应的BCD码呢?
有很多种算法,在C语言里面也经常讨论它。
C语言里面讨论的是一种4比特的移位法。
现在硬件里面我向大家介绍一种比较新的称之为3比特的移位法。
如果我们有一个binary的6:0。
举个例子,7个1,我们把它如何变成BCD码呢?
比较新的3比特的移位法是这样的。
先准备一个移位寄存器。
这个移位寄存器的宽度是二进制的宽度加上BCD的宽度。
BCD的宽度是多少呢?
我们知道,一个BCD位是4个比特,然后binary的6:0,最大是127,BCD位是11:0。
lcytms
发表于 2017-3-29 21:58:59
1148
如果是7:0,最大是256,仍然是百位十位个位。
对应的仍然是11:0。
准备移位寄存器,移位寄存器的宽度是BCD的宽度,加上binary的宽度。
在这张表上,binary的宽度是7位,加上BCD的宽度,就是一个19比特。
然后左移一位做一次大四加三的调整,在每个BCD码上做一个大四加三。
1149
(对照表格讲解大四加三算法)
1150
(对照表格讲解大四加三算法)
1151
这里面有移位,有算法,有大四加三,有行为,有数据流,还有到了顶层还有结构化,如何实现呢?
看到这种算法,很多人就会想到,一定要用时钟了,有时钟才有移位嘛。
但是我们知道BCD是做什么用的呢?
就像我们现在看到的,是做显示用的。
显示的速度是很慢很慢的,需不需要时钟呢?
有时钟加上去,当然也能做出来。
但是一般而言,这个模块,我们写的BCD的一个converter的模块,就应该是一个组合逻辑。
组合逻辑没有时钟,能不能写呢?
我们下午来看。
上午先到这。
(午休)
lcytms
发表于 2017-3-29 22:06:29
1340
我再叙述一下这张表格。
1341
(对照表格讲解大四加三算法)
1342
我们来看看怎么来实现它,而且我们是组合逻辑。
实际上只要按照层次化的思想,是可以迎刃而解的,首先我们可以把它的顶层,我们把每一行的动作看成是一个顶层的作为。
顶层的动作有多少次呢?
二进制有多少位,就有多少次动作,做了7次。
然后调整做了几次呢?
调了6次,做了7次。
1343
如果是7:0的,就是多出了一位,移动了8次,调整了7次,记住,调整的次数是移动次数减一。
这样的话,我们可以把顶层看作8个例化的模块构成的,每一行是一个动作,行与行之间的交界面是它的接口。
交界面是什么呢?
就是20个进,20个出。
20个输入,20个输出。
lcytms
发表于 2017-3-29 22:08:04
1344
左移一位,在BCD码上做大四加三。
我们把修正做成例化。
1345
来做一下这个代码。
同学跟着我一起做。
下午的练习我们要在这个基础上,把它修改为24位的。
1346
我们同样用自上而下的方法来做。
新建一个verilog。
另存为bin2bcd_8bit.v。
1347
设置为顶层。
搭建框架。
lcytms
发表于 2017-3-29 22:09:46
1348
编写bin2bcd_bit8.v模块的代码。
lcytms
发表于 2017-3-29 22:10:46
本帖最后由 lcytms 于 2017-3-29 22:14 编辑
1349
Ctrl+S、Ctrl+K。
做框架检查。
先把bcd_modify的框架准备好。
20进,20出。
1350
搭建框架。
lcytms
发表于 2017-3-29 22:11:29
本帖最后由 lcytms 于 2017-3-29 22:17 编辑
1351
搭建框架。
Ctrl+S、Ctrl+K。
做框架检查。
lcytms
发表于 2017-3-29 22:11:59
本帖最后由 lcytms 于 2017-3-29 22:18 编辑
1352
现在可以做装配了。
lcytms
发表于 2017-3-29 22:12:31
本帖最后由 lcytms 于 2017-3-29 22:19 编辑
1353
例化7次。
lcytms
发表于 2017-3-29 22:20:05
1354
声明中间信号。