Я новичок в программировании VHDL, и это мой первый проект - построить двоичный счетчик с возможностью как обычного, так и обратного счета. Мой план прост:Почему Quartus II распознает мою переменную как сигнал?
- Написать процесс делителя частоты для выборки необходимую частоту и тактовый выход это новые часы в виде битового сигнала
flag
. - Поместите «флаг» в список чувствительности другого процесса, подсчитайте его в соответствии с обычным/обратным состоянием - сохранено как
curr_s
в моем коде. - Третий процесс принимает входной сигнал
ctl
как чувствительный, затем переключаетcurr_s
и сбрасывает значениеcount
- который установлен для хранения отсчетов моего последнего процесса.
Теперь дело в том, однако, что Quartus II возвращает мне сообщение об ошибке:
Ошибка (10028): Не удается разрешить несколько постоянных драйверов для сети "сосчитать [31]" на bi_counter .vhd (35)
Error (10029): Постоянный водитель на bi_counter.vhd (46)
Error (10028): не удается разрешить несколько постоянных драйверов для сети "рассчитывать [30]" на bi_counter. vhd (35)
...
Ошибка (10028): Не удается разрешить несколько постоянных драйверов для сети "подсчитывать [14]" на bi_counter.vhd (35)
Я гугле немного бит, и есть такие правила, как не разрешено изменять значение signal
в нескольких процессах, но проблема в том, что я объявляю свой count
как общую переменную вместо сигнала - которая не должна сталкиваться с такой ошибкой. И я намеревался сделать это, потому что хочу использовать count
в качестве переменной для обмена информацией между процессами - это имеет смысл, а если нет, есть ли способ обхода?
Вот мой код:
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.numeric_std.all;
--
entity bi_counter is
port(
master_clk, ctl, rst: in std_logic;
q: out std_logic_vector(7 downto 0)
);
end bi_counter;
--
architecture behv of bi_counter is
shared variable curr_s: std_logic := '0'; -- 0 for incremental, 1 for reverse counting
shared variable count: integer := -1;
shared variable master_count: natural := 0;
signal flag: std_logic;
begin
p_freq_div: process(master_clk, rst)
begin
if rst = '0' then
master_count := 0;
elsif master_clk'event and master_clk='1' then
master_count := master_count + 1;
if master_count = 24000000 then
flag <= not flag;
master_count := 0;
end if;
end if;
end process p_freq_div;
p_count: process(flag)
begin
if curr_s = '1' then
count := count + 1;
q <= conv_std_logic_vector(count, 8);
else
count := count - 1;
q <= conv_std_logic_vector(count, 8);
end if;
end process p_count;
p_switch: process(ctl)
begin
if ctl'event and ctl='1' then
curr_s := not curr_s;
if curr_s = '0' then
count := 0;
else
count := 1000;
end if;
end if;
end process p_switch;
end behv;
Вот простое правило для VHDL: никогда не требуется два процесса, изменяющих один и тот же сигнал. Выясните другой способ сделать это. Не используйте общие переменные вообще, используйте сигналы. – Russell
@ Russell Можете ли вы объяснить, почему общие переменные не являются хорошим вариантом? Я имею в виду, теперь я думаю, что я знаю, почему одновременное назначение из разных процессов запрещено, но почему вообще использование общих переменных вообще не рекомендуется - тогда почему оно существует? Большое спасибо! –
@DavidKoontz Спасибо, Дэвид, я думаю, что получаю большую часть того, что ты говоришь. Однако, как настоящий новичок в VHDL, я задаюсь вопросом, что означает «быть невозможным когда-либо предоставлять эксклюзивный доступ к общей переменной, как указано в предыдущем пункте b»). Почему это эксклюзивный доступ к общей переменной в моем коде? Thank u –