我正在尝试为spartan-6 xc6slx45t编写vhdl代码,以便在单通道中生成多个频率。这就是:
全部为单输出。我刚刚尝试了一个频率,并且遇到了代码延迟的问题。
我在这里提到了具有不同周期数的每个状态..但我需要的是例如:当状态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;
答案 0 :(得分:0)
您正在尝试编写合成代码。然后你不能使用wait for x ns
。 FPGA不知道如何等待x纳秒。它不知道纳秒是多少。
但是更多的代码似乎无法合成。您应该阅读如何在FPGA上编写用于合成的VHDL
FPGA的功能(通常)是时钟晶振输入。根据时钟输入的频率,您可以推导出一段时间内的时钟周期数。然后你应该实现一个计数器并插入中间等待状态,其中fsm等待直到达到计数器的特定值。
E.g。如果时钟输入是100MHz,则每个时钟脉冲长10ns ==&gt; 10个时钟脉冲长100 ns。如果您需要更小的时间步长,则需要使用PLL / DCM / MMCM /等来提高时钟频率。但是你无法无限期地这样做,因为FPGA不支持非常高的时钟频率。