Есть еще несколько ошибок в вашей спецификации дизайна. Этот ответ пытается ответить на все проблемы в одном месте.
VHDL моделируется путем выполнения процессов в циклах моделирования. Каждый параллельный оператор может быть выражен как эквивалентный процесс оператор или комбинация операторов процесса и операторов блока.
Назначение сигнала представляет собой запрограммированную очередь выходных сигналов для заданного времени. Когда время не указано, это текущее время, и значение будет обновляться до выполнения процессов в следующем цикле моделирования, дельта-цикл, моделирование время развивается, когда нет оставшихся событий, запланированных для текущего времени моделирования .
Чтобы избежать путаницы при возникновении назначений сигналов, просмотрите их как отдельных процессов (независимо от того, выражаете ли вы их таким образом).
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity abc is
port (
clk: in std_logic; -- Note 1
d_in: in std_logic_vector(2 downto 0);
count: out std_logic_vector(2 downto 0)
);
end entity; -- Note 2
architecture foo of abc is
signal d_last: std_logic_vector(2 downto 0);
begin
DLAST: -- Note 3
process (clk)
begin
if rising_edge(clk) then -- Note 4
d_last <= d_in;
end if;
end process;
INC_COUNT:
process (clk)
variable cnt: unsigned(2 downto 0) := "000"; -- Note 5
begin
if rising_edge(clk) and
unsigned(d_last) > unsigned(d_in) + 2 then -- Mote 6,7
cnt := cnt + 1;
end if;
count <= std_logic_vector(cnt);
end process;
end architecture;
Примечания
- Отсутствует CLK от интерфейса порта
- Отсутствует конечное выражение для лица ABC.
- Концептуальный взгляд D_last регистрируется отдельно от счетчика счетчиков, чувствительного к clk.(Может быть объединены в одном процессе)
- функция rising_edge выражает clk'event и CLK = «1» ('событие и „=“ являются обе функции)
- Счетчик должен представлять собой двоичное значение для „+“ для получения двоичного результата
- «+» является более высоким приоритетом, чем «>», что более высокий приоритет, чем «и» (вам не нужны круглые скобки)
пакета numeric_std обеспечивают реляционные и добавление операторов для
знак типа и тип без знака, требующий преобразования типа для D_last
и D_in.
В качестве альтернативы использовать Synopsys пакет std_logic_unsigned который зависит от Synopsys пакета std_logic_arith и лечит std_logic_vector как беззнаковое. Это позволяет избежать преобразования типов, а позволяет объявлять типы массивов как тип std_logic_vector.
Переменная cnt
может упразднится, если порт count
должны были быть объявлены режим buffer
и при условии, значение по умолчанию:
count: buffer std_logic_vector(2 downto 0) :="000" -- Note 5
и
INC_COUNT:
process (clk)
begin
if rising_edge(clk) and
unsigned(d_last) > unsigned(d_in) + 2 then -- Note 6,7
count <= std_logic_vector(unsigned(count) + 1);
end if;
end process;
Вы не можете использовать Count
как режим out
, чтобы алгоритмически изменить его собственное значение. Возможность доступа к значению порта вывода режима предназначена для проверки и является функцией IEEE Std 1076-2008.
И теперь вы можете увидеть значение пакета std_logic_unsigned Synopsys, по крайней мере, избегая преобразований типов.
Кроме того, у меня есть еще один вопрос. Если d_in равно 0 для трех последовательных циклов clk, я хочу сбросить счет до 0. Как написать код для представления для 3 циклов clk?
Добавить другой сигнал трубопровода для D_in:
signal d_last: std_logic_vector(2 downto 0) := "000";
signal d_last1: std_logic_vector(2 downto 0) := "000";
Примечание они также имеют значения по умолчанию, которые FPGA синтез обычно будет чтить, это представлено состояние триггера в bistream изображение, используемое для программирования ПЛИС.
И изменить, как работает счетчик:
INC_COUNT:
process (clk)
begin
if rising_edge(clk) then
if d_in = "000" and d_last = "000" and d_last1 = "000" then
count <= "000";
elsif unsigned(d_last) > unsigned(d_in) + 2 then -- Note 6,7
count <= std_logic_vector(unsigned(count) + 1);
end if;
end if;
end process;
Три инкарнации примера все проанализировать, что они не были моделирование и синтез должны быть приемлемыми.
Если D_in, D_last - это 'numeric_std.unsigned' сигналы, то' D_last <= D_in; если D_in> D_last + 2, то ... 'внутри вашей часовой части будет хорошо. –
Извините, но где я объявляю D_last как? В переменной? – Morde
Я сказал, что это сигнал. Если вы объявите переменную D_last переменной, вам необходимо изменить порядок инструкций. Прочитайте разницу между назначением сигналов и переменных, чтобы понять, почему. Например, здесь: http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant/13956532#13956532 –