2016-10-19 1 views
0

Мне нужно написать программу, которая изменяет последовательность светодиодов на каждом тактовом импульсе для одной последовательности.VHDL синхронизированная последовательность светодиодов Часть 2

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; 
+0

Какова цель назначения 'Temp <=" XXXX ";' part? –

+0

было предназначено остановить последовательность, но с тех пор меня перепроектировали, так как я перечитал свое первоначальное задание, и спецификации отличаются от того, что я думал –

ответ

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 на unsigned. Тип unsigned представляет собой массив из std_logic, например std_logic_vector, но, как следует из его названия, он используется для реализации арифметики без знака.

Так что, я бы

я) удалить эту строку:

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) (как указывает Страшный Джефф), подумайте о том, что a ssignment от Temp до "XXXX" делает. Разве вы не хотите, чтобы ваш счетчик обернулся до "0000"? Если, если вы хотите, чтобы он замерзал на "1000", вам понадобится другой код. В любом случае никогда не не вводит код вне теста для часов rising_edge. (Это не соответствует шаблону, который я вам показал. Какую логику вы ожидаете получить от этого кода?)

+0

это был код, прежде чем я изменил его еще больше прошлой ночью. Я понял, что все еще есть несколько ошибок во время симуляции, поэтому изменили его на этот –

+0

код, размещенный ниже оригинала в вопросе –

+0

. Я неправильно понял свое назначение. Я думал, что он попросил, чтобы последовательность завершилась на 8-м тактовом импульсе, но на самом деле начала непрерывную последовательность код для соответствия спецификациям –

Смежные вопросы