Я нахожусь в самом начале изучения VHDL и не уверен, как действовать дальше.
Я не уверен, правильно ли я это делаю или что-то не так, потому что мое понимание темы пока очень частичное. Я пытаюсь выучить.
МОЯ ПРОБЛЕМА:
Я пытаюсь создать счетчик импульсов в VHDL с помощью:
Мне нужно подсчитать количество импульсов (считая нарастающие фронты), которые появляются на входе 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;
-- Я не уверен, что сущность верна, учитывая приведенные выше данные --
-- Я не знаю, правильный ли мой процесс --
Я предоставил свой код, какие-нибудь полезные советы?
Я до сих пор не уверен, в чем вопрос. Если это «будет ли это работать»? мой ответ: вы написали тестовый стенд? вы смоделировали свой код? он ведет себя так, как ожидалось? Это все, что вы можете проверить сами.
Я просто прошу мнение о моем коде на основе предоставленного текста. Разумно ли то, что я предложил? Есть явные ошибки? Я нахожусь в начале процесса обучения, мне нужен экспертный взгляд на мою работу, давайте скажем так
Да, есть очевидные ошибки, и вы могли найти их сами, пытаясь скомпилировать свой код. А именно, я считаю, что ‘0’,’1’ — это синтаксическая ошибка.
Что произойдет в вашем процессе, если секунды равны 59? Это то, что должно произойти?





При написании 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,... все, что используется в вашем классе)
Несколько очевидных проблем с вашим кодом выше:
Чтение портов out стало возможным с VHDL 2008. Следовательно, pulse_sec <= pulse_sec + 1; совершенно законно.
Какой у Вас вопрос?