Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Языки VHDL и VERILOG в проектировании цифровой аппаратуры
.pdf
Глава 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 ;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
