【问题标题】:VHDL clocked LED Sequence Part 2VHDL 时钟 LED 序列第 2 部分
【发布时间】:2016-10-19 11:59:59
【问题描述】:

我必须编写一个程序,在一个序列的每个时钟脉冲处改变一个 LED 序列。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;


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

ARCHITECTURE behavioral OF REG_LED IS
 SIGNAL Temp:   std_logic_vector (3 downto 0):= "0000"; -- initailise comparison signal
BEGIN

CLK_Process:    PROCESS (CLK)   -- begin 
BEGIN 

if rising_edge(CLK) Then
       Temp <= Temp + 1 ;   
END IF;

iF TEMP > "1000" THEN
    Temp <= "XXXX";
End IF;

END PROCESS ;

LED_PROCESS: Process (Temp) --

BEGIN

    Case Temp is

        When "0000" =>
            LEDS <= "11111";
        When "0001" =>
            LEDS <= "00001";
        When "0010" =>
            LEDS <= "00001";
        When "0011" =>
            LEDS <= "11111";
        When "0100" =>
            LEDS <= "00000";
        When "0101" =>
            LEDS <= "11111";
        When "0110" =>
            LEDS <= "00100";
        When "0111" =>
            LEDS <= "01010";
        When "1000" =>
            LEDS <= "10001";
        When others => 
            LEDS <= "10001";
    End Case;               

End Process;
END behavioral; 

这看起来更像您所期望的吗?它模拟但我无法测试代码的合成,因为我现在有硬件来测试它。或者如果有办法,因为我是 VHDL 新手,我还没有弄清楚如何测试它。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;


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

ARCHITECTURE behavioral OF REG_LED IS
SIGNAL Temp:    integer range 0 to 9:= 0; -- initailise comparison signal
BEGIN

    CLK_Process:    PROCESS (CLK)   -- begin 
    BEGIN 

    if rising_edge(CLK) Then
        if Temp = 8 then
            Temp <= 0; -- State Count Reset
        else
            Temp <= Temp + 1 ; -- State Count
        End if;

    END IF;

    END PROCESS ;

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

    BEGIN

        Case Temp is

            When 0 =>
                LEDS <= "11111"; -- S0
            When 1 =>
                LEDS <= "00001"; -- S1
            When 2 =>
                LEDS <= "00001"; -- S2
            When 3 =>
                LEDS <= "11111"; -- S3
            When 4 =>
                LEDS <= "00000"; -- S4
            When 5 =>
                LEDS <= "11111"; -- S5
            When 6 =>
                LEDS <= "00100"; -- S6
            When 7 =>
                LEDS <= "01010"; -- S7
            When 8 =>
                LEDS <= "10001"; -- S8

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

    End Process;

【问题讨论】:

  • Temp &lt;= "XXXX"; 部分的预期用途是什么?
  • 它原本是为了停止序列,但我已经重新设计,因为我重新阅读了我的原始作业,并且规格与我的想法不同

标签: vhdl clock led


【解决方案1】:

这段代码还不错,但是有一点需要注意:

你没有这两个包:

use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

其实你的代码只是使用了std_logic_unsigned包;它根本没有使用numeric_std 包。 std_logic_unsigned 包为 std_logic_vector 类型定义了各种算术运算符。这些假设 unsigned 算术,因此得名。您正在这一行中使用 std_logic_unsigned 包:

Temp <= Temp + 1 ;   

对于新代码,您应该真正使用numeric_std 包,而不是std_logic_unsigned 包。为此,您必须将Temp 的类型更改为unsignedunsigned 类型只是 std_logic 的数组,就像 std_logic_vector 一样,但顾名思义,它是用来实现无符号运算的。

所以,我愿意

i) 删除这一行:

use ieee.std_logic_unsigned.all;

ii) 改变这一行:

SIGNAL Temp:   std_logic_vector (3 downto 0):= "0000"; -- initailise comparison signal

到:

SIGNAL Temp:   unsigned (3 downto 0):= "0000"; -- initailise comparison signal

iii)(正如可怕的 Jeff 指出的那样)想想 Temp"XXXX" 的分配在做什么。您不希望您的柜台环绕"0000" 吗?如果您希望它在"1000" 冻结,您将需要一些不同的代码。在任何情况下,永远不要将任何代码放在时钟rising_edge 的测试之外。 (它不符合我给你看的模板。你希望这段代码产生什么逻辑?)

【讨论】:

  • 这是我昨晚修改之前的代码,我意识到在模拟过程中仍然存在一些错误,所以把它改成了这个
  • 我误读了我的作业,我认为它要求序列在第 8 个时钟脉冲处完成,但实际上它确实启动了一个连续序列来修改代码以适应规范
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多