Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Языки VHDL и VERILOG в проектировании цифровой аппаратуры

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Глава 5. Синтезабельность HDL-описаний 151
end component;
component LUT3_E8 port(I0 : in std_logic;I1 : in std_logic;
I2 : in std_logic; O : out std_logic); end component; component VCC port(P : out std_logic); end component; component IBUF port(O : out std_logic; I : in std_logic); end component; component OBUF
port(O : out std_logic; I : in std_logic); end component; component LUT3_96
port(I0 : in std_logic; I1 :in std_logic;
I2 : in std_logic; O : out std_logic);
end component;
begin
II_GND: GND port map (G => NN_1); II_N_2_I: LUT3_E8 port map (I0 => C_C,
I1 => A_C, I2 => B_C, O => N_2_I); II_VCC: VCC port map (P => NN_2); II_A_IBUF: IBUF port map (O => A_C, I => a); II_B_IBUF: IBUF port map (O => B_C, I => b); II_C_IBUF: IBUF port map (O => C_C, I => c); II_COUT_OBUF: OBUF port map (
O => cout, I => N_2_I); II_SUM: LUT3_96 port map (I0 => B_C,
I1 => C_C,I2 => A_C,O => SUM_C); II_SUM_OBUF: OBUF port map (O => sum, I => SUM_C);
end beh;
Вопросы к разделу 5.6
1. Как экономить оборудование при описании схем?
2. В каких случаях синтезатор порождает нежелательные триггеры-защелки?
3. Почему рекомендуется использовать case в описании мультиплексоров?
5.7. Триггеры и регистры
Общая структура описаний
При синтезабельном HDL-описании схем с памятью обычно используются процессные формы со списком чувствительности и условным оператором, одно­кратно включающим фронтовое условие (фронта или среза) тактирующего сигна­ла clk (в общем виде ниже обозначено как ..edge) или процессные формы без спи­ска чувствительности, но с оператором ожидания (wait), включающим фронтовое условие.
Примеры фронтовых условий:
152 Глава 5. Синтезабельность HDL-описаний
Условие VHDL VERILOG
Фронт clk'event and clk='1' posedge clk -в списке
rising_edge (clk) чувствительности not clk'stable and clk='1'
Cðåç clk'event and clk='0' negedge clk --в списке
falling_edge (clk) чувствительности not clk'stable and clk='0'
Ниже приведен пример обобщенной структуры описания с условным опера­тором. Многоточием обозначен префикс перед egde (falling_edge, rizing_edge, po­sedge, negedge).
Узлы (триггеры, регистры) с асинхронным сбросом (установкой):
VHDL VERILOG
process ( clk, always @( ...edge clk,
rst) ... edge rst)
begin begin
if (rst='1') then if (rst)begin
операторы операторы end
elsif ...edge (clk) then else begin
операторы операторы end end if; end process; end
Узлы памяти с синхронным сбросом (установкой):
VHDL VERILOG
process (clk) always @(... egde clk)
begin begin
if ... egde (clk) then if (rst) begin
операторы
end
if rst='1' then else begin
операторы операторы
else
операторы end
end if;
end if;
end process; end//always
Теперь приведем пример обобщенной структуры описания узлов без сброса
(установки) с применением оператора ожидания wait.
VHDL VERILOG
process always
begin begin wait until ... edge (clk) then @ (...edge clk);begin операторы операторы end
end process; end
Глава 5. Синтезабельность HDL-описаний 153
Как уже отмечалось, приведенные ниже синтезабельные VHDL-описания
предполагают подключение пакета std_logic-1164, а VERILOG — заданный масш­таб времени 1 ns с точностью до 100 ps. Сравните приведенные ниже описания триггеров с описаниями узлов, построенными синтезатором при синтезе схемы счетчика (VHDL) и схемы автомата управления светофором (VERILOG) — стили несколько отличаются, но идеи те же.
5.7.1. D-триггер-асинхронный сброс-установка
Пример 1. D-триггер с асинхронным установочным входом set, сбросом reset,
информационным входом D и стробом CLK.
VHDL VERILOG
Library IEEE; Use IEEE.std_logic_1164.all; timescale 1 ns/100 ps entity dffa is module dffa( clk,set,reset,din,dout);
port (clk, set, reset,din:
in std_logic; input clk,set,reset,din;
dout: out std_logic); output dout; end; reg dout; architecture beh of dffa is
begin
process (clk,set, reset) always @(posedge clk or
posedge set
or posedge reset)
begin begin
if reset='1' then if (reset ==1'b1)
dout <= '0'; dout<= 1'b0;
elsif set ='1' then else if (set ==1'b1)
dout <= '1'; dout<= 1'b1;
elsif (clk'event and clk='1') then else
dout <= din after 1 ns; dout <= #1 din;
end if; end end process; endmodule //dff end;
Следует еще раз пояснить использование операции <= (а не =) и явной за-
держки в описаниях триггеров. Задержка обычно игнорируется системой синтеза, и она нужна только для упрощения поиска ошибок в схеме в процессе моделиро­вания (триггеры имеют задержки, видные на временнûх диаграммах, а комбина­ционные схемы — нет).
5.7.2. Триггер-синхронный сброс и установка
Пример 2. D-триггер с синхронным (по фронту clk) установочным входом set,
сбросом reset, информационным входом din.
VHDL VERILOG
Library IEEE; use IEEE.std_logic_1164.all; `timescale 1 ns/100 ps entity dffs is module dffs( clk,set,reset,din,dout);
port (clk,set,reset,din:
in std_logic; input clk,set,reset,din;
154 Глава 5. Синтезабельность HDL-описаний
dout: out std_logic); output dout; end; reg dout; architecture beh of dffs is begin process (clk) always @(posedge clk ) begin begin
if clk'event and clk='1' then if (clk==1'b1)begin
if reset='1' then if (reset ==1`'b1)
dout <= '0'; dout<= 1'b0;
elsif set ='1' then else if (set ==1'b1)
dout <= '1'; dout<= 1'b1;
else else
dout <= din after 1 ns; dout <= #1 din;
end if; end //if clk end process; end end; endmodule
Нетрудно построить на базе приведенного примера описания триггеров без
сброса или установки и путем добавления параметра n описания n-разрядных ре­гистров.
Следует еще раз обратить внимание на X-оптимизм c точки зрения моделиро-
вания. В VHDL-описании триггера правильнее было бы использовать имеющуюся в пакете std_logic_1164 функцию rising_edge при описании условия фронта clk, ко­торая дает значение TRUE (истина) только при смене clk из «0» в «1» и не дает его, в отличие от (clk'event and clk='1'), при смене clk, например из «X» в «1».
5.7.3. Регистры с разрешающим входом
Пример 3. n-разрядный регистр с асинхронным сбросом и разрешением приема.
VHDL VERILOG
entity regenn is module regenn(rout, rin,
en, clr_n, clk); generic (size:positive:=32); parameter size = 32; port ( rout: out std_logic_vector
(size-1 downto 0); output [size-1:0] rout;
rin : in std-logic_vector reg [size-1:0] rout;
(size-1 downto 0); input [size-1:0] rin;
en,clr_n,clk: in std_logic); input en,clr_n,clk; end; architecture beh of regenn is always @(posedge clk or
negedge clr_n)
begin
process(clk,clr_n) begin begin
if (clr_n ='0' ) then if (!clr_n)
rout <= (others=>'0'); rout <= 0;
elsif clk'event and clk='1' then else
if en='1' then if (en)
rout <= rin after 1 ns; rout <= #(1) rin;
end if;
end if; end end process; end; endmodule
Глава 5. Синтезабельность HDL-описаний 155
5.7.4. Защелки
Пример 4. Триггер-защелка (регистр).
Как уже отмечалось, не рекомендуется применять защелки в обычных схемах (может быть, только при синтезе блоков регистровой памяти для экономии обору­дования).
VHDL VERILOG
entity rlatchn is module rlatchn(rout,rin,en);
generic(size: integer:=32); parameter size = 32; port( rout:out std_logic_vector
(size-1 downto 0); output [size-1:0] rout;
rin:in std_logic_vector
(size-1 downto 0); input [size-1:0] rin;
en: in std_logic); input en; end; architecture beh of rlatchn is reg [size-1:0] rout; begin
process (en,rin) always @(en or rin)
begin begin if en ='1' then if (en)
rout <= rin after 1 ns;
rout <= #1 rin;
end if; end end process; end; endmodule
5.7.5. Сдвигатели
Пример 5. Образ 4-разрядного сдвигового регистра с последовательным вхо-
дом и выходом (в комментариях предполагаемые описания входов-выходов).
VHDL VERILOG
-- CLK,din: in STD_LOGIC; //input clk,din;
-- DOUT: out STD_LOGIC; //output dout;reg dout;
//reg [3:0] r_s;
process (clk) always @(posedge clk)
variable r_s: std_logic_vector begin
(3 downto 0);
begin
if clk'event and clk='1' then if (clk==1'b1)
r_s := din & r_s(3 downto 1); r_s= {din,r_s[3:0]}; end if; dout <= r_s(0) after 1 ns; dout<= #1 r_s[0];
end process; end //always
5.7.6. Cчетчики
Пример 6. n-pазрядный счетчик с асинхронным сбросом.
VHDL
library IEEE; use IEEE.std_logic_1164.all;
entity count_up is
156 Глава 5. Синтезабельность HDL-описаний
generic(n: integer:=7); port (reset,clk: in std_logic;
count:out std_logic_vector(n-1 downto 0)); end; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; architecture beh of count_up is
begin
process (reset,clk) variable count_tmp: integer; begin
if reset ='1' then count_tmp :=0 ; elsif clk'event and clk='1' then
count_tmp:= count_tmp+1; end if; count<=conv_std_logic_vector( count_tmp,n) after 1 ns;
end process; end;
VERILOG
module count_up(reset,clk,count); parameter n=7;
input reset,clk; output [n-1:0] count; reg [n-1:0] count; always @(posedge reset or posedge clk )
begin
if (reset==1)begin
count=0; end else begin
count=count+1;
end
end
endmodule
5.7.7. Регистровые файлы и блоки памяти
Oбычно система синтеза описание памяти реализует как массив регистров, по­строенных на триггерах. Для того чтобы она использовала блочную память, следует дать ей специальные указания в виде установки параметров синтеза или в HDL-тек­сте в форме специального комментария. Для САПР Synplify это значение директивы syn_black_box и атрибута syn_ramstyle (последний у автора не срабатывал).
Пример 7.
VERILOG
Описание блока памяти, реализуемое на триггерах
a) (см. cпециальный комментарий)
module ram8 (datain,dataout,clk,addr,wr);
output[31:0] dataout;reg[31:0] dataout;
input clk,wr;input[31:0] datain;input[2:0] addr;
reg [31:0] mem [7:0] /* synthesis syn_ramstyle="registers" */;
always @( posedge clk)begin
Глава 5. Синтезабельность HDL-описаний 157
if (wr) mem[addr]<= datain; // и так далее
b) Описание блока памяти (подробно этот блок памяти описан в главе 3), реа­лизуемое блоками памяти FPGA VIRTEX (см. гл. 6).
module ramb4(di, en, we,r st, clk, addr, do) /* synthesis syn_black_box */; parameter data_width = 8, addr_width= 9, depth=256; input [data_width -1 : 0]di; input en, we, rst,clk; input [data_width : 0] addr; output [data_width -1 : 0] do; reg [data_width -1 : 0] do; reg[data_width -1 : 0] mem[ depth-1 : 0] ; // synthesis syn_ramstyle="block_ram" - не срабатывал у автора
VHDL
Описание блока памяти (подробно этот блок памяти описан в главе 3), реали­зуемое блоками памяти FPGA VIRTEX (см. гл. 6).
Подключается библиотека атрибутов и задается значение нужного.
library ieee;use ieee.std_logic_1164.all;
entity ram4 is
port (d : in std_logic_vector(7 downto 0);
addr : in std_logic_vector(2 downto 0); we ,clk : in std_logic;
ram_out : out std_logic_vector(7 downto 0)); end ram4; library synplify;use synplify.attributes.all; architecture rtl of ram4 is type mem_type is array (127 downto 0) of std_logic_vector (7
downto 0);
signal mem : mem_type;
-- mem is the signal that defines the RAM attribute syn_ramstyle of mem : signal is "block_ram"; begin --è ò.ä. end;
При использовании ram_4 как компоненты надо объявить attribute black_box:
boolean; attribute black_box of ram_4: component is TRUE;.
5.7.8. Типичные ошибки в описаниях триггеров и регистров
Отсутствие нужных указаний — комментария системе синтеза.
Описание как бы RS-триггера защелки, на самом деле порождающее D-триггер.
VHDL VERILOG
process (reset, set) always @( reset or set) begin begin
if reset='1' then if( reset=1)
dout <= '0'; dout <= 0;
elsif set='1' then -- else if (set=1)
dout <= 1; dout <= 1;
end if;
end process; end
При синтезе в САПР SYNOPSYS ему сопоставляется не RS-триггер, а
D-триггер-защелка, так как это образ D-триггера (см. выше). До полностью син
-
158 Глава 5. Синтезабельность HDL-описаний
тезабельного RS-триггера ему недостает указания — комментария системе синтеза (one hot) о том, что выходы не могут быть одновременно в 1.
Несоблюдение синтезабельных рекомендаций типа: только один раз указывать
фронт (срез), и тем более нельзя в одном условии задавать фронт, а в другом срез (это уже не триггер, а что-то невероятное).
Пример VHDL — не D-триггер. Заодно в приведенном примере полное игно-
рирование указаний по стилю кодирования.
Library IEEE;Use IEEE.std_logic_1164.all;
entity no_dffa is port (clk,reset,din: in std_logic; dout: out std_logic); end;
architecture beh of no_dffa is
begin process (clk,set, reset) begin
if reset='1' and (clk'event and clk='1') then
dout <= '0';
elsif set ='1' and (clk'event and clk='0') then
dout <= '1';
elsif (clk'event and clk='1') then
dout <= din after 1 ns;
end if;
end process;
end;
5.7.9. Пример синтеза cчетчика
VHDL
-- 2-разрядный счетчик c асинхронным сбросом
-- описание фронтового условия с функцией Rising_edge library ieee;use ieee.std_logic_1164.all; entity counter is
port (clk, reset: in std_logic;
count: out std_logic_vector (1 downto 0) ); end counter; library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all; architecture behave of counter is
signal count_i : std_logic_vector (1 downto 0);
begin
process (clk, reset)
begin
if (reset = '0') then
count_i <= "00";
elsif rising_edge(clk) then
count_i <= count_i + '1';
end if; end process; count <= count_i;
end behave;
Его графическое представление синтезатором до покрытия технологическим
базисом на рис. 5.9, а после на рис. 5.10.
Глава 5. Синтезабельность HDL-описаний 159
Рис. 5.9. Графическое представление схемы счетчика
Рис. 5.10. Представление счетчика в технологическом базисе
160 Глава 5. Синтезабельность HDL-описаний
Фрагмент протокола работы синтезатора (режим невключения IO буферов):
-- Синтезатор использовал в схеме два триггера (FDC ) Setting fanout limit to 10 - нагрузка 10 установлена пользователем List of partitions to map: view:work.counter(behave) Net buffering Report for view:work.counter(behave): No nets needed buffering. Made 0 timing clusters @N|The option to pack flops in the IOB has not been specified Found clock clk with period 50 ns
##### START TIMING REPORT ##### Performance Summary
**************************
Requested Estimated Requested Estimated
Clock Frequency Frequency Period Period Slack
-------------------------------------------------------------------­clk 20.0 MHz 205.7 MHz 50.0 4.9 45.1 ===========================
Порожденный VHDL текст описания схемы:
library ieee; use ieee.std_logic_1164.all;use ieee.numeric_std.all; library synplify;use synplify.components.all; entity LUT2_6 is --схема XOR port(I0 : in std_logic; I1 : in std_logic;
O : out std_logic); end LUT2_6; architecture beh of LUT2_6 is
signal I0_I : std_logic; signal GND : std_logic;
signal VCC : std_logic; signal N_6 : std_logic; begin
I0_I <= not I0; GND <= '0';
VCC <= '1'; O <= not N_6;
N_6 <= I1 xor I0_I after 100 ps; end beh;
-- D-триггер FDC из примитива prim_dff library ieee; use ieee.std_logic_1164.all;use ieee.numeric_std.all; library synplify;use synplify.components.all; entity FDC is port(Q : out std_logic; D : in std_logic;
C : in std_logic; CLR : in std_logic); end FDC; architecture beh of FDC is begin
II_Q: prim_dff port map (Q, D, C, CLR, '0'); end beh;
-­library ieee; use ieee.std_logic_1164.all;use ieee.numeric_std.all; library synplify;use synplify.components.all; entity INV is port(I : in std_logic; O : out std_logic);
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]