VHDL Счетчик импульсов за одну секунду и за одну минуту

Я нахожусь в самом начале изучения VHDL и не уверен, как действовать дальше.

Я не уверен, правильно ли я это делаю или что-то не так, потому что мое понимание темы пока очень частичное. Я пытаюсь выучить.

МОЯ ПРОБЛЕМА:

Я пытаюсь создать счетчик импульсов в VHDL с помощью:

  • 1-битный вход Pulse_In;
  • 1-битный вход синхронизации, который принимает тактовый сигнал частотой 1000 Гц;
  • два выхода Pulse sec, Pulse _min, каждый по 16 бит.

Мне нужно подсчитать количество импульсов (считая нарастающие фронты), которые появляются на входе Pulse_In. На выходе Pulse_sec у меня будет количество импульсов за одну секунду, а на Pulse_min — количество импульсов за последнюю минуту. И вывод должен обновляться в конце каждой секунды.

МОЯ ПОПЫТКА (МОЖЕТ ОШИБАТЬСЯ, НЕ ЗНАЮ):

-- Часы --

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity clock_gen is
  port(clock: out bit);
end entity

architecture behav of clock_gen is
  constant frequency: integer:= 1000;
  constant period: time:= 1000ms/frequency;
begin 
 clock: process
 begin 
   clock <= ‘0’,’1’ after period/2;
   wait for period;
 end process clock;
end architecture;

-- прилавок --

entity PulseCounter is
  port(Pulse_in: in bit;
       Clock: in bit;
       Pulse_sec, Pulse_min: out integer range 15 to 0);
end entity

architecture my_counter of PulseCounter is
  begin
    process
      var seconds: integer:=0;
    begin
      if (Clock='1' and Clock'last_value='0') then
        if (Pulse_in='1' and seconds/=59) then
           Pulse_sec = Pulse_sec + 1;
           Pulse_min = Pulse_min + Pulse_sec;
           seconds = seconds + 1;
        end if;
      end if;
      wait on Clock;
    end process;
end architecture;

                  

-- Я не уверен, что сущность верна, учитывая приведенные выше данные --

-- Я не знаю, правильный ли мой процесс --

Какой у Вас вопрос?

mkrieger1 18.09.2023 11:12

Я предоставил свой код, какие-нибудь полезные советы?

Sabaudian 18.09.2023 12:29

Я до сих пор не уверен, в чем вопрос. Если это «будет ли это работать»? мой ответ: вы написали тестовый стенд? вы смоделировали свой код? он ведет себя так, как ожидалось? Это все, что вы можете проверить сами.

Tricky 18.09.2023 12:49

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

Sabaudian 18.09.2023 13:13

Да, есть очевидные ошибки, и вы могли найти их сами, пытаясь скомпилировать свой код. А именно, я считаю, что ‘0’,’1’ — это синтаксическая ошибка.

mkrieger1 18.09.2023 14:54

Что произойдет в вашем процессе, если секунды равны 59? Это то, что должно произойти?

mkrieger1 18.09.2023 14:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
7
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

При написании VHDL у вас есть сам объект, который вы хотите написать, и «тестовый стенд» для этого объекта. Testbench — это еще один объект VHDL, единственная цель которого — выступать в качестве тестовой среды для объекта, который вы хотите написать. Без тестового стенда вы в конечном итоге задаете подобные вопросы по SO, потому что у вас нет возможности проверить себя, делает ли ваш проект то, что он должен делать.

Часть вашей попытки, которая генерирует тактовый сигнал, принадлежит объекту тестового стенда, поскольку в реальном примере тактовый сигнал подается некоторым генератором в FPGA/ASIC, где реализован ваш проект VHDL. В объекте тестового стенда вы только моделируете существование этих часов. Такие утверждения, как «период: время:= 1000 мс/частота»; и «часы <= ‘0’,’1’ после периода/2;» не будет синтезироваться, поскольку больше не существует понятия «1000 мс», если вы захотите реализовать это в FPGA/ASIC. (синтезируемый VHDL — это подмножество легального VHDL. В тестовых стендах вы можете использовать все, что является легальным VHDL, поскольку оно никогда не будет реализовано на устройстве. Для тестируемого объекта вам следует придерживаться синтезируемого VHDL)

Вы должны начать с двух отдельных файлов. Тестовый стенд и ваш счетчик импульсов

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity my_counter_tb is
end entity;

architecture rtl of my_counter_tb is
  constant frequency: integer:= 1000;
  constant period: time:= 1000 ms/frequency;
  signal clock : std_logic := '0';
  signal Pulse_in : std_logic;
  signal Pulse_sec, Pulse_min : std_logic_vector(15 downto 0);
begin

 label_that_is_not_clock_since_clock_is_already_a_signal: process
 begin 
   clock <= '0','1' after period/2;
   wait for period;
 end process;

pulsecounter_inst: entity work.PulseCounter
  port map (
    Pulse_in  => Pulse_in,
    Clock     => Clock,
    Pulse_sec => Pulse_sec,
    Pulse_min => Pulse_min
  );

-- write a process here that does something with Pulse_in 

end architecture;

и

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity PulseCounter is
  port(Pulse_in: in std_logic;
       Clock: in bit;
       Pulse_sec, Pulse_min: out integer range 15 to 0);
end entity;

architecture rtl of PulseCounter is
  begin

  -- your counter implementation

end architecture;

Затем вы подключаете эти два файла к какому-нибудь симулятору VHDL и можете самостоятельно протестировать поведение вашего VHDL-проекта, выяснить, где находятся синтаксические ошибки и так далее. (Например, Modelsim, ghdl, Questa, Aldec, edaplayground,... все, что используется в вашем классе)

Несколько очевидных проблем с вашим кодом выше:

  • вставьте пробел между 1000 и «мс»
  • Диапазон целых чисел от 15 до 0 означает, что вы можете иметь целые числа макс. 15. На самом деле вам нужен сигнал размером 16 бит (std_logic_vector(15 до 0))
  • ваш процесс должен иметь часы в списке чувствительности, и я бы выбрал if (rising_edge(lock)) then .. потом
  • вы не можете читать из Pulse_sec, так как это выход (Pulse_sec = Pulse_sec + 1; не будет работать)
  • избегайте переменных. Нет никакой причины, по которой «секунды» должны быть здесь переменной. Как правило, новички не используют переменные, если вы точно не знаете, зачем они вам нужны.

Чтение портов out стало возможным с VHDL 2008. Следовательно, pulse_sec <= pulse_sec + 1; совершенно законно.

Tricky 18.09.2023 15:32

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