我需要生成16位的led模式......我的延迟无法生成所需的模式..... 我的for循环也没有正常工作延迟 只是我需要帮助生成模式使用任何不。有点使用延迟...... ????
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counters_1 is
port(CLK : in std_logic;
Q : out std_logic_vector(2 downto 0);
led_out : out std_logic_vector(15 downto 0));
end counters_1;
architecture archi of counters_1 is
signal tmp: std_logic_vector(2 downto 0) := "000";
begin
process (CLK)
begin
-- variable i :Integer :=0;
-- variable j :Integer :=0;
if (CLK'event and CLK='1') then
tmp <= tmp + 1;
if( tmp="100") then
tmp <="000";
end if;
end if;
if(tmp="00") then
loop1: for i in 0 to 10 loop
led_out <="0000000000000001" ;
led_out <="0000000000000010" ;
end loop;
end if;
if(tmp="01") then
loop2: for i in 0 to 10 loop
led_out <="1111111100000000";
led_out <="000000001111111" after 500 ms;
end loop;
end if;
if(tmp="10") then
loop3: for i in 0 to 10 loop
led_out <="0011000000000101";
led_out <="0000000111000110" after 500 ms;
end loop;
end if;
if(tmp="11") then
loop4: for i in 0 to 10 loop
led_out <="0000001100000111" after 500 ms;
led_out <="0000000000001000" after 500 ms;
led_out <="0001001000001000" after 500 ms;
led_out <="0000000000001000" after 500 ms;
led_out <="0100001100000111" after 500 ms;
led_out <="0000000000001000" after 500 ms;
led_out <="0010001000001000" after 500 ms;
led_out <="1000000000001000" after 500 ms;
led_out <="0001001100000111" after 500 ms;
led_out <="0000000000001000" after 500 ms;
led_out <="0011001000001000" after 500 ms;
led_out <="0000000000001000" after 500 ms;
led_out <="0100111100000111" after 500 ms;
led_out <="0000011110001000" after 500 ms;
led_out <="0010001000001000" after 500 ms;
led_out <="1000001110001000" after 500 ms;
end loop;
end if;
end process;
Q <= tmp;
end archi;
答案 0 :(得分:0)
您的代码看起来像一个测试平台,所以我假设这就是您想要的。你的问题围绕着理解“之后”。 “After”用于安排信号延迟。但是,它永远不会停止这个过程。信号值被安排,过程继续进行而没有任何时间过去。
另一方面,你想要发生的是让这个过程停止。您需要使用wait来使进程停止。
将它用于loop4中的代码:
loop4: for i in 0 to 10 loop
wait for 500 ms ;
led_out <="0000001100000111" ;
wait for 500 ms ;
led_out <="0000000000001000" ;
wait for 500 ms ;
led_out <="0001001000001000" ;
...
如果这是一个测试平台,您将不需要基于Clk运行您的流程,相反,这些类型的流程基于“等待”唤醒运行。
你也可能不需要tmp。如果您确定需要tmp,请将其设为2位(这可以,因为计数器将翻转)或者您的比较需要使用切片,如下所示。另外,阅读信号和变量更新之间的差异。对于测试平台,你肯定想在这里使用一个变量(此外,你的代码是不正确的,除非你把它变成一个变量)。
if(tmp(1 downto 0) ="00") then
如果您正在使用RTL代码,我将创建一个单独的帖子。
答案 1 :(得分:0)
如果您正在进行RTL设计,则需要更多地考虑问题中的硬件。画画。编码图片。
要帮助完成此过程,您需要考虑以下事项:
一旦您更多地考虑了问题,就会提出更多问题。