在fsm中使用循环语句和状态内的延迟

时间:2017-04-16 07:56:11

标签: vhdl fpga

我正在尝试为spartan-6 xc6slx45t编写vhdl代码,以便在单通道中生成多个频率。这就是:

  • 242.72khz,20个周期
  • 23.6khz,1个周期
  • 243.90khz,6个周期
  • 然后23.4千赫兹,386个循环

全部为单输出。我刚刚尝试了一个频率,并且遇到了代码延迟的问题。

我在这里提到了具有不同周期数的每个状态..但我需要的是例如:当状态S0 => 242.72khz,具有20个周期然后在两个状态之间延迟,并且下一个状态S1 =&gt ; 23.6khz,一个周期,然后再一个延迟和下一个状态等等。)

这里我附上了我的代码。请帮我开发代码.. 提前谢谢......

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY FSM_Example IS
    PORT (
        clk, reset, en : IN std_logic;
        output : INOUT std_logic
    );
END FSM_Example;

ARCHITECTURE Behavioral OF FSM_Example IS
    TYPE state_type IS (S0, S1, S2, S3);
    SIGNAL cur_state, next_state : state_type;
    SIGNAL count : INTEGER RANGE 0 TO 5000;
    SIGNAL i : INTEGER RANGE 0 TO 400;
    SIGNAL cnt : INTEGER RANGE 0 TO 400;
BEGIN
    state_memory : PROCESS (clk, reset)
    BEGIN
        IF (reset = '1') THEN
            cur_state <= S0;
        ELSIF (clk = '1' AND clk'event) THEN
            IF (count = 4240 - 1) THEN
                count <= 0;
                cur_state <= next_state;
            ELSE
                count <= count + 1;
            END IF;
        END IF;
    END PROCESS state_memory;

    PROCESS (count)
    BEGIN
        IF (count < 1480) THEN
            output <= '1';
        ELSE
            output <= '0';
        END IF;
    END PROCESS count;

    PROCESS (en, cur_state)
    BEGIN
        CASE cur_state IS
            WHEN S0 => 
                loop0 : FOR i IN 0 TO 6 LOOP
                    EXIT loop0 WHEN i = 7;
                    cnt(i + 1) <= cnt(i) + 1;
                    IF (en = '1' AND en'event) THEN
                    ELSIF (i < 6) THEN
                        next_state <= S1;
                    ELSE
                        next_state <= S0;
                    END IF;
                END LOOP;
            WHEN S1 => 
                loop1 : FOR i IN 0 TO 1 LOOP
                    EXIT loop1 WHEN i = 2;
                    i <= i + 1;
                    IF (en = '1' AND en'event) THEN
                    ELSIF (i < 1) THEN
                        next_state <= S2;
                    ELSE
                        next_state <= S1;
                    END IF;
                END LOOP;
            WHEN S2 => 
                loop2 : FOR i IN 0 TO 20 LOOP
                    EXIT loop2 WHEN i = 21;
                    i <= i + 1;
                    IF (en = '1' AND en'event) THEN
                    ELSIF (i < 20) THEN
                        next_state <= S3;
                    ELSE
                        next_state <= S2;
                    END IF;
                END LOOP;
            WHEN S3 => 
                loop3 : FOR i IN 0 TO 386 LOOP
                    EXIT loop3 WHEN i = 387;
                    i <= i + 1;
                    IF (en = '1' AND en'event) THEN
                    ELSIF (i < 386) THEN
                        next_state <= S0;
                    ELSE
                        next_state <= S3;
                    END IF;
                END LOOP;
        END CASE;
    END PROCESS;
END Behavioral;

1 个答案:

答案 0 :(得分:0)

您正在尝试编写合成代码。然后你不能使用wait for x ns。 FPGA不知道如何等待x纳秒。它不知道纳秒是多少。 但是更多的代码似乎无法合成。您应该阅读如何在FPGA上编写用于合成的VHDL

FPGA的功能(通常)是时钟晶振输入。根据时钟输入的频率,您可以推导出一段时间内的时钟周期数。然后你应该实现一个计数器并插入中间等待状态,其中fsm等待直到达到计数器的特定值。

E.g。如果时钟输入是100MHz,则每个时钟脉冲长10ns ==&gt; 10个时钟脉冲长100 ns。如果您需要更小的时间步长,则需要使用PLL / DCM / MMCM /等来提高时钟频率。但是你无法无限期地这样做,因为FPGA不支持非常高的时钟频率。