【发布时间】:2020-10-14 07:50:51
【问题描述】:
我正在刷新我的VHDL编程技能(通过使用ModelSim),我编写了移位寄存器项目和一个测试台,我成功地编译了它们。 当我尝试运行 TB 文件时,出现与 CASE 相关的致命错误:shl(shift left)/Shr(shift right/rtl/rtr
谁能帮我理解问题出在哪里?
Library ieee;
Use ieee.std_logic_1164.all;
Use work.New_Data_Pack.all;
Entity Shift_Reg IS
port(
Clk,Rst :IN std_logic;
Data :IN byte; -- std_logic_vector(7 downto 0);
Sel :IN t_shift; --sample, shl, shr, rotl, rotr
Q_out :OUT byte
);
End Shift_Reg;
ARCHITECTURE Shift_Reg_arc OF Shift_Reg IS
Signal ACC: byte:=(OTHERS=>'0'); -- std_logic_vector(7 downto 0);
BEGIN
PROCESS (Clk,Rst)
BEGIN
IF Rst='1' Then
Q_out<=(OTHERS=>'0');
ACC<=(OTHERS=>'0');
ELSIF Clk'EVENT and Clk='1' THEN
**CASE Sel is
WHEN sample=>
ACC<=Data;
WHEN shl=>
ACC<=ACC (6 downto 1) & '0'; -- & concatenation
WHEN shr=>
ACC<='0'&ACC(6 downto 1);
WHEN rotl=>
ACC<=ACC(6 downto 1)& ACC(7);
WHEN rotr=>
ACC<=ACC(0)&ACC(6 downto 1);**
END CASE;
END IF;
Q_out<=ACC;
End PROCESS;
End Shift_Reg_arc;
谢谢你 伊丹
【问题讨论】:
-
提供minimal reproducible example,这里的包 New_Data_Pack 显然提供了声明类型 t_shift、类型字节、样本、shl、shr、rotl 和 rotr 以及实际完整的错误文本。是否需要测试平台源也不清楚。
-
删除为强调而添加的双星号,为 new_data_pack 生成一个包声明,其中包含 t_shift 的枚举类型声明,其值显示在 SEL 声明注释中,以及一个子类型字节声明,其范围来自注释ACC 声明展示了对包声明、测试平台和实际错误消息的需求。分配给具有 7 个元素的波形的 8 个元素(例如
ACC(6 downto 1)& ACC(7))的 ACC 将导致仿真错误。参见 IEEE Std 1076-2008 14.7.3.4 Signal update para 2 b)。 -
Modelsim vsim 错误的形式为
# ** Fatal: (vsim-3420) Array lengths do not match. Left is 8 (7 downto 0). Right is 7 (0 to 6).在修复当前错误后,它们可能会按顺序出现在下一个错误中。第30行,第32行,第34行和第36行分别对应shl、shr、rotl和rotr(顺序是根据你后面问题中的testbench)。