2-битный счетчик со сбросом - проблема с неизменяющимся выходом

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

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;

Тестовый стенд обеспечивает переносимость. IEEE Std 1076-2008 14.2 Разработка иерархии проекта "Реализация может разрешать, но не требуется, чтобы объект проекта в корне иерархии проекта имел общие шаблоны и порты. Если реализация позволяет эти объекты интерфейса верхнего уровня , он может ограничивать их разрешенные формы (то есть разрешено ли им быть интерфейсными типами, подпрограммами, пакетами или объектами), а в случае интерфейсных объектов - их разрешенные типы и режимы в зависимости от реализации ». Потребность может быть основана на сложности или демонстрации проблем / исправлений.

user1155120 28.10.2018 19:31

Обратите внимание, как в ответе buraquete (сейчас) не упоминается о необходимости преобразования типа при назначении беззнакового временного значения для z. Средство тестирования позволит воспроизвести проблему и проверить решение.

user1155120 28.10.2018 19:33

Здесь, в stackoverflow, насколько быстрый или точный ответ может зависеть от того, насколько легко можно воспроизвести проблему и проверить решение, поощряя использование тестовой среды. Это также помогает будущим читателям столкнуться с такими же или похожими проблемами. Вы найдете более качественные вопросы и ответы полезными, так как рекомендации, как правило, набирают голоса и повышают репутацию.

user1155120 28.10.2018 20:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
204
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Кроме того, temp, вероятно, должен быть unsigned вместо std_logic_vector, поэтому оператор + определен, но я не уверен в этом.

mkrieger1 28.10.2018 18:38

Да, я имею в виду просто объявлять его как unsigned, а не каждый раз конвертировать.

mkrieger1 28.10.2018 18:39

И это потребует преобразования типа temp в std_logic_vector в назначении сигнала z: z <= std_logic_vector(temp);

user1155120 28.10.2018 19:14

Другие вопросы по теме