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您似乎在使用信号,就好像它们是变量一样。它们根本不一样。您好,我还尝试将计数更改为变量,但仍然没有结果。你能给我一个解决方案吗?谢谢你解决了我的问题。