Сообщение от
Viktor2312
Тогда продолжу, может правильно будет
Правильно.
Только в таком "голом виде" это нельзя вставлять в проект, нужно оформить как процесс:
Код:
process(cnt_one) -- заголовок, напоминает function в С. В скобках - сигнал, от которого
зависит работа процесса (список чувствительности)
begin
if (cnt_one=118) then -- проверяем равен ли cnt_one 118-ти
a <= x0; -- если условие верно (true)
else
a <= x1; -- если условие не верно (false)
end if;
end process;
---------- Post added at 08:23 ---------- Previous post was at 08:14 ----------
А вот еще один вариант подобного рода, но уже без оператора if.
Здесь ничего не буду пока комментить, просто смотри, что там написано и понимание придет само, это просто
Код:
process(cnt_one)
begin
case (cnt_one) is
when (118) => a <= x0;
when (65) => a <= x2;
when others => a <= x1; -- здесь others означает "любое другое значение, кроме указанных"
end case;
end process;
---------- Post added at 08:36 ---------- Previous post was at 08:23 ----------
Ну и третий вариант до кучи.
Эта конструкция уже не требует заключения ее в процесс, она является процессом сама по себе:
Код:
a <= x0 when (cnt_one=118) else x1;
просто, как три рубля
Эту конструкцию можно расширить, подобно предыдущему примеру:
Код:
a <= x0 when (cnt_one=118) else
x2 when (cnt_one=65) else
x1;
---------- Post added at 08:55 ---------- Previous post was at 08:36 ----------
Ну и давай тогда напишем код для реального случая. Например, опишем знаменитый мультиплексор 555КП11. Он имеет два переключаемых канала по 4 разряда, вход переключения каналов, вход разрешения выдачи сигналов.
Заголовок проекта пропускаю, начнем:
Код:
A : in std_logic_vector(3 downto 0); --вход А, четырехразрядный
B : in std_logic_vector(3 downto 0); --вход В, четырехразрядный
Q : out std_logic_vector(3 downto 0); --выход Q, четырехразрядный
S : in std_logic; --вход управления переключением
OE_N : in std_logic; --вход управления выдачи информации
Q <= "ZZZZ" when (OE_N='1') else --если вход OE_N равен 1, то выходы в Z-состоянии
A when (S='0') else B; --подключаем на выход канал А, если S равно нулю, иначе - канал В
---------- Post added at 08:59 ---------- Previous post was at 08:55 ----------
Для тренировки напиши реальный проект и скомпилируй его.
А потом замени эту конструкцию when...else на вариант с if....then.
---------- Post added at 09:09 ---------- Previous post was at 08:59 ----------
Наверное, стОит добавить еще пару разъяснений.
Если мы используем какой-то одноразрядный сигнал (типа S или OE_N в предыдущем примере), то его состояние определять просто цифрой типа 0 или 1 нельзя. Компилятор будет ругаться. Квартус, по крайней мере. Поэтому состояние сигнала описывается цифрами 0 или 1 в одинарных кавычках типа '0' или '1'.
Если же сигнал не одноразрядный, то там уже допустимы привычные цифры, или те же нули и единицы, но уже в двойных кавычках ("1001", x"9", 9).
Если же нам надо перевести сигнал в Z-состояние, то мы, собственно, эту букву и используем.
---------- Post added at 10:38 ---------- Previous post was at 09:09 ----------
Пока мне на работе делать нефиг, напишу о триггерах и регистрах.
Оба эти элемента выделяются тем, что они работают по фронту управляющего сигнала.
В VHDL фронты сигналов определяются такими операторами -
Для нарастающего фронта -
(clock'event and clock='1') или
(rising_edge(clock))
Для спадающего фронта -
(clock'event and clock='0') или
(falling_edge(clock))
Использовать эти операторы можно двумя путями.
Самый простой (реализация регистра) -
Q <= A when (rising_edge(clock));
Тоесть, по нарастающему фронту сигнала clock данные сигнала А запишутся в регистр Q.
Более "канонически" можно написать так:
Код:
process(clock)
begin
if (rising_edge(clock)) then
Q <= A;
end if;
end process;
Очень часто бывает нужно сбрасывать регистр по определенному сигналу.
Это можно сделать например так:
Код:
process(clock,reset)
begin
if (reset='1') then
Q <= 0;
elsif (rising_edge(clock)) then
Q <= A;
end if;
end process;
---------- Post added at 10:49 ---------- Previous post was at 10:38 ----------
Сообщение от
palsw
Кто будет подопытный без влаживания в девборды?
Можешь попробовать для экпериментов купить мелкую CPLD в каком-нибудь местном ларьке. Я вот себе прикупил для "карманных расходов" кучку EPM3064АTC44 по 40 рублей (1$). Хоть это и Альтеры а не Ксилинксы, но общая суть у них одинакова.
---------- Post added at 12:37 ---------- Previous post was at 10:49 ----------
Давайте, что ли, бегущий огонек сделаем?
Код:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity led is
port(
CLK : in std_logic; -- вход тактовой частоты.
Q : out std_logic_vector(7 downto 0) -- выход на светодиодики. Про резисторы не забываем.
);
end led;
architecture led_arch of led is
signal Q_reg : std_logic_vector(7 downto 0); -- объявляем сдвиговый регистр.
begin
process(CLK,Q_reg)
begin
if (Q_reg=0) then -- это просто начальная инициализация регистра...
Q_reg <= "00000001";
elsif (rising_edge(CLK)) then
Q_reg(7 downto 0) <= Q_reg(6 downto 0) & Q_reg(7); -- и погнали его разряды по кругу.
end if;
end process;
Q <= Q_reg;
end led_arch;
А вот так выглядит работа чипа уже в симуляторе: