【问题标题】:VHDL CLOCK SEQUENCE Q3VHDL 时钟序列 Q3
【发布时间】:2016-10-26 23:20:07
【问题描述】:

我必须创建一个 VHDL 序列,它只需要一个时钟输入并输出一个 5 LED 序列see picture 我认为使用std_logic_vector然后我可以将每个向量输出连接到一个LED以创建这个序列是正确的还是我错过了解释std_logic_vector的使用?

我使用的代码是

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all; -- i have used this package as my CLK-CNT signal    counts in integer format rather than binary and i am performing an ADD sum of   the CLK_CNT


entity REG_LED is
 PORT(CLK:      IN  std_logic;              -- CLK input
     LEDS:      Out std_logic_vector (4 downto 0) ); -- initialise output
End REG_LED;

ARCHITECTURE behavioral OF REG_LED IS
SIGNAL CLK_CNT:     integer range 0 to 9:= 0; -- initailise comparison signal used for counting clock pulses.
 -- This signal will be used by the program to recognise where in the sequnce the program is and thus determine the next state required for the sequence.
BEGIN

    CLK_Process:    PROCESS (CLK)   -- begin the CLK_CNT Process
    BEGIN 

    if rising_edge(CLK) Then
        if CLK_CNT = 8 then 
            CLK_CNT <= 0; -- this resets the clock pulse count to 0
        else
            CLK_CNT <= CLK_CNT + 1 ; -- used to count each clock pulse upto the reset 
        End if;
-- this process has been kept seperate to the LED output process in order to isolate the event from the output process and limit the possiblities of errors         
    END IF;

    END PROCESS ;

    LED_PROCESS: Process (CLK_CNT) -- LED Outputs based on Temp count

    BEGIN -- begin the output sequence 

        Case CLK_CNT is 
-- i use a case statement to compare the value of the CLK_CNT signal and produce the required LEDS output 
-- this ensures the 
            When 0 =>
                LEDS <= "11111"; -- S0 when clock count is 0
            When 1 =>
                LEDS <= "00001"; -- S1 when clock count is 1
            When 2 =>       
                LEDS <= "00001"; -- S2 when clock count is 2
            When 3 =>
                LEDS <= "11111"; -- S3 when clock count is 3
            When 4 =>
                LEDS <= "00000"; -- S4 when clock count is 4
            When 5 =>
                LEDS <= "11111"; -- S5 when clock count is 5
            When 6 =>
                LEDS <= "00100"; -- S6 when clock count is 6
            When 7 =>
                LEDS <= "01010"; -- S7 when clock count is 7
            When 8 =>
                LEDS <= "10001"; -- S8 when clock count is 8 this is the final clock count state

            When others => 
                LEDS <= "11111"; -- Restart Sequence

        End Case;               

    End Process;
END behavioral; 

我已经模拟了波形,它产生了序列所需的 5 个输出,但是这个输出可以用于驱动 5 个不同的 LED,还是只是一个端口输出的 5 位字?我是 VHDL 新手,所以任何帮助都将不胜感激

【问题讨论】:

  • 如果将一个 LED 连接到端口的每一位,它将驱动 5 个 LED。

标签: vhdl clock led


【解决方案1】:

您的代码看起来不错,如果您的模拟表明它按照您的需要运行,那么您几乎可以开始了。

std_logic_vector 实际上是多条电线(总线)。您必须考虑它的物理含义,因为这是您对 FPGA 进行编程时真正发生的事情。所以是的,您可以将总线拆分(或拆分)成单独的线路。可以这样做:

signal LED_LINE_0 : std_logic;
signal LED_LINE_1 : std_logic;
LED_LINE_0 <= LEDS(0);
LED_LINE_1 <= LEDS(1);

...等等。这一次撕掉一根电线。您还可以通过一次拆除多条电线将总线拆分为更小的总线。例如

signal small_bus_1 : std_logic_vector(1 downto 0);
signal small_bus_2 : std_logic_vector(1 downto 0);
signal big_bus : std_logic_vector(3 downto 0);

small_bus_1 <= big_bus(3 downto 2);
small_bus_2 <= big_bus(1 downto 0);

然后,您可以写入约束文件(或使用 FPGA 品牌的 IDE 中的 GUI)来指定您希望将每个 std_logic 分配到 FPGA 上的哪个引脚(驱动 LED你需要)。

【讨论】:

  • 感谢您的反馈,这是针对我的学位课程的,因此我实际上不会为此编写 fpga,但我想展示正确的步骤。我将把代码放在哪里来拆分总线?在实体声明或模型的架构主体中?我的讲师在这门课上对我们帮助不大,只是给了我们一本书,并说基本上开始学习
  • 想想实体和架构的功能。 vhdl 文件指定了一个“盒子”,其中实体部分告诉您进出盒子的内容(以及盒子中使用的内容),而架构部分指定盒子内的架构(事物如何连接)。
猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多