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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Глава 5. Синтезабельность HDL-описаний 161
end INV; architecture beh of INV is begin O <= not I; end beh;
--- ОПИСАНИЯ обьектов GND,VCC опущены
--- они совпадают с приведенными в
-- результатах синтеза сумматора library ieee; use ieee.std_logic_1164.all;use ieee.numeric_std.all; library synplify;use synplify.components.all; entity counter is -- счетчик counter port(clk : in std_logic; reset : in std_logic;
data : in std_logic_vector(1 downto 0);
count : out std_logic_vector(1 downto 0)); end counter; architecture beh of counter is
signal COUNT_I_0 : std_logic_vector(0 to 0);
signal COUNTZ : std_logic_vector(1 downto 0);
signal UN3_COUNT_I_AXBXC1 : std_logic ;
signal RESET_I_0 : std_logic ;
signal NN_1 : std_logic ; signal NN_2 : std_logic ;
component GND port(G : out std_logic);
end component;
component VCC port(P : out std_logic);
end component;
component FDC port(Q : out std_logic; D : in std_logic;
C : in std_logic; CLR : in std_logic); end component; component INV
port(I : in std_logic; O : out std_logic); end component; component LUT2_6
port(I0 : in std_logic; I1 : in std_logic;
O : out std_logic );
end component;
begin
II_GND: GND port map (G => NN_2); II_VCC: VCC port map (P => NN_1); \II_COUNT[0]\: FDC port map (
Q => COUNTZ(0), D => COUNT_I_0(0), C => clk, CLR => RESET_I_0);
\II_COUNT[1]\: FDC port map (
Q => COUNTZ(1), D => UN3_COUNT_I_AXBXC1, C => clk,CLR => RESET_I_0);
\II_COUNT_I[0]\: INV port map (
I => COUNTZ(0), O => COUNT_I_0(0)); II_RESET_I: INV port map(I=>reset, O => RESET_I_0); II_UN3_COUNT_I_AXBXC1: LUT2_6 port map (
I0 => COUNTZ(1), I1 => COUNTZ(0),
O => UN3_COUNT_I_AXBXC1); count(0) <= COUNTZ(0);count(1) <= COUNTZ(1);
end beh;
162 Глава 5. Синтезабельность HDL-описаний
5.8. HDL-описания автоматов
5.8.1. Автоматы Мили и Мура
Известны два типа конечных автоматов (FSM-Finite State Machine): автомат Мура (Moore) и автомат Мили (Mealy). В автомате Мура выходные сигналы (out_syg) зависят (f) от текущего состояния (state) автомата. В автомате Мили вы­ходы являются функцией (f) как текущего состояния, так и входных сигналов (in_syg). Состояние автомата изменяется по синхросигналу (clk). Ф — функция переходов.
Автомат Мили Автомат Мура
out_sig=f (state); out_syg=f (state, in_syg);
nexstate=Ô (in_syg, state); nexstate=Ô (in_syg, state);
state = nexstate when posedge of clk; state = nexstate when posedge of clk;
HDL-описание автомата в общем случае может состоять из трех частей-про­цессов, соответствующих отдельным частям автомата, как это показано выше, но часто состоит из двух или одного процесса.
Кодирование состояний автомата
Среди способов кодирования состояний автомата различают минимальное, случайное, противогоночное (код Грея) и позиционное (onehot) кодирование — каждому состоянию сопоставляется отдельный триггер.
Например, для хранения четырех состояний при минимальном кодировании достаточно двух триггеров, при противогоночном эти состояния могут меняться так: 00, 01, 11, 10; при позиционном необходимы четыре триггера и смена состоя­ний может быть такой: 1000, 0100, 0010, 0001.
В качестве примера рассмотрим автомат управления светофором. При сигнале reset = 1 светофор не работает, если reset = 0, светофор начинает работать, зажи­гая зеленый и красный свет длительностью 60 секунд и желтый — 10 секунд. До­пустим, тактовый генератор автомата выдает импульс синхронизации каждые 10 секунд. Каждая лампочка (красный, зеленый, желтый) управляется отдельным вы­ходным сигналом автомата. Автомат имеет три рабочих состояния: зеленый, жел­тый, красный и одно нерабочее. При использовании позиционного способа коди­рования состояний автомата достаточно трех триггеров (регистр с: зеленый, жел­тый, красный); при минимальном кодировании — двух.
5.8.2. VERILOG — описание и тест автомата управления светофором
Пример VERILOG-описания автомата управления светофором с разной дли-
тельностью периода красного, зеленого и желтого свечения.
//Описание счетчика COUNT_UP БЫЛО ВЫШЕ //Ниже VERILOG-описании упрощенного автомата управления // пример последовательного кодирования состояний - ЭТО не лучший способ // кодировки, но система синтеза может изменить способ кодирования `timescale 1ns/100 ps `define IDLE_ST 0 // не работает
Глава 5. Синтезабельность HDL-описаний 163
`define RED_ST 1 // горит красный `define GREEN_ST 2 // горит зеленый `define YELLOW_ST 3 // желтый после зеленого module simple_svetofor2 (clk, rst, red, green, yellow);
input clk, rst; output red, green, yellow; parameter n = 7;// cnt size parameter T_RED = 5;//25; - другие задержки parameter T_GREEN = 3;//12; parameter T_YELLOW = 2;
parameter state_size = 2; reg[state_size-1:0] svet_state, next_svet_state;
reg cnt_rst,next_cnt_rst; wire [n-1 :0]count;
//автомат состоит из счетчика времени и автомата состояний
count_up #(n) cnt (.reset(cnt_rst),.clk(clk),.count(count)); //ниже комбинационная часть - определение следующего // состояния автомата)
always @( svet_state or count)
begin
next_svet_state = svet_state; // неизменное состояние next_cnt_rst= 0;
case (svet_state)
`IDLE_ST: begin
next_cnt_rst=1; next_svet_state=`YELLOW_ST;
end
`RED_ST: if(count==T_RED)begin
next_svet_state=`GREEN_ST; next_cnt_rst=1;
end
`GREEN_ST: if(count==T_GREEN)begin
next_svet_state=`YELLOW_ST; next_cnt_rst=1;
end
`YELLOW_ST: if(count==T_YELLOW)begin
next_svet_state=`RED_ST; next_cnt_rst=1;
end
default: next_svet_state= `IDLE_ST;
endcase
end // always
// ниже cмена состояния автомата по фронту clk
always @ (posedge clk)
if(rst==1)begin
svet_state<=`IDLE_ST;
cnt_rst<=1;
end
else begin
svet_state<=next_svet_state;
cnt_rst<= next_cnt_rst;
end
// ниже выработка выходных сигналов, зависящих // от состояния автомата
164 Глава 5. Синтезабельность HDL-описаний
assign red= (svet_state==`RED_ST)? 1: 0; assign green= (svet_state==`GREEN_ST)?1:0;
assign yellow = (svet_state==`YELLOW_ST)?1:0; endmodule // simple-svetofor ---------------------------------------­// Verilog тест автомата светофора // ниже `timescale 1ns/100 ps module TB_svetofor (); // ---------------------------------------------
reg clk, rst;
wire red, green, yellow; parameter n=7;
always begin clk =0; #10; clk=1; #10; end // генератор тактов initial begin rst =1; #20; rst =0;#800;$finish; end // сброс-запуск
simple_svetofor2 #(n) svet (.rst(rst),.clk(clk),
.yellow(yellow),.red(red),.green(green));
endmodule
5.8.3. VHDL-описание и тест автомата управления светофором
Приведем пример VHDL-описания упрощенного автомата управления свето-
фором с разной длительностью периода красного, зеленого и желтого светов. Способ кодирования состояний автомата в VHDL-описании не определен, он определяется ЗАДАНИЕМ РЕЖИМА ПРИ ЗАПУСКЕ СИНТЕЗАТОРА ИЛИ В ТЕКСТЕ ОПИСАНИЯ специальным комментарием, влияющим на работу систе­мы синтеза.
--Ниже описание автомата library IEEE;use IEEE.STD_LOGIC_1164.all; entity simple_svetofor2 is
generic (n: positive := 7;T_RED: positive:=5;
T_green : positive:= 5; T_YELLOW: positive:= 3);
port (clk, rst: in std_logic;
red, green, yellow: out std_logic);
end; library IEEE; use IEEE.STD_LOGIC_1164.all;use IEEE.STD_LOGIC_UNSIGNED.all;
architecture beh of simple_svetofor2 is
type st_type is (IDLE_ST,RED_ST,GREEN_ST,YELLOW_ST);
signal svet_state, next_svet_state: st_type;
signal cnt_rst,next_cnt_rst: std_logic; signal count: std_logic_vector (n-1 downto 0);
--автомат состоит из счетчика времени и автомата состояний begin
cnt_inst:entity count_up generic map( n=> n)
port map (reset =>cnt_rst,clk=>clk,count=>count);
--ниже комбинационная часть - определение следующего
-- состояния автомата)
process (svet_state, count)
begin
next_svet_state <= svet_state;
-- неизменное состояние next_cnt_rst <= "0";
Глава 5. Синтезабельность HDL-описаний 165
case (svet_state) is
when IDLE_ST => next_cnt_rst<='1';
next_svet_state<=YELLOW_ST;
whenRED_ST => if(count=T_RED ) then
next_svet_state<=GREEN_ST; next_cnt_rst<='1';
end if;
whenGREEN_ST=>if(count=T_GREEN)then
next_svet_state<=YELLOW_ST; next_cnt_rst<='1';
end if;
whenYELLOW_ST=> if(count=3) then --T_YELLOW)then
next_svet_state<=RED_ST; next_cnt_rst<='1';
end if;
when others=> next_svet_state<= IDLE_ST;
end case;
end process;
-- ниже cмена состояния автомата по фронту clk process (clk,rst) begin
if(rst='1')then
svet_state<=IDLE_ST;
cnt_rst<='1';
elsif clk'event and clk='1' then
svet_state<=next_svet_state; cnt_rst<=next_cnt_rst;
end if;
end process;
-- ниже выработка выходных сигналов, зависящих
-- от состояния автомата -----------------------------------­red <='1' when (svet_state=RED_ST)else'0'; green <='1' when (svet_state=GREEN_ST)else '0'; yellow <='1' when (svet_state=YELLOW_ST)else '0';
end;
-- ÍÈÆÅ ÒÅÑÒ----------------------------------------------
library ieee; use ieee.std_logic_1164.all; entity simple_svetofor2_tb is
-- Generic declarations of the tested unit generic( n : POSITIVE := 7;T_RED : POSITIVE := 5; T_green : POSITIVE := 3;T_YELLOW : POSITIVE := 2 );
end simple_svetofor2_tb; architecture TB_ARCHITECTURE of simple_svetofor2_tb is
-- Component declaration of the tested unit
component simple_svetofor2
generic(
n : POSITIVE := 7;T_RED : POSITIVE := 5; T_green : POSITIVE := 3;T_YELLOW : POSITIVE := 2);
port(
clk : in std_logic;rst : in std_logic; red : out std_logic;green : out std_logic;
166 Глава 5. Синтезабельность HDL-описаний
yellow : out std_logic);
end component; signal clk : std_logic; signal rst : std_logic; signal red : std_logic; signal green : std_logic; signal yellow : std_logic;
begin
-- Unit Under Test port map
UUT : simple_svetofor2
generic map (n => n,T_RED => T_RED,
T_green => T_green,T_YELLOW => T_YELLOW)
port map (clk => clk,rst => rst,
red => red,green => green, yellow => yellow);
-- Add your stimulus here ...
clkp: process begin
clk <='0' ; wait for 10 ns; clk<='1'; wait for 10 ns ;
end process;
rstp: process begin
rst <='0'; wait for 10 ns; rst<='1'; wait for 20 ns ; rst <='0' ;wait;
end process; end TB_ARCHITECTURE; configuration TESTBENCH_FOR_simple_svetofor2 of simple_svetofor2_tb is
for TB_ARCHITECTURE
for UUT : simple_svetofor2
use entity work.simple_svetofor2(beh);
end for;
end for; end TESTBENCH_FOR_simple_svetofor2;
В данном случае объявление конфигурации избыточно.
5.8.4. Синтез VERILOG-описания автомата управления светофором
Графическое представление автомата управления светофором синтезатором до покрытия технологическим базисом представлено на рис. 5.11, а его увеличен­ный фрагмент — на рис. 5.12.
Виден (справа) прямоугольник блока выработки состояний автомата, прямо­угольник 7-разрядного счетчика, триггер сигнала сброса счетчика, цепи (cлева) выработки сигнала сброса, сравнивающие состояние счетчика с заданными пери­одами свечения.
Фрагмент протокола работы синтезатора:
$ Start of Compile #Sat Jun 15 16:19:56 2002
@I::"c:\program files\simucad\silos2001demo\pol_des\svetofor_ver2.v"
@I::"c:\program files\simucad\silos2001demo\pol_des\count_up.v"
Verilog syntax check successful!
Глава 5. Синтезабельность HDL-описаний 167
Рис. 5.11. Графическое представление схемы автомата светофора
Рис. 5.12. Фрагмент схемы автомата управления светофором
File c:\program files\simucad\silos2001demo\pol_des\svetofor_ver2.v changed -
recompiling
Selecting top level module simple_svetofor2
Synthesizing module count_up
n=32'b00000000000000000000000000000111
Generated name = count_up_7 Synthesizing module simple_svetofor2 Trying to extract state machine for register svet_state Extracted state machine for register svet_state State machine has 4 reachable states with original encodings of:
00 01 10 11 -- исходная кодировка состояний @END Process took 0.17 seconds realtime, 0.17 seconds cputime
168 Глава 5. Синтезабельность HDL-описаний
Setting fanout limit to 100 List of partitions to map:
view:work.simple_svetofor2(verilog) Automatic dissolve at startup in view:work.simple_svetofor2(verilog) of cnt(count_up_7) Encoding state machine work.simple_svetofor2(verilog)-svet_state_h.svet_state[3:0] original code -> new code
00 -> 00 01 -> 01 10 -> 10 11 -> 11 -- новые коды состояний @N:"c:\program files\simucad\silos2001demo\pol_des\count_up.v":9:2:9:7|Found counter in view:work.simple_svetofor2(verilog) inst cnt.count[6:0] Clock Buffers:
Inserting Clock buffer for port clk, TNM=clk Net buffering Report for view:work.simple_svetofor2(verilog): 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 1000ns
##### START TIMING REPORT #####--Временные параметры Performance Summary
*************************
Requested Estimated Requested Estimated
Clock Frequency Frequency Period Period Slack
---------------------------------------------------------------------­clk 1.0 MHz 97.0 MHz 1000.0 10.3 989.7 ========================================== ##### END TIMING REPORT #####
-------------------------------------------------------------­Resource Usage Report -- затраты оборудования Mapping to part: xcv50bg256-4 Cell usage: FDC 7 uses - счетчик времени - семь триггеров GND 1 use VCC 1 use XORCY 7 uses-сравнение MUXCY_L 6 uses FDS 1 use FDR 2 uses --состояния автомата - два триггера I/O primitives: OBUF 3 uses IBUF 1 use BUFGP 1 use I/O Register bits: 0 Register bits not including I/Os: 10 (0%) Global buffer usage summary BUFGs + BUFGPs: 1 of 4 (25%) Mapping Summary: Total LUTs: 18 (1%) Found clock clk with period 1000ns Mapper successful! // Source file index table: // Object locations will have the form <file>:<line> // file 0 "noname" // file 1 "\c\simucad\silos2001demo\pol_des\svetofor_ver2.v" // file 2 "\c:\simucad\silos2001demo\pol_des\count_up.v" Ниже фрагменты VERILOG-описания синтезированной схемы -------­`timescale 100 ps/100 ps module GND ( G);output G;wire G ; assignG=1'b0;
Глава 5. Синтезабельность HDL-описаний 169
endmodule /* GND */ module LUT2_8 ( I0, I1, O); input I0;input I1;output O;wire I0 ;wire I1 ; wire O ;wire GND ;wire VCC ; //@1:62
assign #(1) O = I1 & I0 ;
//@1:62
assign GND = 1'b0;
//@1:62
assign VCC = 1'b1; endmodule /* LUT2_8 */ module LUT4_0040 ( I0, I1, I2, I3, O); input I0;input I1;input I2;input I3; output O;wire I0 ;wire I1 ;wire I2 ;wire I3 ; wire O ;wire I3_i ;wire I0_i ;wire GND ;wire VCC ; //@1:62
assign #(1) I3_i=~I3;
//@1:62
assign #(1) I0_i=~I0;
//@1:62
assign #(1) O = I3_i & I2 & I1 & I0_i ;
//@1:62
assign GND = 1'b0;
//@1:62
assign VCC = 1'b1; endmodule /* LUT4_0040 */ /* ОПУЩЕНЫ ОПИСАНИЯ ЭТИХ МОДУЛЕЙ
module LUT4_FFFE ( I0, I1, I2, I3, O); module LUT4_FDFF (I0, I1, I2, I3, O);
module LUT3_EA ( I0, I1, I2, O);
module LUT4_0D5D ( I0,I1, I2, I3, O); */ module VCC ( P); // питание output P;wire P ; assignP=1'b1; endmodule /* VCC */ module BUFGP ( I, O); input I;output O;wire I ;wire O ; assign #(1) O = I; endmodule /* BUFGP */ //триггер ----------------------------------------------------­module FDC ( Q, D, C, CLR); output Q;input D;input C;input CLR; wire Q ;wire D ;wire C ;wire CLR ;
reg r_e_g0; // dffr always @(posedge C or posedge CLR ) r_e_g0 = #1 CLR ? 1'b0:D;
assign Q = r_e_g0; endmodule /* FDC */ // МУЛЬТИПЛЕКСОР --------------------------------------­module MUXCY_L ( DI, CI, S, LO); input DI;input CI;input S;output LO; wire DI ;wire CI ;wire S ;wire LO ;
assign #(1) LO = (!S & DI ) |
(S&CI)|(DI&CI);
170 Глава 5. Синтезабельность HDL-описаний
endmodule /* MUXCY_L */ // ОПУЩЕН module LUT2_6 ( I0, I1, O); module XORCY ( LI, CI, O); input LI;input CI;output O;wire LI ;wire CI ;wire O ;
assign #(1) O = LI ^ CI ; endmodule /* XORCY */ // НИЖЕ СЧЕТЧИК-----------------------------------------­module count_up_7 ( count, cnt_rst, clk_c); output [6:0] count;input cnt_rst;input clk_c; wire [6:0] count;wire cnt_rst ;wire clk_c ;wire [5:0] count_cry; wire [6:0] count_s;wire [6:0] count_qxu;wire GND ;wire VCC ;
GND GND_Z (.G(GND)); VCC VCC_Z (.P(VCC));
FDC \count_Z[0] (.Q(count[0]), .D(count_s[0]),
.C(clk_c), .CLR(cnt_rst));
// ТРИГГЕРЫ 1-5 опущены
FDC \count_Z[6] (.Q(count[6]), .D(count_s[6]), .C(clk_c),
.CLR(cnt_rst));
MUXCY_L \count_cry_Z[0] (.DI(GND),.CI(VCC),
.S(count_qxu[0]), .LO(count_cry[0])); // МУЛЬТИПЛЕКСОРЫ 1-4 опущены
MUXCY_L \count_cry_Z[5] (.DI(GND),.CI(count_cry[4]),
.S(count_qxu[5]), .LO(count_cry[5]));
LUT2_6 \count_qxu_Z[0] (.I0(count[0]), .I1(GND),
.O(count_qxu[0]));
// ЭЛЕМЕНТЫ LUT2_6 сумматора 1-5 опущены----------------------
// @2:9
LUT2_6 \count_qxu_Z[6] (.I0(count[6]),.I1(GND),.O(count_qxu[6])); // @2:9
XORCY \count_s_Z[0] (.LI(count_qxu[0]),.CI(VCC), .O(count_s[0])); // ЭЛЕМЕНТЫ XORCY сумматора 1-5 опущены
XORCY \count_s_Z[6] ( .LI(count_qxu[6]),
.CI(count_cry[5]),.O(count_s[6])); endmodule /* count_up_7 */ //НИЖЕ D-ТРИГГЕР с установкой--------------------------------------­module FDS ( Q, D, C, S); output Q;input D;input C;input S; wire Q ;wire D ;wire C ;wire S ;wire fbs ;
assign #(1) fbs = S | D ;
reg r_e_g1; // dff
always @(posedge C) r_e_g1 = #1 fbs ;
assign Q = r_e_g1; endmodule /* FDS */ module OBUF ( O, I); output O;input I; wire O ;wire I ;wire true ;wire false ;
assign #(1) O = I; assign true = 1'b1;
assign false = 1'b0; endmodule /* OBUF */ module IBUF ( O, I); output O;input I; wire O ;wire I ;wire true ;wire false ;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]