Это вопрос, на который я пытаюсь ответить.
Design and simulate a 2-bit counter which after a reset counts “00”, “01”,“10”, “11”, “00”, “01 ...” synchronously to the clock rising edges.
Мой код увеличивает вывод 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;
Обратите внимание, как в ответе buraquete (сейчас) не упоминается о необходимости преобразования типа при назначении беззнакового временного значения для z. Средство тестирования позволит воспроизвести проблему и проверить решение.
Здесь, в stackoverflow, насколько быстрый или точный ответ может зависеть от того, насколько легко можно воспроизвести проблему и проверить решение, поощряя использование тестовой среды. Это также помогает будущим читателям столкнуться с такими же или похожими проблемами. Вы найдете более качественные вопросы и ответы полезными, так как рекомендации, как правило, набирают голоса и повышают репутацию.
Проблема связана с тем, что вы назначили temp <= unsigned(a) + 1
для всех случаев, и поскольку a
постоянен с сигналом 00
, вы выводите только 01
, просто отбрасываете a
и используете temp <= unsigned(temp) + 1
с временной инициализацией 00
.
В качестве улучшения, как предлагает mkrieger1, было бы лучше определить temp
как unsigned
, поскольку вы хотите применить к нему +
. Также вам нужно будет либо снова преобразовать temp
обратно в вектор стандартной логики, пока вы присваиваете его значение обратно z
, либо также сделать z
unsigned
.
signal temp : unsigned(1 downto 0) := "00";
Кроме того, temp
, вероятно, должен быть unsigned
вместо std_logic_vector
, поэтому оператор +
определен, но я не уверен в этом.
Да, я имею в виду просто объявлять его как unsigned
, а не каждый раз конвертировать.
И это потребует преобразования типа temp в std_logic_vector в назначении сигнала z: z <= std_logic_vector(temp);
Тестовый стенд обеспечивает переносимость. IEEE Std 1076-2008 14.2 Разработка иерархии проекта "Реализация может разрешать, но не требуется, чтобы объект проекта в корне иерархии проекта имел общие шаблоны и порты. Если реализация позволяет эти объекты интерфейса верхнего уровня , он может ограничивать их разрешенные формы (то есть разрешено ли им быть интерфейсными типами, подпрограммами, пакетами или объектами), а в случае интерфейсных объектов - их разрешенные типы и режимы в зависимости от реализации ». Потребность может быть основана на сложности или демонстрации проблем / исправлений.