Vhdl std_逻辑矢量增量中的错误
我有一个项目,我正在经历一场灾难。我增加地址的一个部分有一个问题。我复制了我在下面的状态机中使用的逻辑。请指出我的错误,我的增量不稳定,没有按预期发生Vhdl std_逻辑矢量增量中的错误,vhdl,fpga,Vhdl,Fpga,我有一个项目,我正在经历一场灾难。我增加地址的一个部分有一个问题。我复制了我在下面的状态机中使用的逻辑。请指出我的错误,我的增量不稳定,没有按预期发生 library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.all; use IEEE.STD_LOGIC_UNSIGNED.all; entity test is port (clk : in std_logic; count : out s
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity test is
port (clk : in std_logic;
count : out std_logic_vector(9 downto 0);
reset : in std_logic);
end test;
architecture Behavioral of test is
signal c : std_logic_vector(9 downto 0) := (others => '0');
type state_type is (state1, state2, state3, state4);
signal gcd_cs, gcd_ns : state_type;
begin
count <= c;
process(clk, reset, c)
begin
if(clk'event and clk = '1') then
if(reset = '1')then
gcd_cs <= state1;
else
gcd_cs <= gcd_ns;
end if;
end if;
case gcd_cs is
when state1 =>
if(reset = '0') then
gcd_cs <= state2;
else
gcd_cs <= state1;
end if;
when state2 =>
if(c > "0000001111") then
gcd_cs <= state4;
else
gcd_cs <= state3;
end if;
when state3 =>
c <= c+'1';
gcd_ns <= state2;
when state4 =>
gcd_ns <= state4;
end case;
end process;
end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.all;
使用IEEE.STD_LOGIC_ARITH.all;
使用IEEE.STD_LOGIC_UNSIGNED.all;
实体测试是
端口(时钟:在标准逻辑中;
计数:输出标准逻辑向量(9到0);
复位:在标准逻辑中);
结束试验;
行为测试的体系结构是
信号c:std_逻辑_向量(9到0):=(其他=>'0');
类型state_类型为(state1、state2、state3、state4);
信号gcd_cs,gcd_ns:状态类型;
开始
计数你这里有很多问题
计数器/状态更新逻辑未与时钟同步(如果clk事件
,则在之外)
您使用的信号就像它们是变量一样
您的表达式对不在敏感度列表中的变量敏感
case语句有时输出当前状态,有时输出下一个状态
请注意有关锁存、敏感度列表等的编译器警告
将下一个状态计算更改为并发逻辑。该过程应该只更新作为寄存器的信号(基本上是D触发器)
大概是这样的:
PROCESS (clk,reset)
BEGIN
IF reset = '1' THEN
gcd_cs <= state1; -- for asynchronous reset
c <= (OTHERS => '0');
ELSIF RISING_EDGE(clk) THEN
IF reset = '1' THEN
gcd_cs <= state1; -- for synchronous reset
c <= (OTHERS => '0');
ELSE
IF gcd_cs = state3 THEN
c <= c + 1;
END IF;
gcd_cs <= gcd_ns;
END IF;
END IF;
END PROCESS;
gcd_ns <= state2 WHEN gcd_cs = state1 ELSE
state4 WHEN gcd_cs = state2 AND c > "0000001111" ELSE
state3 WHEN gcd_cs = state2 AND NOT (c > "0000001111") ELSE
state2 WHEN gcd_cs = state3 ELSE
state4 WHEN gcd_cs = state4;
过程(时钟、复位)
开始
如果重置='1',则
gcd_cs您似乎在使用信号,就好像它们是变量一样。它们根本不一样。您好,我还尝试将计数更改为变量,但仍然没有结果。你能给我一个解决方案吗?谢谢你解决了我的问题。