VHDL中的问题std_logic_vector放置值

时间:2011-06-23 17:42:13

标签: vector vhdl

我在检测以std_logic_vector格式存储的二进制数的位置值时遇到问题。例如,在下面的代码中,我试图看看INST_SPEED中的值是0到99 km / h之间的值。如果条件很多,代码很长。

if INST_SPEED > "0001001" and INST_SPEED < "0010100" then           -- if INST_SPEED > 9 & INST_SPEED < 20

       UPPER10 <= "0000001";                    -- UPPER10 = 1
       TEMP    <= std_logic_vector(unsigned(INST_SPEED) - 10);
       UPPER1 <= TEMP;                      -- LOWER10 = INST_SPEED - 10
      elsif INST_SPEED > "0010011" and INST_SPEED < "0011110" then  -- if INST_SPEED > 19 & INST_SPEED < 30
       UPPER10 <= "0000010";                    -- UPPER10 = 2
       TEMP    <= std_logic_vector(unsigned(INST_SPEED) - 20);
       UPPER1 <= TEMP;                      -- LOWER10 = INST_SPEED - 20
      elsif INST_SPEED > "0011101" and INST_SPEED < "101000" then   -- if INST_SPEED > 29 & INST_SPEED < 40
       UPPER10 <= "0000011";                    -- UPPER10 = 3
       TEMP    <= std_logic_vector(unsigned(INST_SPEED) - 30);
       UPPER1 <= TEMP;                      -- LOWER10 = INST_SPEED - 30

但是,现在我必须编写一个类似的代码来检测0-999范围内的值。如果我遵循这个逻辑,那将意味着90个这样的条件!

有没有人知道更简单,更聪明的方式来实现这个过程?这真的可以帮助我,提前谢谢!

2 个答案:

答案 0 :(得分:0)

更改问题。我建议实现一个模数函数,从二进制值转换为十进制值(如果它不需要快速更新,这可能非常小),或者更容易使用BCD作为INST_SPEED值。

当你正在编写内容时,你真的需要一个除法/模数函数,这就是你试图用所有条件进行硬编码的。根据您的目标,您可以“免费”执行此操作(即:您使用的FPGA可能有未使用的硬件乘法器吗?)。

答案 1 :(得分:0)

我能想到的情侣选择:

  1. 如何创建一个存储在ROM中的大型LUT(查找表)?地址为INST_SPEED值,输出为UPPER10或TEMP。您可以使用脚本(VHDL之外)生成ROM内容,然后将其粘贴到代码中,或者从支持VHDL文件IO的文件加载。
  2. 输入和输出之间真的没有简单的模式吗?这是一些你可以得到的数学函数吗?