使用Vhdl生成模式。。。?

使用Vhdl生成模式。。。?,vhdl,Vhdl,我需要生成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

我需要生成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;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_unsigned.all;
实体计数器_1为
端口(时钟:在标准逻辑中;
Q:输出标准逻辑向量(2到0);
led_out:输出标准逻辑_向量(15向下至0);
末端计数器1;
计数器_1的架构archi为
信号tmp:std_逻辑_向量(2到0):=“000”;
开始
过程(CLK)
开始
--变量i:整数:=0;
--变量j:整数:=0;
如果(CLK'事件和CLK='1'),则

tmp您的代码看起来像一个测试台,所以我假设这就是您想要的。你的问题围绕着理解“之后”。“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" ;
   ... 

如果你在做RTL代码,我将单独发表一篇文章。

如果你在做RTL设计,你需要更多地考虑问题中的硬件。画画。对图片进行编码

为了帮助这个过程,你需要考虑以下内容:

  • 时钟走得有多快
  • 你打算如何用你的时钟创建一个500毫秒的指示器?(提示:计数器+解码器)
  • 在Clk上切换tmp太快
  • 要获得loop4中的序列,需要一个状态机或另一个计数器和解码器

一旦你仔细考虑了你的问题,就要问更多的问题。

这需要合成吗?像这样的延迟是不可合成的。最好是基于计数器创建状态机。
if(tmp(1 downto 0) ="00") then