2-битный счетчик со сбросом - неизменяемый выход - PullRequest
0 голосов
/ 28 октября 2018

Это вопрос, на который я пытаюсь ответить.

Разработайте и смоделируйте 2-битный счетчик, который после сброса подсчитывает «00», «01», «10», «11»,« 00 »,« 01 ... »синхронно с фронтами синхроимпульсов.

Мой код увеличивает выход z один раз, а затем останавливается на 01, когда я имитирую его в Vivado 2017.2!Что не так с моим кодом?Нужен ли мне испытательный стенд?Если да, то как мне узнать, что мне нужен тестовый стенд для имитации кода?

Вот мой код:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity twoc is
Port (reset : in std_logic;
ck : in std_logic;
 z : out std_logic_vector(1 downto 0));
end twoc;

architecture Behavioral of twoc is
signal a : std_logic_vector(1 downto 0):= "00";
signal temp : std_logic_vector(1 downto 0);
begin 
process(ck)

begin
if ck='1' and ck'event then
    if reset ='1' then
    temp<="00";
    else
    temp <=std_logic_vector(unsigned(a)+1);
    end if;
end if;
end process;
z <= temp;
end Behavioral;

1 Ответ

0 голосов
/ 28 октября 2018

Проблема связана с тем, что вы присваиваете temp <= unsigned(a) + 1 для всех случаев, и поскольку a является постоянным с сигналом 00, вы выводите только 01, просто отбрасываете a и используете temp <= unsigned(temp) + 1 с температуройинициализирован до 00.

В качестве улучшения, как предполагает mkrieger1 , было бы лучше определить temp как unsigned, поскольку вы хотите применить +в теме.Также вам нужно будет либо снова преобразовать temp обратно в логический вектор std, когда вы присваиваете его значение обратно z, либо также сделать z unsigned.

signal temp : unsigned(1 downto 0) := "00";
...