VHDL移位寄存器在使用信号和变量时编程不同的结果

时间:2014-11-06 18:29:41

标签: vhdl

所以我一直在使用VHDL来创建一个寄存器,如果LOAD为'1',它会在输入X中加载,并以串行方式输出数据,基本上是串行输出寄存器中的并行。输入X是一个4位(3 downto 0)输入,当寄存器成功输出输入中的所有btis时,我想让程序做的是不断输出0。

当“count”被定义为信号时,它起作用,但是,当count被定义为变量时,无论load是否为1,输出都是常数0。我的代码如下所示:

entity qn14 is
  Port ( clk : in  STD_LOGIC;
         reset : in  STD_LOGIC;
         LOAD : in  STD_LOGIC;
         X : in  STD_LOGIC_VECTOR (3 downto 0);
         output : out  STD_LOGIC);
end qn14;

architecture qn14_beh of qn14 is
  type states is ( IDLE , SHIFT );
  signal state : states;
  signal count: STD_LOGIC_VECTOR(1 downto 0);
begin

  process(clk , reset)
    variable temp: STD_LOGIC;
    variable data: STD_LOGIC_VECTOR(3 downto 0);
  begin
    if reset = '1' then
      state <= IDLE;
      count <= "00";
      output <= '0';
    elsif clk'event and clk = '1' then
      case state is
        when IDLE =>
          if LOAD = '1' then
            data := X;
            output <= '0';
            state <= SHIFT;
          elsif LOAD = '0' then
            output <= '0'; 
          end if;

        when SHIFT =>
          if LOAD ='1' then
            output <= '0';
          elsif LOAD = '0' then
            output <= data( conv_integer(count) );
            count <= count + 1;
            if (count >= 3) then
              state <= IDLE ;
            end if;
          end if;
      end case;
    end if;
  end process;

end qn14_beh;

希望就此寻求澄清。

谢谢。

1 个答案:

答案 0 :(得分:0)

这可能无法完全回答您的问题,但我将介绍我看到的几个问题。

elsif LOAD = '0' then可能只是else,除非你试图覆盖其他状态(X,U ......),但你仍然希望else覆盖那些。

count = 3count >= 3更清晰。 count是一个2位向量,因此它永远不会大于3.

虽然在0状态下声明LOAD时输出SHIFT,但您实际上并未加载新值。你有打算吗?

将计数更改为变量而不更改分配的位置将导致您的第一个X - &gt; output序列提前中止一个循环(在针对3)测试之前增加count。它会导致后续X - &gt; output序列{&#34; X(3)X(0)X(1)X(2)&#34;

从不使用变量temp。变量data和信号一样有用。您不需要此变量的变量属性。这也提出了为什么你尝试count作为变量的问题;除非您需要变量的即时分配,否则通常最好使用信号,因为信号在(大多数)模拟​​器中更容易查看,并且更难以出错。我希望你不是试图以count作为变量,但只是学会好奇为什么它不起作用。

你在模拟器中看过这个吗?你正确改变状态吗?您所有输入的所有位是否都强烈推动到定义的值('1''0')?

我没有看到任何可能导致您所描述的失败仅仅是将count更改为信号中的变量,但更改会导致上述不良行为。我最好的猜测是,你的症状源于你如何推动输入的问题。