第七章 状态机设计

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 63

EDA 技术实用教

第7章
有限状态机设计
康芯科技
KX
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) ;
康芯科技
KX
7.1 一般有限状态机的设计

7.1.1 用户自定义数据类型定义语句

TYPE m_state IS ( st0 , st1 , st2 , st3 , 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' ;
康芯科技
KX
7.1 一般有限状态机的设计

7.1.1 用户自定义数据类型定义语句

子类型 SUBTYPE 的语句格式如下:

SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范


围;

SUBTYPE digits IS INTEGER RANGE 0 to 9 ;


康芯科技
KX
7.1 一般有限状态机的设计

7.1.2 为什么要使用状态机

 有限状态机克服了纯硬件数字系统顺序方式控制不灵
活的缺点。
 状态机的结构模式相对简单。

 状态机容易构成性能良好的同步时序逻辑模块。

 状态机的 VHDL 表述丰富多样。

 在高速运算和控制方面,状态机更有其巨大的优势

 就可靠性而言,状态机的优势也是十分明显的。
康芯科技
KX
7.1 一般有限状态机的设计

7.1.3 一般有限状态机的设计

1. 说明部分 ARCHITECTURE ...IS


TYPE FSM_ST IS (s0 , s1 , s2 , s3);
SIGNAL current_state, next_state:
FSM_ST;
2. 主控时序进程 ...

FSM: s_machine

current_state PROCESS
PROCESS
clk
REG COM
comb_outputs
reset next_state

state_inputs

图 7-1 一般状态机结构框图工作示意图
康芯科技
KX
7.1.3 一般有限状态机的设计

3. 主控组合进程

控组合进程的任务是根据外部输入的控制信号(包
括来自状态机外部的信号和来自状态机内部其它非主控
的组合或时序进程的信号),或(和)当前状态的状态
值确定下一状态( next_state )的取向,即
next_state 的取值内容,以及确定对外输出或对内部
其它组合或时序进程输出控制信号的内容。
康芯科技
KX
7.1.3 一般有限状态机的设计
4. 辅助进程
【例 7-1 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY 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 reset = '1' THEN current_state <= s0;

ELSIF clk='1' AND clk'EVENT THEN


current_state <= next_state;
END IF;
END PROCESS;
康芯科技
KX
接上页
BEGIN
CASE current_state IS
WHEN s0 => comb_outputs<= 5;
IF state_inputs = "00" THEN next_state<=s0;

ELSE next_state<=s1;
END IF;
WHEN s1 => comb_outputs<= 8;
IF state_inputs = "00" THEN next_state<=s1;
ELSE next_state<=s2;
END IF;
WHEN s2 => comb_outputs<= 12;
IF state_inputs = "11" THEN next_state <= s0;
ELSE next_state <= s3;
END IF;
WHEN s3 => comb_outputs <= 14;
IF state_inputs = "11" THEN next_state <= s3;
ELSE next_state <= s0;
END IF;
END case;
END PROCESS;
END behv;
康芯科技
KX
7.1.3 一般有限状态机的设计
4. 辅助进程

图 7-2 例 7-1 状态机的工作时序图


康芯科技
KX
康芯科技
KX

 VHDL 综合器易于优化
 易构成性能良好的时序逻辑模块
 结构模式简单、层次分明、易读易懂、易排错
 利用同步时序和全局时钟线可实现高速 FSM
 运行模式类似于 CPU ,易于进行顺序控制
 高可靠性,非法状态易控制
康芯科技
KX
7.2 Moore 型有限状态机的设计

7.2.1 三进程有限状态机

表 7-1 AD574 逻辑控制真值表( X 表示任意



CE CS RC K12/8 A0 工 作 状 态
0 X X X X 禁止
X 1 X X X 禁止
1 0 0 X 0 启动 12 位转换
1 0 0 X 1 启动 8 位转换
1 0 1 1 X 12 位并行输出有效
1 0 1 0 0 高 8 位并行输出有效
1 0 1 0 1 低 4 位加上尾随 4 个 0 有

康芯科技
KX
7.2.1 三进程有限状态机

图 7-3 AD574 工作时



康芯科技
KX
7.2.1 三进程有限状态机

图 7-4 AD574 工作时序


康芯科技
7.2.1 三进程有限状态机
KX

图 7-5 采样状态机结构框图
康芯科技
KX
7.2.1 三进程有限状态机

【例 7-2 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY AD574 IS
PORT (D :IN STD_LOGIC_VECTOR(11 DOWNTO 0);
CLK ,STATUS : IN STD_LOGIC;-- 状态机时钟 CLK , AD574 状态信号
STATUS
LOCK0 : OUT STD_LOGIC; -- 内部锁存信号 LOCK 的测试信号
CS,A0,RC,K12X8 : OUT STD_LOGIC; --AD574 控制信号
Q : OUT STD_LOGIC_VECTOR(11 DOWNTO 0)); -- 锁存数据输出
END AD574;
ARCHITECTURE behav OF AD574 IS
TYPE states IS (st0, st1, st2, st3,st4);
SIGNAL current_state, next_state: states :=st0 ;
SIGNAL REGL : STD_LOGIC_VECTOR(11 DOWNTO 0);
SIGNAL LOCK : STD_LOGIC;
BEGIN
K12X8 <= '1'; LOCK0 <= LOCK ;
COM1: PROCESS(current_state,STATUS) -- 决定转换状态的进程
康芯科技
接上页
KX
BEGIN
CASE current_state IS
WHEN st0 => next_state <= st1;
WHEN st1 => next_state <= st2;
WHEN st2 => IF (STATUS='1') THEN next_state <= st2;
ELSE next_state <= st3;
END IF ;
WHEN st3=> next_state <= st4;
WHEN st4=> next_state <= st0;

WHEN OTHERS => next_state <= st0;


END CASE ;
END PROCESS COM1 ;
COM2: PROCESS(current_state) -- 输出控制信号的进程
BEGIN
CASE current_state IS
WHEN st0=> CS<='1'; A0<='1';RC<='1';LOCK<='0'; -- 初始化
WHEN st1=> CS<='0'; A0<='0';RC<='0';LOCK<='0'; -- 启动 12 位转换

WHEN st2=> CS<='0'; A0<='0';RC<='0';LOCK<='0'; -- 等待转换


WHEN st3=> CS<='0'; A0<='0';RC<='1';LOCK<='0'; --12 位并行输出有效

WHEN st4=> CS<='0'; A0<='0';RC<='1';LOCK<='1'; -- 锁存数据


康芯科技
KX
接上页

END CASE ;
END PROCESS COM2 ;
REG: PROCESS (CLK) -- 时序进程
BEGIN
IF ( CLK'EVENT AND CLK='1') THEN current_state <=
next_state;
END IF;
END PROCESS REG;
LATCH1 : PROCESS (LOCK) -- 数据锁存器进程
BEGIN
IF LOCK='1' AND LOCK'EVENT THEN REGL <= D ;
END IF;
END PROCESS ;
Q <= REGL;
END behav;
康芯科技
KX
7.2.1 三进程有限状态机

图 7-6 AD574 采样状态机工作时序


康芯科技
KX
7.2.1 三进程有限状态机

【例 7-3 】
COM: PROCESS(current_state,STATUS)
BEGIN
CASE current_state IS
WHEN st0=> next_state <= st1; CS<='1';
A0<='1';RC<='1';LOCK<='0';
WHEN st1=> next_state <= st2; CS<='0';
A0<='0';RC<='0';LOCK<='0';
WHEN st2 => IF (STATUS='1') THEN next_state <= st2;
ELSE next_state <= st3;
END IF ; CS<='0'; A0<='0';RC<='0';LOCK<='0';
WHEN st3=> next_state <= st4; CS<='0';
A0<='0';RC<='1';LOCK<='0';
WHEN st4=> next_state <= st0; CS<='0';
A0<='0';RC<='1';LOCK<='1';

WHEN OTHERS => next_state <= st0; END CASE ;


END PROCESS COM ;
康芯科技
KX
FPGA/CPLD
LOCK
状态机 FSM

PROCESS current_state PROCESS PROCESS


REG COM LATCH
next_state
时序进程 组合进程 锁存器

CLK AD574
CS
A0
模拟信号输入 RC Q[11..0]
K12/8
STATUS 采样数据输出
D[11..0]
康芯科技
状态机 VHDL 源程序 KX
END IF ;
WHEN st3=> CS<='0'; A0<='0';
RC<='1'; LOCK<='0';
LIBRARY IEEE; next_state <= st4;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY AD574 IS
WHEN st4=> CS<='0'; A0<=’1';
PORT(D :IN STD_LOGIC_VECTOR(11 DOWNTO 0); RC<='1'; LOCK<='1';
CLK ,STATUS : IN STD_LOGIC; next_state <= st0;
CS,A0,RC,K12X8 : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(11 DOWNTO 0));
END AD574; WHEN OTHERS => next_state <= st0;
ARCHITECTURE behav OF AD574 IS
TYPE states IS (st0, st1, st2, st3,st4);
SIGNAL current_state, next_state: states ; END CASE ;
SIGNAL REGL :STD_LOGIC_VECTOR(11 DOWNTO END PROCESS COM ;
0);
SIGNAL LOCK : STD_LOGIC; REG : PROCESS (CLK)
BEGIN BEGIN
COM: PROCESS(current_state,STATUS)
BEGIN
IF ( CLK'EVENT AND CLK='1')
THEN
CASE current_state IS current_state <=
WHEN st0 => CS<='1'; A0<='0'; next_state;
RC<='0'; LOCK<='0'; END IF;
next_state <= st1; END PROCESS REG;
WHEN st1=> CS<='0'; A0<='0';
RC<='0'; LOCK<='0';
next_state <= st2; LATCH : PROCESS (LOCK)
BEGIN
WHEN st2=> CS<='0'; A0<='0'; IF LOCK='1' AND LOCK'EVENT
RC<='0'; LOCK<='0'; THEN REGL <= D ;
IF (STATUS='1') THEN END IF;
next_state <= st2;
ELSE next_state <= st3;
END PROCESS ;
Q <= REGL;
康芯科技
KX

状态机 RTL 电路图


康芯科技
KX
状态机工作时序图

状态 2 :等待
康芯科技
KX
7.2.2 单进程 Moore 型有限状态机

【例 7-4 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.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 <= ST0 ; Q<= "0000" ;
ELSIF CLK'EVENT AND CLK='1' THEN
接下页
康芯科技
KX
接上页
CASE C_ST IS
WHEN ST0 => IF DATAIN ="10" THEN C_ST <= ST1 ;
ELSE C_ST <= ST0 ; END IF;
Q <= "1001" ;
WHEN ST1 => IF DATAIN ="11" THEN C_ST <= ST2 ;
ELSE C_ST <= ST1 ;END IF;
Q <= "0101" ;
WHEN ST2 => IF DATAIN ="01" THEN C_ST <= ST3 ;
ELSE C_ST <= ST0 ;END IF;
Q <= "1100" ;
WHEN ST3 => IF DATAIN ="00" THEN C_ST <= ST4 ;
ELSE C_ST <= ST2 ;END IF;
Q <= "0010" ;
WHEN ST4 => IF DATAIN ="11" THEN C_ST <= ST0 ;
ELSE C_ST <= ST3 ;END IF;
Q <= "1001" ;
WHEN OTHERS => C_ST <= ST0;
END CASE;
END IF;
END PROCESS;
END behav;
康芯科技
KX
7.2.2 单进程 Moore 型有限状态机

图 7-7 例 7-4 状态机综合后的 RTL 电路模块



康芯科技
KX
7.2.2 单进程 Moore 型有限状态机

图 7-8 例 7-4 单进程状态机工作时序


康芯科技
KX
7.2.2 单进程 Moore 型有限状态机

图 7-9 对应于例 7-4 的 2 进程状态机工作时序



康芯科技
KX
7.3 Mealy 型有限状态机的设计

【例 7-5 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MEALY1 IS
PORT ( CLK ,DATAIN,RESET : IN STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(4 DOWNTO 0));
END MEALY1;
ARCHITECTURE behav OF MEALY1 IS
TYPE states IS (st0, st1, st2, st3,st4);
SIGNAL STX : states ;
BEGIN
COMREG : PROCESS(CLK,RESET) BEGIN -- 决定转换状态的进程
IF RESET ='1' THEN
STX <= ST0;
ELSIF CLK'EVENT AND CLK = '1' THEN

接下页
CASE STX IS 康芯科技
WHEN st0 => IF DATAIN = '1' THEN STX <= st1; KXIF;
END
WHEN st1 => IF DATAIN = '0' THEN STX <= st2; END IF;
WHEN st2 => IF DATAIN = '1' THEN STX <= st3; END IF;
WHEN st3=> IF DATAIN = '0' THEN STX <= st4; END IF;
WHEN st4=> IF DATAIN = '1' THEN STX <= st0; END IF;
WHEN OTHERS => STX <= st0;
END CASE ;
END IF;
END PROCESS COMREG ;
COM1: PROCESS(STX,DATAIN) BEGIN -- 输出控制信号的进程
CASE STX IS
WHEN st0 => IF DATAIN = '1' THEN Q <= "10000" ;
ELSE Q<="01010" ;
END IF ;
WHEN st1 => IF DATAIN = '0' THEN Q <= "10111" ;
ELSE Q<="10100" ;
END IF ;
WHEN st2 => IF DATAIN = '1' THEN Q <= "10101" ;
ELSE Q<="10011" ;
END IF ;
WHEN st3=> IF DATAIN = '0' THEN Q <= "11011" ;
ELSE Q<="01001" ;
END IF ;
接上页 康芯科技
KX
WHEN st4=> IF DATAIN = '1' THEN Q <= "11101" ;
ELSE Q<="01101" ;
END IF ;

WHEN OTHERS => Q<="00000" ;


END CASE ;
END PROCESS COM1 ;
END behav;

图 7-10 例 7-5 状态机工作时序


康芯科技
KX
【例 7-6 】 MEALY2
LIBRARY IEEE; --MEALY FSM
USE 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
TYPE 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 <= ST0;
ELSIF CLK'EVENT AND CLK = '1' THEN
CASE STX IS
WHEN st0 => IF DATAIN = '1' THEN STX <= st1; END IF;
WHEN st1 => IF DATAIN = '0' THEN STX <= st2; END IF;

WHEN st2 => IF DATAIN = '1' THEN STX <= st3; END IF;
WHEN st3=> IF DATAIN = '0' THEN STX <= st4; END IF;
接下页
WHEN st4=> IF DATAIN = '1' THEN STX <= st0; END IF;
康芯科技
END IF;
KX
END PROCESS COMREG ;
COM1: PROCESS(STX,DATAIN,CLK) -- 输出控制信号的进程
VARIABLE Q2 : STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
CASE STX IS
WHEN st0 => IF 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 IF ;
WHEN OTHERS => Q2:="00000" ;
END CASE ; 接下页
接上页 康芯科技
KX
IF CLK'EVENT AND CLK = '1' THEN Q1<=Q2; END IF;
END PROCESS COM1 ;
Q <= Q1 ;
END behav;

图 7-11 例 7-6 状态机工作时序


康芯科技
KX
7.4 状态编码

7.4.1 状态位直接输出型编码
表 7-2 控制信号状态编码

状 态 编 码
状态 CS A0 R LOCK B 功 能 说 明
C
ST0 1 1 1 0 0 初始态。
ST1 0 0 0 0 0 启动转换,若测得 STATUS=0 时,转下一状态 ST2。
ST2 0 0 0 0 1 若测得 STATUS=0 时,转下一状态 ST3。
ST3 0 0 1 0 0 输出转换好的数据。
ST4 0 0 1 1 0 利用 LOCK 的上升沿将转换好的数据锁存。

每一位的编码值都赋予了实际的控制功能,即:
CS = current_state ( 4 ) ; A0 =
current_state ( 3 ) ;
RC = current_state ( 2 ) ; LOCK =
康芯科技
KX
【例 7-7 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY AD574A IS
PORT ( D : IN STD_LOGIC_VECTOR(11 DOWNTO 0);
CLK ,STATUS : IN STD_LOGIC;
OUT4 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
Q : OUT STD_LOGIC_VECTOR(11 DOWNTO 0) );
END AD574A;
ARCHITECTURE behav OF AD574A IS
SIGNAL current_state, next_state: STD_LOGIC_VECTOR(4 DOWNTO 0 );
CONSTANT st0 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "11100" ;
CONSTANT st1 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00001" ;
CONSTANT st2 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00000" ;
CONSTANT st3 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00100" ;
CONSTANT st4 : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00110" ;
SIGNAL REGL : STD_LOGIC_VECTOR(11 DOWNTO 0);
SIGNAL LK : STD_LOGIC;
BEGIN
COM1: PROCESS(current_state,STATUS) -- 决定转换状态的进程

接下页
康芯科技
BEGIN
KX
CASE current_state IS
WHEN st0 => next_state <= st1;
WHEN st1 => next_state <= st2;
WHEN st2 => IF (STATUS='1') THEN next_state <= st2;
ELSE next_state <= st3;
END IF ;
WHEN st3=> next_state <= st4;
WHEN st4=> next_state <= st0;
WHEN OTHERS => next_state <= st0;
END CASE ;
OUT4 <= current_state(4 DOWNTO 1);
END PROCESS COM1 ;
REG: PROCESS (CLK) -- 时序进程
BEGIN
IF ( CLK'EVENT AND CLK='1') THEN
current_state <= next_state;
END IF;
END PROCESS REG;
LK <= current_state(1) ;
LATCH1 : PROCESS ( LK ) -- 数据锁存器进程
BEGIN
IF LK='1' AND LK'EVENT THEN
REGL <= D ; 接下页
康芯科技
接上页 KX
END IF;
END PROCESS ;
Q <= REGL;
END behav;

图 7-12 例 7-7 状态机工作时序



康芯科技
7.4.2 顺序编码
KX
表 7-3 编码方式
状 态 顺序编码 一位热码编码
STATE0 000 100000
STATE1 001 010000
STATE2 010 001000
STATE3 011 000100
STATE4 100 000010
STATE5 101 000001

【例 7-8 】
...
SIGNAL CRURRENT_STATE,NEXT_STATE: STD_LOGIC_VECTOR(2 DOWNTO
0 );
CONSTANT ST0 : STD_LOGIC_VECTOR(2 DOWNTO 0) := "000" ;
CONSTANT ST1 : STD_LOGIC_VECTOR(2 DOWNTO 0) := "001" ;
CONSTANT ST2 : STD_LOGIC_VECTOR(2 DOWNTO 0) := "010" ;
CONSTANT ST3 : STD_LOGIC_VECTOR(2 DOWNTO 0) := "011" ;
CONSTANT ST4 : STD_LOGIC_VECTOR(2 DOWNTO 0) := "100" ;
康芯科技
7.4.3 一位热码编码( One-hot encoding ) KX

状态机编码方式设置

图 7-13 一位热码编码方式选择窗
康芯科技
KX
7.5 状态机剩余状态处理

表 7-4 剩余状态

状态 顺序编码
st0 000
st1 001
st2 010
st3 011
st4 100
st_ilg1 101
st_ilg2 110
st_ilg3 111
康芯科技
【例 7-9 】
KX
...
TYPE states IS (st0,
st1,st2,st3 , st4 , st_ilg1 , st_ilg2 , st_ilg3);
SIGNAL current_state, next_state: states;
...
COM : PROCESS(current_state, state_Inputs) -- 组合逻辑进程
BEGIN
CASE current_state IS -- 确定当前状态的状态值
...
WHEN OTHERS => next_state <= st0;
END case;

【例 7-10 】
...
alarm <= (st0 AND (st1 OR st2 OR st3 OR st4 OR st5)) OR
(st1 AND (st0 OR st2 OR st3 OR st4 OR st5)) OR
(st2 AND (st0 OR st1 OR st3 OR st4 OR st5)) OR
(st3 AND (st0 OR st1 OR st2 OR st4 OR st5)) OR
(st4 AND (st0 OR st1 OR st2 OR st3 OR st5)) OR
(st5 AND (st0 OR st1 OR st2 OR st3 OR st4)) ;
康芯科技
KX

状态机
康芯科技
KX
康芯科技
KX
实 验

实验 7-1 用状态机实现序列检测器的设计

( 1 )实验目的: ( 2 )实验原理
用状态机实现 :
序列检测器的设计 序列检测器
,并对其进行仿真 的工作原理已
和硬件测试。 在 习 题 7-3 中
作了说明。
康芯科技
KX
实 验
实验 7-1 用状态机实现序列检测器的设计

( 3 )实验内容 1 :
仔细完成习题 7-3 的全部内容,利用 MAX+plusII 对例
7-11 进行文本编辑输入、仿真测试并给出仿真波形,了解
控制信号的时序,最后进行引脚锁定并完成硬件测试实验

建议用键 7 ( PIO11 )控制复位信号 CLR ;键 6 ( PIO9 )
控制状态机工作时钟 CLK ;待检测串行序列数输入 DIN 接
PIO10 (左移,最高位在前);指示输出 AB 接 PIO39 ~
PIO36 (显示于数码管 6 )。下载后:①按实验板“系统复位”
键;②用键 2 和键 1 输入 2 位十六进制待测序列数“ 11100101”
;③按键 7 复位(平时数码 6 指示显“ B” ); 4 、按键 6(CLK)
8 次,这时若串行输入的 8 位二进制序列码(显示于数码 2/1 和发
光管 D8 ~ D0 )与预置码“ 11100101” 相同,则数码 6 应从原来
的 B 变成 A ,表示序列检测正确,否则仍为 B 。
康芯科技
KX
实 验
实验 7-1 用状态机实现序列检测器的设计

( 5 )实验思考题
( 4 )实验内容 2 :
: ( 6 )实验报告:
根据习题 7-3 如果待检测 根据以上的实
中的习题要求 3 预置数必须以右 验内容写出实验
,提出的设计方 移方式进入序列 报告,包括设计
案重复以上实验 检测器,写出该 原理、程序设计
内容(将 8 位待 检 测 器 的 VHDL 、程序分析、仿
检测预置数由键 4 代码(两进程符 真分析、硬件测
/ 键 3 作为外部输 号化有限状态机 试和详细实验过
入,从而可随时 ),并提出测试 程。
改变检测密码) 该序列检测器的
。 实验方案。
康芯科技
KX
实 验
实验 7-2 用状态机对 ADC0809 的采样控制电路实

( 1 )实验目的:学习用状态机对 A/D 转换器 ADC0809 的


采样控制电路的实现。

( 2 )实验原理: ADC0809 的采样控制原理已在习题 7-6 中


作了详细说明。

( 3 )实验内容:利用 MAX+plusII 对例 7-12 进行文本编


辑输入和仿真测试;给出仿真波形。最后进行引脚锁定并进
行测试,硬件验证例 7-12 电路对 ADC0809 的控制功能。
康芯科技
KX
实 验
实验 7-2 用状态机对 ADC0809 的采样控制电路实

测 试 步 骤 : 根 据 附 图 1-12 , 建 议 引 脚 锁 定 为 : START 接
PIO34 , OE 接 PIO35 , EOC 接 PIO8 , ALE 接 PIO33 ,状
态机时钟 CLK 接 clock0 ( PIN2 ,可选“ 65536Hz” 或更高
) , ADDA 接 PIO32 ( ADDB 和 ADDC 都 接
GND ), ADC0809 的 8 位输出数据线接 PIO23 ~ PIO16 ,
锁存输出 Q 显示于数码 8/ 数码 7 ( PIO47 ~ PIO40 ),
设 目 标 器 件 是 EPF10K10 , 建 议 选 择 实 验 电 路 结 构 图
NO.5 ( 即 结 构 图 NO.5A , 附 图 1-12 , 由 该 图 可
见, ADC0809 的转换时钟 CLK 已经事先接有 750KHz 的频率
),将实验系统左下角选择插针处的“转换结束”和“ A/D 使
能”用跳线幅短接。下载目标文件后,可用螺丝刀旋转实验系
统左下角的电位器,以便为 ADC0809 提供变化的待测模拟信
号,这时数码管 8 和 7 将显示 ADC0809 采样输出并被锁存的
数字值( 16 进制)。
康芯科技
KX

实验板中 ADC0809
电路原理图,注意
与目标器件的连接
方法
康芯科技
KX

选择实验电路
模式 5 !
康芯科技
KX

根据此表锁
定引脚
康芯科技
KX

0809 将 0-5V 输入
模拟电压通过
FPGA 中的状态机
转换输出为 16 进
制数:“ 9D”
ADC0809

旋转此电位器
可改变 0809 的
输出
康芯科技
KX

注意转换输出
已改变为: 7C
康芯科技
KX

注意,此项实验必须将此 2 拨
码向下拨,功能请参考使用
说明。实验结束后,将它们
向上拨回原位
康芯科技
KX
实 验

实验 7-2 用状态机对 ADC0809 的采样控制电路实


( 4 )实验思考题:在不改变原代码功能的条件下将例 7-12
表达成用状态码直接输出型的状态机。

( 5 )实验报告:根据以上的实验要求、实验内容和实验思
考题写出实验报告。
康芯科技
KX
实 验
实验 7-3 含有 FIFO 存储器的 A/D 采样控制电路设

( 1 )实验目的:掌握 LPM 模块 VHDL 元件定制、调用和使用方法;熟悉
含有 LPM 模块的 VHDL 电路描述程序的设计、编译和硬件实验流程;了解
HDL 文本描述与原理图混合设计方法(注,本实验应在完成第 8 章的学习后
进行)。
( 2 )实验原理:在第 8 、 10 小节中,对含有 FIFO 的 A/D 采样控制电路
系统 AD_FIFO 的工作原理作了详细的说明,并给出了它的原理图(图 8-3
)及其 VHDL 程序,(例 8-25 )。

( 3 )实验内容 1 :根据第 8 章第 10 节的电路原理描述和设计流程, A/D


采样控制电路 AD_FIFO 进行系统设计和仿真测试,给出例 8-25 详细的采
样 / 读数仿真波形。这里假设在采样周期中完成了 10 个点的采样操作,并
已将所有数据写入 FIFO 中,而在读数周期中按 FIFO 的读写时序规律将所
有写入的数据随着 RD_EN 时钟的输入,由 Q[7..0] 输出。分析它们的时
序关系。
康芯科技
KX
实 验
实验 7-3 含有 FIFO 存储器的 A/D 采样控制电路设

( 4 )实验内容 2 :硬件实验测试按照本章实验 2 给出的实验板设置方法


进行。适当控制状态机工作时钟 CLK 的频率, 0809 的模拟信号输入仍然
使用电位器输出,其间,使一次采样周期中的采样点数不超过 512 个,然
后通过键控进入 FIFO 读数周期,使数码管显示在采样过程中写入的数据

( 5 ) 实 验 内 容 3 : 使 用 HDL 文 本 描 述 与 原 理 图 混 合 设 计 方 法 设 计
AD_FIFO 。首先利用 MAX+plusII 文本编辑器打开文件 ADCINT :例 7-
12 。 如 图 7-16 所 示 , 选 择 File 下 拉 菜 单 中 的 Create Default
Symbol (生成默认元件符号)选项,如果原文件没有错误,即出现如图
7-17 所示界面,表示 ADCINT 元件成功生成,然后打开图形编辑器,分
别从元件库中调入元件 lpm_fifo 、 not 反相器、多路选择器 21mux 和
生成的元件 ADCINT 。最后连接成如图 8-3 的原理图,此后的处理方式与
第 4 章中介绍的方法和流程完全一致。
康芯科技
KX
实 验
实验 7-3 含有 FIFO 存储器的 A/D 采样控制电路设

图 7-16 选项使当前文件成为一个原理图元件入库
康芯科技
KX
实 验
实验 7-3 含有 FIFO 存储器的 A/D 采样控制电路设

图 7-17 ADCINT 元件成功生成


康芯科技
KX
实 验
实验 7-3 含有 FIFO 存储器的 A/D 采样控制电路设

( 6 )实验内容 4 :在原设计的基础上插入一个写入数排序计数器,以便在
读出时可以显示任一数据的写入序号。此外利用 FIFO 写数溢出信号 FULL
作为一个控制信号,当写入的数据大于 512 时,禁止写入,即禁止 CLK 信号
。完善例 8-25 ,给出含有本实验要求的完整 VHDL 程序以及该程序的工作波
形,然后进行硬件实验。

( 7 )附加实验内容:用第 8 、 10 节中用 lpm_ram_dq 模块定制的 RAM1


取代例 8-25 中的 FIFO2 ,给出相应的 VHDL 设计。为了缩短数据写入时间
,应该设计两个有限状态机,让它们分别完成 A/D 的采样和 RAM 的数据读
写。
( 8 )实验思考题:假如不考虑 ADC0809 和目标器件的速度限制,设图 8-3
中 CLK 的频率是 50MHz ,问此时 ADC0809 的采样速率是多少(每秒采样点
数)?

( 9 )实验报告:根据以上的要求完成实验报告。

You might also like