Verilog D-триггер,
VHDL
module dff_async_pre (data, clk, preset, q); работающий по переднему фронту,
library IEEE; input data, clk, preset;
use IEEE.std_logic_1164.all;
с синхронным входом сброса
output q;
reg q; В примерах 11 и 12 показано, как произво-
entity dff_async_rst is always @(posedge clk or negedge preset) дится описание D-триггера с синхронным
port (data, clk, reset : in std_logic; if (~preset)
q : out std_logic); q = 1'b1; входом сброса (рис. 5).
end dff_async_rst; else
q = data;
endmodule
architecture behav of dff_async_rst is
begin
process (clk, reset) begin Пример 8. Verilog&код,
if (reset = '0') then описывающий D&триггер с асинхронной установкой
q <= '0';
elsif (clk'event and clk = '1') then
q <= data; D-триггер, работающий по переднему
end if;
end process;
фронту, с асинхронными входами сброса
end behav; и установки
В примерах 9 и 10 показано, как произво-
Пример 5. VHDL&код, описывающий D&триггер
с асинхронным сбросом
дится описание D-триггера с асинхронными Рис. 5. D&триггер с синхронным входом сброса
входами сброса и установки (рис. 4).
VHDL Verilog
library IEEE;
и выходом окончания счета
library IEEE;
use IEEE.std_logic_1164.all; при достижении состояния «все единицы» use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all;
use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all;
не равны, больше или меньше операнды друг if (A /= B) then -- inequality architecture rtl of shift is
Q2 <= '1';
относительно друга или нет. Примеры 41 и 42 else
begin
process (data)
показывают применение операторов соотно- Q2 <= '0'; begin
end if;
шения. Программные инструменты, приме- end process;
q1 <= data(1 downto 0) & «10»; -- logical shift left
q2 <= «10» & data(3 downto 2); --logical shift right
няемые для синтеза, позволяют оптимизиро- end equality_arch; end process;
вать использование данных операторов для end rtl;
Или можно сделать вот так:
применяемой элементной базы. Пример 45. VHDL&код, описывающий операторы сдвига
library IEEE;
use IEEE.std_logic_1164.all;
VHDL
entity equality is
library IEEE; Verilog
port (
use IEEE.std_logic_1164.all; A : in STD_LOGIC_VECTOR (3 downto 0);
use IEEE.std_logic_arith.all; module shift (data, q1, q2);
B : in STD_LOGIC_VECTOR (3 downto 0);
input [3:0] data;
Q1 : out STD_LOGIC; output [3:0] q1, q2;
entity relational is
Q2 : out STD_LOGIC parameter B = 2;
port (A, B : in std_logic_vector(3 downto 0);
Q1, Q2, Q3, Q4 : out std_logic); ); reg [3:0] q1, q2;
end relational; end equality;
architecture behav of relational is always @ (data)
begin architecture equality_arch of equality is begin
process (A, B) begin q1 = data << B; // logical shift left
begin Q1 <= '1' when A = B else '0'; -- equality q2 = data >> B; //logical shift right
-- Q1 <= A > B; -- greater than Q2 <= '1' when A /= B else '0'; -- inequality end
-- Q2 <= A < B; -- less than end equality_arch; endmodule
-- Q3 <= A >= B; -- greater than equal to
if (A <= B) then -- less than equal to Пример 43. VHDL&код, Пример 46. Verilog&код,
Q4 <= '1'; описывающий операторы равенства и неравенства описывающий операторы сдвига
else
Q4 <= '0';
end if;
end process; Verilog Автоматы состояний
end behav;
module equality (A, B, Q1, Q2);
Пример 41. VHDL&код, input [3:0] A; Конечный автомат (finite state machine,
описывающий операторы соотношения input [3:0] B;
FSM) — это тип последовательной схемы, ко-
VHDL
entity mealy is
port (clock, reset : in std_logic;
data_out : out std_logic;
data_in : in std_logic_vector (1 downto 0));
end mealy;
architecture behave of mealy is
type state_values is (st0, st1, st2, st3, st4);
signal pres_state, next_state: state_values;
begin
-- FSM register
Рис. 14. FSM Мура и Мили statereg: process (clock, reset)
begin
if (reset = '0') then
pres_state <= st0;
торая спроектирована так, что она имеет на- мальная работа автомата. Если сигнал сбро- elsif (clock'event and clock ='1') then
pres_state <= next_state;
бор определенных конечных состояний, и ав- са не использовать, то невозможно предска- end if;
томат проходит через эти состояния предо- зать начальное значение триггеров регистра end process statereg;
пределенным последовательным способом. состояний в течение включения питания -- FSM combinational block
Есть два типа FSM — Мили (Mealy) и Мура FPGA. Они могут произвольно встать в одно fsm: process (pres_state, data_in)
begin
(Moore). FSM Мили имеет выходы, которые из незакодированных состояний и находить- case pres_state is
являются функцией текущего состояния ся там неопределенно долго. Сброс должен when st0 =>
case data_in is
и входов. FSM Мура имеет выходы, которые быть описан как одно из состояний в описа- when «00» => next_state <= st0;
являются функцией только текущего состо- нии FSM. when «01» => next_state <= st4;
when «10» => next_state <= st1;
яния. FSM состоит из трех частей: Асинхронный сброс будет предпочтитель- when «11» => next_state <= st2;
1. Регистр текущего состояния для последо- нее синхронного сброса, потому что асин- when others => next_state <= (others <= 'x');
end case;
вательных переходов — это регистр, име- хронный сброс не требует декодирующей ло- when st1 =>
ющий разядность в n-bit и состоящий из гики и не должен быть описан в неиспользу- case data_in is
when «00» => next_state <= st0;
триггеров (объявляются как вектор), син- емых состояниях автомата. when «10» => next_state <= st2;
хронизирующихся одним для всех тригге- Автомат состояний может быть выполнен when others => next_state <= st1;
end case;
ров сигналом синхрочастоты. Вектор со- в двух вариантах. В одном из вариантов схе- when st2 =>
стояния, имеющий разрядность в n-bit, ма содержит регистр состояний, имеющий case data_in is
when «00» => next_state <= st1;
имеет 2n возможных значений. Зачастую разрядность log2 (m) и выходную декодиру- when «01» => next_state <= st1;
не все из 2n состояний необходимы для ра- ющую логику. В другом варианте разряд- when «10» => next_state <= st3;
when «11» => next_state <= st3;
боты автомата, поэтому он должен быть ность регистра состояний выбирается равной when others => next_state <= (others <= 'x');
спроектирован таким образом, чтобы в те- числу состояний, при этом выходная логика end case;
when st3 =>
чение нормальной работы автомат не по- не используется. Такое выполнение называ- case data_in is
пал в неиспользованные состояния. Аль- ется “one hot”. Поскольку в структуре FPGA when «01» => next_state <= st4;
when «11» => next_state <= st4;
тернативно, FSM с m-состояниями потре- имеется достаточно много триггеров и реги- when others => next_state <= st3;
бует регистр с разрядностью, по крайней стров, то при выполнении программным ин- end case;
when st4 =>
мере, log2 (m). струментом синтеза конечного автомата по case data_in is
2. Комбинационная логика для следующего способу “one hot” можно получить оптималь- when «11» => next_state <= st4;
when others => next_state <= st0;
состояния. В каждый момент времени FSM ные результаты по использованию площади end case;
может находиться только в одном состоя- кристалла (area) и производительности. when others => next_state <= st0;
кущего до следующего состояния так, как В примерах 47 и 48 представлен автомат -- Mealy output definition using pres_state w/ data_in
определено логической частью схемы. Сле- Мили для диаграммы состояний, показанной outputs: process (pres_state, data_in)
begin
дующее состояние определяется как функ- на рис. 15. case pres_state is
ция входов FSM и его текущего состояния. when st0 =>
case data_in is
3. Комбинационная логика для выходов. when «00» => data_out <= '0';
Для FSM Мура выходы — это функция те- when others => data_out <= '1';
end case;
кущего состояния. Для FSM Мили выхо- when st1 => data_out <= '0';
ды — это функция текущего состояния when st2 =>
case data_in is
и первичных входов FSM. Кроме того, when «00» => data_out <= '0';
в FSM Мура есть возможность получить when «01» => data_out <= '0';
when others => data_out <= '1';
сигналы выходов не из текущего состояния, end case;
а из следующего состояния, для того что- when st3 => data_out <= '1';
when st4 =>
бы уменьшить время распространения сиг- case data_in is
нала от фронта синхронизации до выхода. when «10» => data_out <= '1';
when «11» => data_out <= '1';
FSM Мура и Мили показаны на рис. 14. when others => data_out <= '0';
Сигнал сброс используется для того, что- end case;
when others => data_out <= '0';
бы гарантировать отказоустойчивое поведе- end case;
ние. Он гарантирует, что FSM всегда иници- end process outputs;
end behave;
ализируется в известное достоверное состо-
яние перед первым активным фронтом Рис. 15. Диаграмма переходов автомата Мили Пример 47. VHDL&код, описывающий автомат Мили
синхрочастоты, после чего и начинается нор-
VHDL
Verilog Параметр “Width” определяет разрядность
library IEEE;
use IEEE.std_logic_1164.all; сумматора. Вот как выглядит установка 16-раз-
module TRISTATE (e, a, y);
input a, e; entity bidir is рядного сумматора в проекте (пример 60).
output y; port (y : inout std_logic;
TRIBUFF U1 (.D(a), .E(e), .PAD(y)); e, a : in std_logic;
endmodule b : out std_logic); U1: adder generic map (16) port map (A_A, B_A, CIN_A, COUT_A, Y_A);
end bidir;
Пример 54. Verilog&код, описывающий установку architecture bi of bidir is Пример 60. VHDL&код, описывающий установку
component BIBUF 16&разрядного сумматора в проекте
в проекте буфера с трехстабильным выходом port (D, E : in std_logic;
Verilog
endmodule
Литература