使用Vhdl生成模式......?

时间:2014-03-31 06:13:07

标签: 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 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;

2 个答案:

答案 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设计,则需要更多地考虑问题中的硬件。画画。编码图片。

要帮助完成此过程,您需要考虑以下事项:

  • 时钟运行速度有多快?
  • 您打算如何从时钟创建一个500毫秒的指示器? (提示:计数器+解码器)
  • 在Clk上切换tmp太快了。
  • 要获取loop4中的序列,您将需要一个状态机或其他计数器和解码器

一旦您更多地考虑了问题,就会提出更多问题。