【发布时间】: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