【发布时间】:2023-01-11 02:11:12
【问题描述】:
我写了一段代码。这应该在一个位置插入一个“1”,该位置由信号 E_reg_sig 的二进制部分确定。留给“1”的位应该由信号E_reg_sig的小数位填充。
有一些特殊情况:
- 位置高于输出信号范围:则所有位都设置为高
- “1”左边的位数多于 E_reg_sig 的小数位:在这种情况下,输出应由 E_reg_sig 的小数部分填充,其余应为“0”
- 空间小于 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)<=unsigned(E_reg(-1 downto -insert_position));部分出现错误“[Synth 8-7138] Expecting constant slice on LHS”如何避免这种情况
我正在使用 VHDL 2008 和 Vivad0 2021
【问题讨论】:
-
您的代码有语法错误:设计中缺少
clk作为信号或端口。没有e_reg或f_reg的声明。您指定的合成错误不是 VHDL 错误 - 它是您使用的工具的限制 - 许多切片数组时需要恒定范围。另请注意,if insert_position>-1 then始终为真,因为自然数从 0 开始。 -
谢谢你 。通过将我的程序翻译成一个最小的例子,这个错误发生了。我纠正它。我在 Vivado 2021 中使用 VHDL 2008
标签: vhdl