Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 在fsm中使用循环语句和状态内的延迟_Vhdl_Fpga - Fatal编程技术网

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

Vhdl 在fsm中使用循环语句和状态内的延迟,vhdl,fpga,Vhdl,Fpga,我正在尝试为spartan-6 xc6slx45t编写vhdl代码,用于在单通道中生成多个频率。。即: 242.72khz,20个周期 23.6khz,1个周期 243.90khz,6个周期 然后是23.4 khz和386个周期 全部在单一输出。我在这里尝试了一个频率,遇到了一些代码延迟的问题 我在这里提到了具有不同循环数的每个状态。。但我需要的是例如:当状态S0=>242.72khz,有20个周期,然后在两个状态之间有一个延迟,下一个状态S1=>23.6khz,有一个周期,然后又有一个延迟

我正在尝试为spartan-6 xc6slx45t编写vhdl代码,用于在单通道中生成多个频率。。即:

  • 242.72khz,20个周期
  • 23.6khz,1个周期
  • 243.90khz,6个周期
  • 然后是23.4 khz和386个周期
全部在单一输出。我在这里尝试了一个频率,遇到了一些代码延迟的问题

我在这里提到了具有不同循环数的每个状态。。但我需要的是例如:当状态S0=>242.72khz,有20个周期,然后在两个状态之间有一个延迟,下一个状态S1=>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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体FSM_示例为
港口(
时钟,复位,en:标准逻辑中;
输出:输入标准逻辑
);
结束FSM_示例;
FSM_示例的架构是
类型状态_类型为(S0、S1、S2、S3);
信号当前状态、下一状态:状态类型;
信号计数:0到5000的整数范围;
信号i:0到400的整数范围;
信号cnt:整数范围0至400;
开始
状态存储器:进程(时钟、复位)
开始
如果(重置='1'),则

cur_state您正在尝试编写合成代码。然后不能使用
等待x ns
。FPGA不知道如何等待x纳秒。它不知道纳秒是什么。 但是,您的大部分代码似乎无法合成。您应该仔细阅读如何编写VHDL,以便在FPGA上进行合成

FPGA(通常)有一个时钟晶体输入,也有一个时钟晶体输入。从时钟输入的频率,您可以得出一个时间段内的时钟周期数。然后,您应该实现一个计数器并插入中间等待状态,其中fsm等待直到达到计数器的特定值


例如,如果时钟输入为100 MHz,则每个时钟脉冲的长度为10 ns==>10个时钟脉冲的长度为100 ns。如果您需要较小的时间步长,则需要使用PLL/DCM/MMCM/等来增加时钟频率。但您不能无限期地这样做,因为FPGA不支持非常高的时钟频率。

请缩进您的代码。