0

好的,大家好,我在 VHDL 中尝试做的是取一个 8 位二进制值并将其表示为 BCD,但有一个问题,因为这个值必须是最大输入 9 的一小部分。

1- 将输入转换为整数,例如 1000 0000 -> 128

2- 将整数除以 255 然后乘以 90( 90 以便我得到一个数字和小数点后的第一个数字都在小数点后)

例如 128/255*90 = 45.17(假设为 signal_in)

3.通过除以 20 提取 45 的两位数并将它们存储为单独的整数,例如我会使用类似的东西:

LSB_int = signal_in mod 10

然后我将信号除以 10,因此将其更改为 4.517,然后让它等于 MSB_int ..(这将截断小数并存储 4 正确)

4.将LSB_int和MSB_int都转换为4位BCD

..从那里我会是完美的......但遗憾的是我遇到了很多麻烦......使用不同的数据类型(签名无符号std_logic_vectors)和除法。所以我只需要帮助解决我思维过程中的任何缺陷和我应该做的事情做这个的时候要注意..

我实际上已经完成了我的代码并认为我保存了这个..但我没有,而且我仍然相信这个解决方案可以工作我会用我认为是我的旧代码来回复......只要我能记住这一切..

这是我的新代码的另一个问题..(只是为了表明我确实做了一些事情..) 在 VHDL 中将 8 位二进制数转换为 BCD

4

1 回答 1

0

f 我明白,你需要的是转换一个 8bit 数据

0-255 → 0-9000

并用 4 个 BCD 数字表示。

例如你想要 0x80 → 4517 (BCD)

如果是这样,我建议你一个完全不同的想法:

1)

用简单的 8bit*8bit->16bit 将输入范围转换为输出范围

(in_data * 141) 并保持 14 MSB(0.1% 误差)

假设这个 14 位寄存器是目标

2)

构建一个 4 位 BCD 向上/向下计数器(您的输出)

构建一个 14 位二进制加/减计数器(跟随器)

为两者提供相同的输入(reset、clk、UpDown)

(使一个成为另一个的影子)

3)

比较 TARGET 和二进制计数器

if (follower < target) then increment the counters
else if (follower > target) then decrements the counters
else nothing

4)

结尾

于 2014-11-26T19:01:42.030 回答