1、第7章 有限状态机设计与LPM应用,EDA技术实用教程,7.1 一般有限状态机的设计,7.1.1 用户自定义数据类型定义语句,TYPE语句用法如下:TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型 ;或TYPE 数据类型名 IS 数据类型定义 ;,以下列出了两种不同的定义方式:TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_LOGIC ;TYPE week IS (sun,mon,tue,wed,thu,fri,sat) ;,7.1 一般有限状态机的设计,7.1.1 用户自定义数据类型定义语句,TYPE m_state IS ( st0,st1,st2,s
2、t3,st4,st5 ) ; SIGNAL present_state,next_state : m_state ;,布尔数据类型的定义语句是: TYPE BOOLEAN IS (FALSE,TRUE) ;,TYPE my_logic IS ( 1 ,Z ,U ,0 ) ; SIGNAL s1 : my_logic ; s1 = Z ;,7.1 一般有限状态机的设计,7.1.1 用户自定义数据类型定义语句,子类型SUBTYPE的语句格式如下:SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围;,SUBTYPE digits IS INTEGER RANGE 0 to 9 ;,7
3、.1.2 为什么要使用状态机,7.1 一般有限状态机的设计, 有限状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点。, 状态机的结构模式相对简单。, 状态机容易构成性能良好的同步时序逻辑模块。, 状态机的VHDL表述丰富多样。, 在高速运算和控制方面,状态机更有其巨大的优势。, 就可靠性而言,状态机的优势也是十分明显的。,7.1.3 一般有限状态机的设计,7.1 一般有限状态机的设计,1. 说明部分,ARCHITECTURE .IS TYPE FSM_ST IS (s0,s1,s2,s3); SIGNAL current_state, next_state: FSM_ST; .,7.1.3
4、一般有限状态机的设计,7.1 一般有限状态机的设计,2. 主控时序进程,图7-1 一般状态机结构框图工作示意图,3. 主控组合进程,7.1.3 一般有限状态机的设计,控组合进程的任务是根据外部输入的控制信号(包括来自状态机外部的信号和来自状态机内部其它非主控的组合或时序进程的信号),或(和)当前状态的状态值确定下一状态(next_state)的取向,即next_state的取值内容,以及确定对外输出或对内部其它组合或时序进程输出控制信号的内容。,7.1 一般有限状态机的设计,4. 辅助进程,【例7-1】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTIT
5、Y s_machine IS PORT ( clk,reset : IN STD_LOGIC; state_inputs : IN STD_LOGIC_VECTOR (0 TO 1); comb_outputs : OUT INTEGER RANGE 0 TO 15 );END s_machine;ARCHITECTURE behv OF s_machine IS TYPE FSM_ST IS (s0, s1, s2, s3); SIGNAL current_state, next_state: FSM_ST;BEGIN REG: PROCESS (reset,clk) BEGIN IF re
6、set = 1 THEN current_state = s0; ELSIF clk=1 AND clkEVENT THEN current_state comb_outputs comb_outputs comb_outputs comb_outputs = 14; IF state_inputs = 11 THEN next_state = s3; ELSE next_state = s0; END IF; END case; END PROCESS; END behv;,接上页,7.1.3 一般有限状态机的设计,7.1 一般有限状态机的设计,4. 辅助进程,图7-2 例7-1状态机的工作
7、时序图,7.2.1 多进程有限状态机,7.2 Moore型有限状态机的设计,图7-3 ADC0809工作时序,7.2.1 多进程有限状态机,7.2 Moore型有限状态机的设计,图7-4 控制ADC0809采样状态图,7.2.1 多进程有限状态机,图7-5 采样状态机结构框图,【例7-2】LIBRARY IEEE;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ADCINT IS PORT (D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK ,EOC : IN STD_LOGIC; ALE, START, OE,
8、ADDA,LOCK0 : OUT STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END ADCINT;ARCHITECTURE behav OF ADCINT ISTYPE states IS (st0, st1, st2, st3,st4) ; -定义各状态子类型 SIGNAL current_state, next_state: states :=st0 ; SIGNAL REGL : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LOCK : STD_LOGIC; - 转换后数据输出锁存时钟信号 BEGIN A
9、DDA = 1;-当ADDA=0,模拟信号进入0809通道0;当ADDA=1,则进入通道1Q = REGL; LOCK0 ALEALE ALE ALE ALE next_state = st0; END CASE ; END PROCESS COM ; REG: PROCESS (CLK) BEGIN IF (CLKEVENT AND CLK=1) THEN current_state=next_state; END IF; END PROCESS REG ; - 由信号current_state将当前状态值带出此进程:REGLATCH1: PROCESS (LOCK) - 此进程中,在LOC
10、K的上升沿,将转换好的数据锁入 BEGIN IF LOCK=1 AND LOCKEVENT THEN REGL next_state next_state IF (EOC=1) THEN next_state next_state next_state next_state ALEALEALEALEALE ALE=0;START=0;LOCK=0; END CASE ; END PROCESS COM2 ;,7.2.1 三进程有限状态机,7.2.2 单进程Moore型有限状态机,7.2 Moore型有限状态机的设计,【例7-4】LIBRARY IEEE;USE IEEE.STD_LOGIC_1
11、164.ALL;ENTITY MOORE1 IS PORT (DATAIN :IN STD_LOGIC_VECTOR(1 DOWNTO 0); CLK,RST : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END MOORE1;ARCHITECTURE behav OF MOORE1 IS TYPE ST_TYPE IS (ST0, ST1, ST2, ST3,ST4); SIGNAL C_ST : ST_TYPE ;,接上页BEGIN PROCESS(CLK,RST) BEGIN IF RST =1 THEN C_ST IF DAT
12、AIN =10 THEN C_ST IF DATAIN =11 THEN C_ST IF DATAIN =01 THEN C_ST = ST3 ; ELSE C_ST = ST0 ;END IF; Q IF DATAIN =00 THEN C_ST IF DATAIN =11 THEN C_ST C_ST = ST0; END CASE; END IF; END PROCESS;END behav;,7.2.2 单进程Moore型有限状态机,7.2 Moore型有限状态机的设计,图7-7 例7-4状态机综合后的RTL电路模块,7.2.2 单进程Moore型有限状态机,7.2 Moore型有限状
13、态机的设计,图7-8 例7-4单进程状态机工作时序,7.2.2 单进程Moore型有限状态机,7.2 Moore型有限状态机的设计,图7-9 对应于例7-4的2进程状态机工作时序图,7.3 Mealy型有限状态机的设计,【例7-5】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY MEALY1 ISPORT ( CLK ,DATAIN,RESET : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);END MEALY1;ARCHITECTURE behav OF MEALY1 IS TYPE
14、 states IS (st0, st1, st2, st3,st4); SIGNAL STX : states ; BEGIN COMREG : PROCESS(CLK,RESET) BEGIN -决定转换状态的进程 IF RESET =1 THEN STX IF DATAIN = 1 THEN STX IF DATAIN = 0 THEN STX IF DATAIN = 1 THEN STX IF DATAIN = 0 THEN STX IF DATAIN = 1 THEN STX STX IF DATAIN = 1 THEN Q IF DATAIN = 0 THEN Q IF DATAI
15、N = 1 THEN Q IF DATAIN = 0 THEN Q IF DATAIN = 1 THEN Q Q=00000 ; END CASE ; END PROCESS COM1 ;,【例7-6】 MEALY2 LIBRARY IEEE; -MEALY FSMUSE IEEE.STD_LOGIC_1164.ALL;ENTITY MEALY2 IS PORT ( CLK ,DATAIN,RESET : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);END MEALY2;ARCHITECTURE behav OF MEALY2 IS T
16、YPE states IS (st0, st1, st2, st3,st4); SIGNAL STX : states ; SIGNAL Q1 : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN COMREG : PROCESS(CLK,RESET) -决定转换状态的进程,接上页BEGIN IF RESET =1 THEN STX IF DATAIN = 1 THEN STX IF DATAIN = 0 THEN STX IF DATAIN = 1 THEN STX IF DATAIN = 0 THEN STX IF DATAIN = 1 THEN STX STX IF
17、 DATAIN=1 THEN Q2 :=10000; ELSE Q2:=01010; END IF; WHEN st1= IF DATAIN=0 THEN Q2 :=10111; ELSE Q2:=10100; END IF; WHEN st2= IF DATAIN=1 THEN Q2 :=10101; ELSE Q2:=10011; END IF; WHEN st3= IF DATAIN=0 THEN Q2 :=11011; ELSE Q2:=01001; END IF; WHEN st4= IF DATAIN=1 THEN Q2 :=11101; ELSE Q2:=01101; END I
18、F; WHEN OTHERS = Q2:=00000 ; END CASE ; IF CLKEVENT AND CLK = 1 THEN Q1=Q2; END IF; END PROCESS COM1 ; Q = Q1 ;END behav;,7.3 Mealy型有限状态机的设计,图7-10 例7-5状态机工作时序图,7.3 Mealy型有限状态机的设计,图7-11 例7-6状态机工作时序图,7.4.1 状态位直接输出型编码,7.4 状态编码,表7-1 控制信号状态编码表,【例7-7】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY AD0809
19、IS PORT (D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK ,EOC : IN STD_LOGIC; ALE, START, OE, ADDA : OUT STD_LOGIC; c_state : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END AD0809;ARCHITECTURE behav OF AD0809 ISSIGNAL current_state, next_state: STD_LOGIC_VECTOR(4 DOWNTO 0 ); CON
20、STANT st0 : STD_LOGIC_VECTOR(4 DOWNTO 0) := 00000 ; CONSTANT st1 : STD_LOGIC_VECTOR(4 DOWNTO 0) := 11000 ; CONSTANT st2 : STD_LOGIC_VECTOR(4 DOWNTO 0) := 00001 ; CONSTANT st3 : STD_LOGIC_VECTOR(4 DOWNTO 0) := 00100 ;,CONSTANT st4 : STD_LOGIC_VECTOR(4 DOWNTO 0) := 00110 ; SIGNAL REGL : STD_LOGIC_VECT
21、OR(7 DOWNTO 0); SIGNAL LOCK : STD_LOGIC; BEGIN ADDA next_state next_state IF (EOC=1) THEN next_state next_state next_state next_state = st0; END CASE ; END PROCESS COM ; REG: PROCESS (CLK) BEGIN IF (CLKEVENT AND CLK=1) THEN current_state=next_state; END IF; END PROCESS REG ; - 由信号current_state将当前状态值
22、带出此进程:REG LATCH1: PROCESS (LOCK) - 此进程中,在LOCK的上升沿,将转换好的数据锁入 BEGIN IF LOCK=1 AND LOCKEVENT THEN REGL next_state next_state next_state = st0; END case;,7.5 状态机剩余状态处理,【例7-10】.alarm 9, - 9位地址线宽度 自然数数据类型 LPM_INDATA = REGISTERED,-寄存器锁存方式写入数据,字符串数据类型 LPM_ADDRESS_CONTROL = REGISTERED,-寄存器锁存方式写入地址,字符串数据类型,接上
23、页 LPM_OUTDATA = UNREGISTERED,-非寄存器锁存方式输出数据 LPM_HINT = USE_EAB=ON ) -允许使用FPGA中的EAB PORT MAP (address = address,inclock = inclock, data = data, we = we,q = sub_wire0);END SYN;,7.6.4 正弦信号发生器设计与LPM ROM定制,7.6 LPM模块的VHDL文本方式调用,图7-22 波形发生器电路系统结构图,1. 正弦信号发生器结构,2. 正弦信号波形数据文件建立,【例7-12】LPM_ROM中作为正弦波形数据文件sindat
24、a.mifWIDTH = 8 ;DEPTH = 64 ;ADDRESS_RADIX = HEX ;DATA_RADIX = DEC ;CONTENT BEGIN 00:255 ; 01:254 ; 02:252 ; 03:249 ; 04:245 ; 05:239 ; 06:233 ; 07:225 ; 08:217 ; 09:207 ; 0A:197 ; 0B:186 ; 0C:174 ; 0D:162 ; 0E:150 ; 0F:137 ; 10:124 ; 11:112 ; 12: 99 ; 13: 87 ; 14: 75 ; 15: 64 ; 16: 53 ; 17: 43 ; 18:
25、 34 ; 19: 26 ; 1A: 19 ; 1B: 13 ; 1C: 8 ; 1D: 4 ; 1E: 1 ; 1F: 0 ; 20: 0 ; 21: 1 ; 22: 4 ; 23: 8 ; 24: 13 ; 25: 19 ; 26: 26 ; 27: 34 ; 28: 43 ; 29: 53 ; 2A: 64 ; 2B: 75 ; 2C: 87 ; 2D: 99 ; 2E:112 ; 2F:124 ; 30:137 ; 31:150 ; 32:162 ; 33:174 ; 34:186 ; 35:197 ; 36:207 ; 37:217 ; 38:225 ; 39:233 ; 3A:23
26、9 ; 3B:245 ; 3C:249 ; 3D:252 ; 3E:254 ; 3F:255 ; END ;,7.6.4 正弦信号发生器设计与LPM ROM定制,图7-23 定制LPM ROM文件,3. LPM ROM定制,7.6.4 正弦信号发生器设计与LPM ROM定制,图7-24 选择ROM参数,3. LPM ROM定制,7.6 LPM模块的VHDL文本方式调用,7.6.4 正弦信号发生器设计与LPM ROM定制,图7-25加入初始化文件,3. LPM ROM定制,7.6 LPM模块的VHDL文本方式调用,7.6.4 正弦信号发生器设计与LPM ROM定制,图7-26 例7-13仿真波形
27、,3. LPM ROM定制,7.6 LPM模块的VHDL文本方式调用,3. LPM ROM定制,【例7-13】LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY SINDATA ISPORT(address : IN STD_LOGIC_VECTOR (5 DOWNTO 0);inclock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END SINDATA;ARCHITECTURE SYN OF SINDATA ISSIGNAL sub_wire0: STD_LOGIC_VECTOR
28、 (7 DOWNTO 0);COMPONENT lpm_romGENERIC (lpm_width : NATURAL; lpm_widthad : NATURAL; lpm_address_control : STRING;,接上页lpm_outdata : STRING; lpm_file : STRING );PORT (address: IN STD_LOGIC_VECTOR (5 DOWNTO 0);inclock: IN STD_LOGIC ; q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END COMPONENT;BEGINq 8,LPM_WIDTH
29、AD = 6,LPM_ADDRESS_CONTROL = REGISTERED,LPM_OUTDATA = UNREGISTERED,LPM_FILE = D:/SIN_G/DATA/sin_data.mif )PORT MAP (address = address,inclock = inclock,q = sub_wire0);END SYN;,【例7-14】LIBRARY IEEE; -正弦信号发生器源文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SINGT IS PORT ( CLK : IN
30、STD_LOGIC; -信号源时钟 DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );-8位波形数据输出END;ARCHITECTURE DACC OF SINGT ISCOMPONENT SINDATA -调用波形数据存储器LPM_ROMATAROM.VHD声明 PORT(address : IN STD_LOGIC_VECTOR (5 DOWNTO 0); inclock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END COMPONENT;,4. 完成正弦信号发生器顶层设计和测试,接上
31、页 SIGNAL Q1 : STD_LOGIC_VECTOR (5 DOWNTO 0); -设定内部节点作为地址计数器 BEGINPROCESS(CLK ) -LPM_ROM地址发生器进程 BEGIN IF CLKEVENT AND CLK = 1 THEN Q1Q1, q = DOUT,inclock=CLK);-例化END;,7.6.5 编辑定制LPM_FIFO模块,图7-28 选择FIFO数据位宽为8,深度为512,7.6 LPM模块的VHDL文本方式调用,7.6.5 编辑定制LPM_FIFO模块,7.6 LPM模块的VHDL文本方式调用,图7-29 7-19 fifo端口设置,7.6.
32、5 编辑定制LPM_FIFO模块,7.6 LPM模块的VHDL文本方式调用,图7-30 选择Area优化方式和EAB构建,7.6.5 编辑定制LPM_FIFO模块,7.6 LPM模块的VHDL文本方式调用,图7-31单击“Finish”后完成fifo2.vhd的定制,7.6.6 LPM_FIFO定制文件的仿真测试,【例7-15】 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY fifo2 IS PORT(data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -输入数据 wrreq : IN STD_LOGIC ; -写入请求 rdreq : IN STD_LOGIC ; -读出请求 clock : IN STD_LOGIC ; -工作时钟 aclr : IN STD_LOGIC ; -异步清0 q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -数据输出 full : OUT STD_LOGIC ); -溢出标志END fifo2;ARCHITECTURE SYN OF fifo2 IS SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL sub_wire1 : STD_LOGIC ;,