在VHDL Quartus II上右移(srl)出错

时间:2016-06-06 19:06:41

标签: vhdl bit-shift quartus

我正在尝试在Quartus II上制作一个8位顺序乘法器。我完成了所有模块的所有模拟,但其中一个模拟了VWF模拟。 sum_reg阻止它在非常小的时间间隔内进行无限移位。

enter image description here

在波形模拟的“深蓝色”部分,在o_DOUT上,当移位无限直到MSB进入LSB为止。下图显示了模拟的深蓝色部分发生的情况:

enter image description here

有人知道发生了什么事吗?

代码下方:

Sum寄存器(模拟出错的地方):

 library IEEE;
 use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;

 entity sum_register is 
 port (
     i_DIN   : in UNSIGNED(8 DOWNTO 0);
     i_LOAD  : in STD_LOGIC;
     i_CLEAR : in STD_LOGIC;
     i_SHIFT : in STD_LOGIC;
     o_DOUT  : buffer UNSIGNED(15 downto 0)
 );
 end sum_register;

 architecture arch_1 of sum_register is 
 begin 
     process(i_CLEAR,i_LOAD,i_SHIFT, i_DIN)
     begin
        IF (i_CLEAR = '1') THEN
            o_DOUT <= "0000000000000000";
        ELSIF (i_LOAD = '1') THEN
            o_DOUT(15 downto 7) <= i_DIN;
        ELSIF (i_SHIFT = '1') THEN
             o_DOUT <= o_DOUT SRL 1;
        END IF;
      end process;
end arch_1;

1 个答案:

答案 0 :(得分:1)

您需要在电路中使用时钟信号使其同步,您需要在您的实体中输入如下输入:

i_CLOCK : in STD_ULOGIC;

在此之后,你需要让你的过程对时钟敏感:

process(i_CLOCK)

您的架构将改为:

 architecture arch_1 of sum_register is
  SIGNAL r_DOUT : unsigned(15 downto 0);
 begin
     process(i_CLOCK)
     begin
     IF rising_edge(i_CLOCK) THEN
        IF (i_CLEAR = '1') THEN
            r_DOUT <= "0000000000000000";
        ELSIF (i_LOAD = '1') THEN
            r_DOUT(15 downto 8) <= i_DIN;
        ELSIF (i_SHIFT = '1') THEN
              r_DOUT <= r_DOUT SRL 1;
        END IF;
      END IF;
      end process;
      o_DOUT <= r_DOUT;
end arch_1;

使用这种架构,你需要一个无符号信号来输出你的输出o_DOUT,你可以再次将o_DOUT输出改为输出类型(不是缓冲区)。

注意:所有块的时钟信号必须相同!