VHDL clocked LED Sequence Part 2

余生颓废 提交于 2019-12-08 09:37:02

问题


I have to write a program that changes an LED sequence at each clock pulse for one sequence.

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; 

Does this look more like what you would expect? it simulates but i cant test the synthesis of the code as i have now hardware to test it with. Or if there is a way because I'm new to VHDL I haven't worked out how to test it.

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;

回答1:


This code is pretty good, but here is one thing that needs attention:

You don't both these packages:

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

In fact, your code is only using the std_logic_unsigned package; it is not making use of the numeric_std package at all. The std_logic_unsigned package defines various arithmetic operators for the std_logic_vector type. These assume unsigned arithmetic, hence the name. You are making use of the std_logic_unsigned package in this line:

Temp <= Temp + 1 ;   

For new code, you should really use the numeric_std package, not the std_logic_unsigned package. To do this, you would have to change the type of Temp to unsigned. Type unsigned is just an array of std_logic like std_logic_vector, but as its name implies, it is used to implement unsigned arithmetic.

So, I would

i) delete this line:

use ieee.std_logic_unsigned.all;

ii) change this line:

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

to:

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

iii) (as Scary Jeff points out) think about what the assignment of Temp to "XXXX" is doing. Wouldn't you prefer your counter to wrap round to "0000"? If, if you want it to freeze at "1000", you'll need some different code. In any case, never put any code outside the test for the rising_edge of clock. (It doesn't comply with the template I showed you. What logic would you expect to be produced by this code?)



来源:https://stackoverflow.com/questions/40130851/vhdl-clocked-led-sequence-part-2

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!