在单片机C语言中,我们经常用/10,%10这样的方法将数字转换为字符串,反过来字符串转数字就用乘法:*10。
1829除以10,商182余9,得到个位数9。
182再除以10,商18余2,得到十位数2。
18除以10,商1余8,得到千位数1和百位数8。
但是这种方法并不适合于FPGA。因为乘法器和除法器都比较庞大,如果用在for循环里面,最后编译出来的电路会非常复杂,搞不好会把整个fpga的资源全部用完。
实际上,根本就不需要乘除法,我们只用加减法和移位就能搞定。
数字本质上就是二进制码,字符串本质上就是BCD码。
例如数字18是:00010010
而字符串"18"的十六进制形式是0x31 0x38
把左边的3去掉,剩下的就是1和8,合起来就是BCD码 0001 1000
我们要把字符串转换成数字,就是要将BCD码转换成二进制码(binary,也叫BIN码)。
把数字转换成字符串,就是把二进制码转换成BCD码,然后每个数位前面添上3(0011)就可以了
BIN和BCD之间的互相转换有专门的算法。
BIN转BCD:由加法和8次左移位组成
https://my.eng.utah.edu/~nmcdonal/Tutorials/BCDTutorial/BCDConversion.html
BCD转BIN:反过来,由减法和8次右移位组成
https://embeddedthoughts.com/2016/06/01/bcd-to-binary-conversion-on-an-fpga/
由于算法非常简单,我们可以在FPGA中用组合逻辑来实现,单个时钟周期就可以直接得出结果。
不需要乘法器和除法器。不需要多个时钟周期。
FPGA Verilog字符串转数字,以及数字转字符串的方法
最新推荐文章于 2021-06-08 16:24:06 发布