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

VHDL移位寄存器程序在使用信号和变量时会产生不同的结果,vhdl,Vhdl,所以我一直在用VHDL做一个寄存器,如果加载为“1”,它将加载到输入X中,并以串行方式输出数据,基本上是一个并行输入串行输出寄存器。输入X是一个4位(3到0)输入,我想让程序在寄存器成功输出输入中的所有BTI时持续输出0 当“count”被定义为信号时,它工作。然而,当count被定义为变量时,输出为常量0,无论负载是否为“1”。我的代码如下所示: entity qn14 is Port ( clk : in STD_LOGIC; reset : in STD_LOGI

所以我一直在用VHDL做一个寄存器,如果加载为“1”,它将加载到输入X中,并以串行方式输出数据,基本上是一个并行输入串行输出寄存器。输入X是一个4位(3到0)输入,我想让程序在寄存器成功输出输入中的所有BTI时持续输出0

当“count”被定义为信号时,它工作。然而,当count被定义为变量时,输出为常量0,无论负载是否为“1”。我的代码如下所示:

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;
实体qn14是
端口(时钟:在标准逻辑中;
复位:在标准逻辑中;
负载:在标准逻辑中;
X:标准逻辑向量(3到0);
输出:输出标准(U逻辑);
结束qn14;
qn14的架构qn14_beh是
类型状态为(怠速、换档);
信号状态:状态;
信号计数:标准逻辑向量(1到0);
开始
过程(时钟、复位)
可变温度:标准逻辑;
变量数据:标准逻辑向量(3到0);
开始
如果重置='1',则

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

elsif LOAD='0',则
可以是
else
,除非您试图覆盖其他状态(X,U…),但您仍然希望
else
覆盖这些状态

count=3
count>=3
更清晰
count
是一个2位向量,因此它不能大于3

虽然在
SHIFT
状态下断言
LOAD
时输出
0
,但实际上并没有加载新值。你打算这么做吗

将计数更改为变量而不更改分配的位置将导致第一个
X
->
输出序列提前中止一个周期(在对3进行测试之前增加
count
)。它将导致后续的
X
->
输出
序列“
X(3)
X(0)
X(1)
X(2)

从不使用变量
temp
。变量
data
的工作原理与信号一样。此用途不需要变量的属性。这也提出了一个问题,为什么您尝试将
count
作为变量;除非您需要即时分配变量,否则通常最好使用信号,因为信号更容易在(大多数)模拟器中查看,也更难出错。我希望您不要试图以
count
作为变量结束,而只是出于学术上的好奇,为什么它不起作用

你在模拟器里看过这个吗?你正确地改变状态了吗?所有输入的所有位是否都被强驱动到定义的值(
'1'
'0'

我看不到任何东西会导致您描述的故障,仅仅是将
count
更改为来自信号的变量,但是更改会导致上述不期望的行为。我的最佳猜测是,您的症状源于您如何驱动输入的问题。

当“计数”被定义为信号时,它起作用;然而,当计数被定义为变量时,无论负载是否为“1”,输出都是常量0。是的,但是你的问题是什么?您不会将
count
作为变量显示版本,并且您的代码不是变量。如果对变量赋值是立即的,则可以立即在表达式中计算新值。计划分配的信号值、预计输出波形和未来模拟周期中可用的值。