所以我一直在使用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;
希望就此寻求澄清。
谢谢。
答案 0 :(得分:0)
这可能无法完全回答您的问题,但我将介绍我看到的几个问题。
elsif LOAD = '0' then
可能只是else
,除非你试图覆盖其他状态(X,U ......),但你仍然希望else
覆盖那些。
count = 3
比count >= 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
更改为信号中的变量,但更改会导致上述不良行为。我最好的猜测是,你的症状源于你如何推动输入的问题。