Vhdl 在fsm中使用循环语句和状态内的延迟
我正在尝试为spartan-6 xc6slx45t编写vhdl代码,用于在单通道中生成多个频率。。即: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,有一个周期,然后又有一个延迟
- 242.72khz,20个周期
- 23.6khz,1个周期
- 243.90khz,6个周期
- 然后是23.4 khz和386个周期
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不支持非常高的时钟频率。请缩进您的代码。