【问题标题】:Counter inside FSM in VHDLVHDL中FSM内的计数器
【发布时间】:2015-07-29 21:26:45
【问题描述】:

我的有限状态机有一个小问题 最近用VHDL写的。我试图创建“智能”计数器 由频率为 2 Hz 的时钟触发。 该计数器内置在 FSM 的一种状态下,通过按下 DE2板上的按钮。

首先,整个系统处于空闲状态,如果我按下这个按钮,状态是 更改为 COUNTING 并且计数器开始递增,并且他的当前 数值显示在 LED 显示屏上。达到模值后,状态 COUNTING 回到 IDLE,计数器设置为零。

我的问题是计数器无法正常工作 - 计数 价值太大了。所以我试图用这个结构来解决它:如果 (clk_tick´event and clk_tick = 1) then.... ,有一些错误 合成: 错误 (10822):Citac_FSM.vhd(57) 处的 HDL 错误:无法实现 在这个时钟边沿注册分配

错误 (10821):Citac_FSM.vhd(62) 处的 HDL 错误:无法推断寄存器 “AUTOMAT:flg”,因为它的行为与任何支持的寄存器都不匹配 型号

请问,有人有办法解决它吗?什么是正确的方法 用两个(或更多)时钟源编写时钟触发 FSM?

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

ENTITY Counter_FSM IS
 GENERIC (
      REGSIZE  : integer := 8;    -- range of counter
      MODULO   : natural := 50  -- modulo value
        );  
 PORT (
       CLK      : IN STD_LOGIC;    -- puls 50 MHz
       CLK_tick : IN STD_LOGIC;   -- puls 2 Hz
       RESET    : IN STD_LOGIC;  -- reset
       READY    : OUT STD_LOGIC; -- counter is ready to start
       START_C  : IN STD_LOGIC;  -- start of counting
       DOUT         : OUT STD_LOGIC_VECTOR(REGSIZE - 1 downto 0)  --out
    );
 END Counter_FSM;


ARCHITECTURE Behavior OF Counter_FSM is

    type counterState is (IDLE, COUNTING);  -- states of FSM
    signal currCounterState : counterState;     -- current state
    signal nextCounterState : counterState; -- next state
    signal cnt : std_logic_vector(REGSIZE - 1 downto 0);  -- counter

    begin 

    UPDATE: process(RESET, CLK)
        begin
            if (RESET = '0') then
                currCounterState <= IDLE;
            elsif (CLK'event and CLK = '1') then
                currCounterState <= nextCounterState;
            end if;
    end process;


    COMBI: process (clk_tick, start_c, currCounterState)
        variable flg : std_logic := '0';
         begin
             if (clk_tick'event and clk_tick = '1') then
                 flg := '1';
            end if;

            case currCounterState is
                when IDLE => 
                    cnt <= (others => '0'); -- counter value = zero
                   READY <= '1';               -- we can start
                    if (start_c = '1') then -- if button is pushed
                    nextCounterState <= COUNTING;   -- go to COUNTING
                    end if;

                when COUNTING => 
                    READY <= '0';
                    if (flg = '1') then -- Was there impuls of 2 Hz?
                        cnt <= cnt + 1;         -- yes -> incrementing
                        flg := '0';
                        if (cnt = MODULO) then  -- if cnt = MODULO
                            cnt <= (others => '0'); -- then cnt = zero
                            nextCounterState <= IDLE;   
                        end if;
                    end if;

                when others => 
                    nextCounterState <= IDLE;
            end case;
        -- OUTPUT 
            douT <= cnt;    
        end process;

end Behavior; 

非常感谢。

米雷克

P.S.:很抱歉我的英语不太好。

【问题讨论】:

  • 第二个过程是时钟和非时钟逻辑的混合,这可能会混淆综合工具。将它们分开。并确保计数器计时:目前它没有计时。或者更好的是,将整个代码写成一个更简单、更小的单进程状态机。
  • clk_tick 是如何生成的?是对称时钟还是 1/50MHz 的 1 个脉冲,每 500ms 发生一次?

标签: process synchronization vhdl counter fsm


【解决方案1】:

首先你不应该使用 clk_tick 作为第二个时钟信号。 您应该做的是保存 clk_tick 的先前值,然后将 clk_tick 的当前值与先前值进行比较以检测冲洗边缘。根据 clk_tick 的生成方式,您可能需要将 clk_tick 同步到 CLK 的时钟域。

你可以这样写:

when COUNTING => 
    nextCounterState <= COUNTING; 
    READY <= '0';
    if (prev_clk_tick = '0' and clk_tick = '1') then 
        next_cnt <= cnt + 1;         -- yes -> incrementing
        if (cnt = MODULO) then
            next_cnt <= (others => '0');
            nextCounterState <= IDLE;   
        end if;
    end if;

我会留给你添加额外的寄存器。

【讨论】:

    【解决方案2】:

    我已经解决了我的问题:-)。我已将计数器移动到单独的进程中,然后将女巫信号附加到 FSM。所以,效果很好。

    通过读取按钮,我目前正在使用两个 D 触发器来同步它。

    我必须对 VHDL 编程风格进行观察 - 它与 C 语言等“普通”编程太不同了 :-D

    美好的一天!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 2011-08-25
      • 2013-11-30
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多