【问题标题】:VHDL Error "Expecting constant slice on LHS"VHDL 错误“期望 LHS 上的常量切片”
【发布时间】:2023-01-11 02:11:12
【问题描述】:

我写了一段代码。这应该在一个位置插入一个“1”,该位置由信号 E_reg_sig 的二进制部分确定。留给“1”的位应该由信号E_reg_sig的小数位填充。

有一些特殊情况:

  1. 位置高于输出信号范围:则所有位都设置为高
  2. “1”左边的位数多于 E_reg_sig 的小数位:在这种情况下,输出应由 E_reg_sig 的小数部分填充,其余应为“0”
  3. 空间小于 E_reg_sig 的位宽:在这种情况下,代码应该用 E_reg_sig 从 MSB 到 LSB 的位填充,直到输出中没有位需要填充为止
         library ieee;
         use ieee.std_logic_1164.all;
        use ieee.numeric_std.all;
        use ieee.fixed_pkg.all;
        use work.parameters.all;
        
        entity log_mvm is
          port (
        CLK:        IN  std_logic;
        E_reg: IN: ufixed(counter_log_mvm_WIDTH downto -(DATA_WIDTH_IN-2));
        F_reg: OUT: unsigned(DATA_WIDTH_IN-2 downto 0);
          );
        end log_mvm;
        architecture Behavioral of log_mvm is
        begin
        process(clk)
         variable insert_position : NATURAL;  
        if rising_edge(CLK) then
        
            insert_position:= to_integer(E_reg(E_reg'high downto 0));
        
            if insert_position > F_reg'high then
                F_reg<= (others=>'1');
            else 
                F_reg(insert_position)<='1';
             if insert_position>-1 then
                If insert_position>=(-E_reg'low) then
                   F_reg(insert_position-1 downto insert_position+E_reg'low)<=unsigned(E_reg(-1 downto E_reg'low));
                else  
                    F_reg(insert_position-1 downto 0)<=unsigned(E_reg(-1 downto -insert_position));
              END if;
              END IF;
            end if;
           
            END IF;
            END IF;
            end process;
        end Behavioral;
    
    

    DATA_WIDTH_IN 被定义为自然值 8

    此代码在模拟中运行良好,但对于合成,F_reg(insert_position-1 downto 0)&lt;=unsigned(E_reg(-1 downto -insert_position)); 部分出现错误“[Synth 8-7138] Expecting constant slice on LHS”

    如何避免这种情况

    我正在使用 VHDL 2008 和 Vivad0 2021

【问题讨论】:

  • 您的代码有语法错误:设计中缺少 clk 作为信号或端口。没有e_regf_reg的声明。您指定的合成错误不是 VHDL 错误 - 它是您使用的工具的限制 - 许多切片数组时需要恒定范围。另请注意,if insert_position&gt;-1 then 始终为真,因为自然数从 0 开始。
  • 谢谢你 。通过将我的程序翻译成一个最小的例子,这个错误发生了。我纠正它。我在 Vivado 2021 中使用 VHDL 2008

标签: vhdl


【解决方案1】:

你必须使用一个循环:

for i in F_reg'range loop
    if i<=insert_position-1 then
        F_reg(i) <= E_reg(i-insert_position);
    end if;
end loop;

【讨论】:

  • 谢谢!将 if 语句包含在 for 循环中不是更硬件和更高效的时间吗,因为我们没有做那么多循环?还是 vivado 会自动优化它?
  • 综合将展开最大范围内的所有循环。硬件中不存在条件循环。
猜你喜欢
  • 2014-06-10
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多