Vector VHDL标准逻辑向量位值中的问题

Vector VHDL标准逻辑向量位值中的问题,vector,vhdl,Vector,Vhdl,我在检测存储在std_logic_vector格式中的二进制数的位置值时遇到问题。例如,在下面的代码中,我试图查看INST_SPEED的值是多少,介于0到99 km/h之间。代码很长,有很多if条件 if INST_SPEED > "0001001" and INST_SPEED < "0010100" then -- if INST_SPEED > 9 & INST_SPEED < 20 UPPER10 <= "0000

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

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
如果安装速度>0001001且安装速度<“0010100”,则-如果安装速度>9且安装速度<20

上面10改变问题。我建议实现一个模函数,将二进制值转换为以10为基数的值(如果不需要快速更新的话,这个值可能会非常小),或者可以更容易地使用BCD作为INST_SPEED值


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

我可以想到以下几个选项:

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

  • 嘿,是的,我昨晚睡觉的时候想到了这个问题。我认为将每个数字依次除以100,然后再除以10更简单。例如,以721号为例,在第一次除法之后,我将得到7作为答案(百位值),21作为余数。然后我将余数除以10,得到2作为十的值,最后1作为单位或一的值。谢谢大家的帮助,非常感谢!