1、EDA技术与VHDL,第8章 有限状态机设计技术,KX康芯科技,在数字电路系统中,有限状态机是一种十分重要的时序逻辑电路模块。 有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。一般来说,除了输入部分和输出部分外,有限状态机还含有一组状态寄存器,记忆有限状态机的内部状态。状态寄存器的下一个状态不仅与输入信号有关,而且还与该寄存器的当前状态有关,因此有限状态机又可以认为是组合逻辑和寄存器逻辑(时序)的一种组合。其中,寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑又可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的
2、输出。,8.1 VHDL一般状态机,KX康芯科技,在应用中,有限状态机分为Moore型有限状态机和Mealy型有限状态机两种类型。1、Moore型有限状态机 其输出信号仅与当前状态有关,即可以把Moore型有限状态的输出看成同步输出。2 、Mealy型有限状态机 其输出信号不仅与当前状态有关,而且还与所有的输入信号有关,即可以把Mealy型有限状态机的输出看成是当前状态和所有输入信号的函数,它的输出是在输入变化后立即发生的,不依赖时钟的同步,属于异步输出。,8.1 VHDL一般状态机,KX康芯科技,8.1 VHDL一般状态机,8.1.1 类型定义语句TYPE,TYPE 数据类型名 IS 数据类
3、型定义 OF 基本数据类型 ; 或 TYPE 数据类型名 IS 数据类型定义 ;,TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_LOGIC ;-数组型数据类型 TYPE week IS (sun,mon,tue,wed,thu,fri,sat) ; -枚举类型,KX康芯科技,将表征每一状态的二进制数组用文字符号来代表,即状态符号化。,TYPE BOOLEAN IS (FALSE,TRUE) ;,8.1 VHDL一般状态机,8.1.1 类型定义语句TYPE,TYPE my_logic IS ( 1 ,Z ,U ,0 ) ;-直接用数值定义要加单引号SIGNAL s1
4、: my_logic ;s1 = Z ;,SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围;,SUBTYPE digits IS INTEGER RANGE 0 to 9 ;,综合过程中,枚举类型文字元素的编码通常自动设置,编码顺序默认。 编码方式会因综合器不同而不同,编码顺序也可人为设置。,TYPE m_state IS ( st0,st1,st2,st3,st4,st5 ) ;SIGNAL present_state,next_state : m_state ;,8.1 VHDL一般状态机,8.1.2 状态机的优势,1、状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点。
5、 2、由于状态机的结构相对简单,设计方案相对固定。 3、状态机容易构成性能良好的同步时序逻辑模块。 4、状态机的VHDL表述丰富多样、有其独到的好处。 5、在高速运算和控制方面,状态机更有其巨大的优势。 6、高可靠性。,8.1 VHDL一般状态机,8.1.3 一般状态机的结构,1. 说明部分,说明部分一般放在结构体的ARCHITECTURE 和BEGIN之间,例如: ARCHITECTURE .ISTYPE FSM_ST IS (s0,s1,s2,s3); SIGNAL current_state, next_state: FSM_ST; .,8.1 VHDL一般状态机,8.1.3 一般状态机
6、的结构,2. 主控时序进程,负责状态机运转和在时钟驱动下的状态转换,随外部时钟信号,以同步时序方式工作。,3. 主控组合进程,通过current_state 的改变,进入主控组合进程,根据外部输入信号确定输出和下一状态的走向(next_state)。,8.1 VHDL一般状态机,图8-1 一般状态机结构框图,4. 辅助进程,配合状态机工作的组合进程或时序进程。,8.1.3 一般状态机的结构,【例8-1】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY s_machine ISPORT ( clk,reset : IN STD_LOGIC;st
7、ate_inputs : IN STD_LOGIC_VECTOR (0 TO 1);comb_outputs : OUT INTEGER RANGE 0 TO 15 ); END s_machine; ARCHITECTURE behv OF s_machine ISTYPE FSM_ST IS (s0, s1, s2, s3); -数据类型定义,状态符号化SIGNAL current_state, next_state: FSM_ST; -将现态和次态定义为新的数据类型,KX康芯科技,接下页,BEGINREG: PROCESS (reset, clk) -主控时序进程BEGINIF rese
8、t = 1 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;,KX康芯科技,8.1 VHDL一般状态机,图8-2 例8-1状态机的工作时序,8.2 Moore状态机设计,8.2.1 多进程状态机设计,图8-3 ADC0809工作时序,8.2 Moore状态机设计,8.2.1 多进程状态
9、机设计,图8-4 控制ADC0809采样状态图,8.2 Moore状态机设计,8.2.1 多进程状态机设计,图8-5 采样状态机结构框图,【例8-2】LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADCINT ISPORT(D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -来自0809转换好的8位数据 CLK : IN STD_LOGIC; -状态机工作时钟 EOC : IN STD_LOGIC; -转换状态指示,低电平表示正在转换 ALE : OUT STD_LOGIC; -8个模拟信号通道地址锁存信号 STAR
10、T : OUT STD_LOGIC; -转换开始信号 OE : OUT STD_LOGIC; -数据输出3态控制信号 ADDA : OUT STD_LOGIC; -信号通道最低位控制信号 LOCK0 : OUT STD_LOGIC; -观察数据锁存时钟 Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -8位数据输出 END ADCINT; ARCHITECTURE behav OF ADCINT IS TYPE states IS (st0, st1, st2, st3,st4) ; -定义各状态子类型SIGNAL current_state, next_state
11、: states :=st0 ;SIGNAL REGL : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL LOCK : STD_LOGIC; - 转换后数据输出锁存时钟信号,KX康芯科技,接下页,BEGIN ADDA ALEALE ALE ALE ALE next_state = st0; END CASE ;END PROCESS COM ;REG: PROCESS (CLK) BEGINIF (CLKEVENT AND CLK=1) THEN current_state=next_state; END IF;END PROCESS REG ; - 由信号curre
12、nt_state将当前状态值带出此进程:REGLATCH1: PROCESS (LOCK) - 此进程中,在LOCK的上升沿,将转换好的数据锁入BEGINIF LOCK=1 AND LOCKEVENT THEN REGL = D ; END IF;END PROCESS LATCH1 ; END behav;,KX康芯科技,8.2 Moore状态机设计,8.2.1 多进程状态机设计,图8-6 ADC0809采样状态机工作时序,【例8-3】 COM1: PROCESS(current_state,EOC) BEGIN CASE current_state IS WHEN st0= next_st
13、ate 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 ;,KX康芯科技,8.2 Moore状态机设计,8.2.2 单进程Moore状态机设计,图8-7 例8-4状态机综合后的部分主要RTL电路模块(Synplify综合),【例8-4】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MOORE1 ISPORT (DATA
14、IN :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 ISTYPE 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 DATAIN =“10“ THEN C_ST IF DATAIN =“11“ TH
15、EN C_ST IF DATAIN =“01“ THEN C_ST IF DATAIN =“00“ THEN C_ST IF DATAIN =“11“ THEN C_ST C_ST = ST0;END CASE;END IF;END PROCESS; END behav;,KX康芯科技,8.2 Moore状态机设计,8.2.2 单进程Moore状态机设计,图8-8 例8-4单进程状态机工作时序,8.2 Moore状态机设计,8.2.2 单进程Moore状态机设计,图8-9 对应于例8-4的二进程状态机工作时序图,8.3 Mealy状态机设计,图8-10 例8-5状态机工作时序图,【例8-5】
16、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 ISTYPE states IS (st0, st1, st2, st3,st4); SIGNAL STX : states ; BEGIN COMREG : PROCESS(CLK,RESET) BEGIN -决定转换状态的进程IF RE
17、SET =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 DATAIN = 1 THEN Q IF DATAIN = 0 THEN Q IF DATAIN = 1 THEN Q Q=“00000“ ; END CASE ;END PROCESS COM1 ; END behav;,KX康芯科技,【
18、例8-6】 LIBRARY IEEE; -MEALY FSM USE IEEE.STD_LOGIC_1164.ALL; ENTITY MEALY2 ISPORT ( CLK ,DATAIN,RESET : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); END MEALY2; ARCHITECTURE behav OF MEALY2 ISTYPE states IS (st0, st1, st2, st3,st4); SIGNAL STX : states ; SIGNAL Q1 : STD_LOGIC_VECTOR(4 DOWNTO 0
19、);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 Q2 :=“10000“; ELSE Q2:=“01010“; END IF;WHEN st1= IF DATAIN=0 THEN Q2 :=“10111“; ELSE Q2:=“1
20、0100“; 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 ;IF CLKEVENT AND CLK = 1 THEN Q1=Q2; END IF; END PR
21、OCESS COM1 ;Q = Q1 ; END behav;,KX康芯科技,8.3 Mealy状态机设计,图8-11 例8-6状态机工作时序图,8.4 状态机的状态编码,8.4.1 状态位直接输出型编码,表8-1 控制信号状态编码表,【例8-7】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY AD0809 IS . PORT (D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);CLK ,EOC : IN STD_LOGIC;ALE, START, OE, ADDA : OUT STD_LOGIC;c_state :
22、OUT STD_LOGIC_VECTOR(4 DOWNTO 0);Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END AD0809; ARCHITECTURE behav OF AD0809 IS SIGNAL current_state, next_state: STD_LOGIC_VECTOR(4 DOWNTO 0 );CONSTANT st0 : STD_LOGIC_VECTOR(4 DOWNTO 0) := “00000“ ;CONSTANT st1 : STD_LOGIC_VECTOR(4 DOWNTO 0) := “11000“ ;CONSTANT
23、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_VECTOR(7 DOWNTO 0);SIGNAL LOCK : STD_LOGIC; BEGINADDA = 1; Q = REGL; START=current_state(4); ALE=current_state(3);OE=
24、current_state(2); LOCK=current_state(1);c_state =current_state;COM: PROCESS(current_state,EOC) BEGIN -规定各状态转换方式CASE current_state IS,接下页,KX康芯科技,WHEN st0= 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) BEGINIF (CL
25、KEVENT AND CLK=1) THEN current_state=next_state;END IF;END PROCESS REG ; - 由信号current_state将当前状态值带出此进程:REGLATCH1: PROCESS (LOCK) - 此进程中,在LOCK的上升沿,将转换好的数据锁入BEGINIF LOCK=1 AND LOCKEVENT THEN REGL = D ;END IF;END PROCESS LATCH1 ; END behav;,KX康芯科技,8.4 状态机的状态编码,8.4.1 状态位直接输出型编码,图8-12 例8-7状态机工作时序图,8.4 状态
26、机的状态编码,8.4.2 顺序编码,表8-2 编码方式,8.4 状态机的状态编码,8.4.2 顺序编码,【例8-8】 . SIGNAL CURRENT_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 S
27、T3 : STD_LOGIC_VECTOR(2 DOWNTO 0) := “011“ ; CONSTANT ST4 : STD_LOGIC_VECTOR(2 DOWNTO 0) := “100“ ; .,8.4 状态机的状态编码,8.4.3 一位热码编码,图8-13 一位热码编码方式选择对话框,8.5 非法状态处理,表8-3 剩余状态,WHEN st_ilg1 = next_state next_state = st0; .,8.5 非法状态处理,【例8-9】 . TYPE states IS (st0, st1, st2, st3,st4, st_ilg1,st_ilg2 ,st_ilg3)
28、; SIGNAL current_state, next_state: states; . COM:PROCESS(current_state, state_Inputs) - 组合逻辑进程 BEGINCASE current_state IS - 确定当前状态的状态值.WHEN OTHERS = next_state = st0; END case;,8.5 非法状态处理,【例8-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(st
29、2 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) ;,习 题,8-1. 仿照例8-1,将例8-4用两个进程,即一个时序进程,一个组合进程表达出来。 8-2. 为确保例8-5的状态机输出信号没有毛刺,试用例8-4的方式构成一个单进程状态,使输出信号得到可靠锁存,在相同输入信号条件下,给出两程序的仿真波
30、形。8-3. 序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等都将回到初始状态重新开始检测。例8-11描述的电路完成对序列数“11100101”的检测,当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“A”,否则仍然输出“B”。,【例8-11】 LIBRARY IEEE ;
31、 USE IEEE.STD_LOGIC_1164.ALL; ENTITY SCHK ISPORT(DIN,CLK,CLR : IN STD_LOGIC; -串行输入数据位/工作时钟/复位信号AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -检测结果输出 END SCHK; ARCHITECTURE behav OF SCHK ISSIGNAL Q : INTEGER RANGE 0 TO 8 ;SIGNAL D : STD_LOGIC_VECTOR(7 DOWNTO 0); -8位待检测预置数(密码=E5H) BEGIND IF DIN = D(7) THEN Q
32、 IF DIN = D(6) THEN Q IF DIN = D(5) THEN Q IF DIN = D(4) THEN Q IF DIN = D(3) THEN Q IF DIN = D(2) THEN Q IF DIN = D(1) THEN Q IF DIN = D(0) THEN Q Q = 0 ;END CASE ;END IF ;END PROCESS ;PROCESS( Q ) -检测结果判断输出BEGINIF Q = 8 THEN AB = “1010“ ; -序列数检测正确,输出 “A”ELSE AB = “1011“ ; -序列数检测错误,输出 “B”END IF ;EN
33、D PROCESS ; END behav ;,KX康芯科技,习 题,图8-14 习题8-4状态图,8-4. 根据图8-14(a)所示的状态图,分别按照图8-4(b)和图8-14(c)写出对应结构的VHDL状态机。,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY EX8_4 ISPORT ( CLK, RESET : IN STD_LOGIC;INA : IN STD_LOGIC_VECTOR(2 DOWNTO 0);OUTA : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END EX8_4; ARCHITECT
34、URE ONE OF EX8_4 ISTYPE STATE IS (S0, S1, S2, S3);SIGNAL C_ST : STATE;,(b)单进程,BEGINPROCESS (CLK, RESET, INA)BEGINIF RESET = 1 THEN C_ST 0);ELSIF RISING_EDGE(CLK) THENCASE C_ST ISWHEN S0 = IF INA = “101“ THEN OUTA IF INA = “000“ THEN C_ST IF INA = “100“ THEN C_ST IF INA = “101“ THEN OUTA C_ST 0);END
35、CASE;END IF;END PROCESS; END ONE;,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY EX8_4 ISPORT (CLK, RESET : IN STD_LOGIC;INA : IN STD_LOGIC_VECTOR(2 DOWNTO 0);OUTA: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END EX8_4; ARCHITECTURE TWO OF EX8_4 ISTYPE STATE IS (S0, S1, S2, S3);SIGNAL C_ST, N_ST : STATE;
36、 BEGIN REG : PROCESS (CLK, RESET)BEGINIF RESET = 1 THEN C_ST = S0;ELSIF CLKEVENT AND CLK = 1 THENC_ST = N_ST;END IF;END PROCESS;,(c) 二进程,COM : PROCESS (C_ST, INA)BEGINCASE C_ST ISWHEN S0 = IF INA = “101“ THEN OUTA IF INA = “000“ THEN N_ST IF INA = “100“ THEN N_ST IF INA = “101“ THEN OUTA N_ST 0);END
37、 CASE;END PROCESS; END TWO;,习 题,8-5. 在不改变原代码功能的条件下用两种方法改写例8-2,使其输出的控制信号(ALE、START、OE、LOCK)没有毛刺。方法1:将输出信号锁存后输出;方法2:使用状态码直接输出型状态机,并比较这三种状态机的特点。,实 验 与 设 计,8-1. 序列检测器设计 (1) 实验目的:用状态机实现序列检测器的设计,了解一般状态机的设计与应用。 (2) 实验原理:序列检测器的工作原理已在习题8-3中作了说明。 (3) 实验内容1:仔细完成习题8-3的全部内容,利用QuartusII对例8-11进行文本编辑输入、仿真测试并给出仿真波形,
38、了解控制信号的时序,最后进行引脚锁定并完成硬件测试实验。 (4) 实验内容2:根据习题8-3中的要求3提出的设计方案,重复以上实验内容(将8位待检测预置数由键4/键3作为外部输入,从而可随时改变检测密码)。 (5) 实验思考题:如果待检测预置数必须以右移方式进入序列检测器,写出该检测器的VHDL代码(两进程符号化有限状态机),并提出测试该序列检测器的实验方案。 (6) 实验报告:根据以上的实验内容写出实验报告,包括设计原理、程序设计、程序分析、仿真分析、硬件测试和详细实验过程。,实 验 与 设 计,8-2. ADC0809采样控制电路实现 (1) 实验目的:学习用状态机对A/D转换器ADC08
39、09的采样控制电路的实现。 (2) 实验原理:ADC0809的采样控制原理已在8.2.1节中作了详细说明(实验程序用例8-2)。 (3) 实验内容:利用QuartusII对例8-2进行文本编辑输入和仿真测试;给出仿真波形。最后进行引脚锁定并进行测试,硬件验证例8-2电路对ADC0809的控制功能。 (4) 实验思考题:在不改变原代码功能的条件下将例8-2表达成用状态码直接输出型的状态机。(5) 实验报告:根据以上的实验要求、实验内容和实验思考题写出实验报告。,实 验 与 设 计,8-3. 数据采集电路和简易存储示波器设计 实验目的:掌握LPM RAM模块VHDL元件定制、调用和使用方法;熟悉A
40、/D和D/A与FPGA接口电路设计;了解HDL文本描述与原理图混合设计方法。 (2) 实验原理:主要内容参考本章和7.2节。 (3) 实验内容1:设ADDA=1;即模拟信号来自0809的IN1口(可用实验系统右下角的电位器产生被测模拟信号)完成此项设计,给出仿真波形及其分析,将设计结果在Cyclone中硬件实现,用QuartusII的在系统RAM/ROM数据编辑器了解采入RAM中的数据。 (4) 实验内容2:优化设计。仿真设计电路图8-15,检查此项设计得START信号是否有毛刺,如果有,改进ADCINT的设计(也可用其他方法),排除START的毛刺。,实 验 与 设 计,图8-15 ADC0
41、809采样电路系统:RSV.bdf,实 验 与 设 计,(5) 实验内容3:对电路图8-15完成设计和仿真后锁定引脚,进行硬件测试。参考实验8-2和7-1对0809和0832的引脚锁定:元件“ADCINT”引脚锁定参考实验8-2。WE用键1控制;为了实验方便,CLK接clock0,频率先选择64Hz(选择较慢的采样时钟),作状态机工作时钟。硬件实验中,建议选择电路模式No.5,打开+/-12V电源,首先使WE=1,即键1置高电平,允许采样,由于这时的程序中设置ADDA = 1,模拟信号来自AIN1,即可通过调协实验板上的电位器(此时的模拟信号是手动产生的),将转换好的数据采入RAM中;然后按键
42、1,使WE=0,clock0的频率选择16384Hz(选择较高时钟),即能从示波器中看见被存于RAM中的数据(可以首先通过QuartusII的RAM在系统读写器观察已采入RAM中的数据)。,实 验 与 设 计,(6) 实验内容4:程序中设置ADDA = 0,模拟信号将由AIN0进入,即AIN0的输入信号来自外部信号源的模拟连续信号。外部模拟信号可来自实验箱,方法如下: 首先打开+/-12V电源,将GW48主系统板右侧的“JL11”跳线座短路“L_F”端;跳线座“JP18”的“INPUT”端与系统右下角的时钟64Hz相接;并用一插线将插座“JP17”的“OUTPUT”端与实验箱最左侧的“JL10
43、”坐的“AIN0”端相接,这样就将64Hz待采样的模拟信号接入了0809的IN0端(注意,这时例8-2/12程序中设置ADDA = 0)。试调节“JP18”上方的电位器,使得主系统右侧的“WAVE OUT”端输出正常信号波形(用示波器监视,峰值调在4V以下)。 注意,如果要将采入(用CLK=64采样)RAM中的数据扫描显示到示波器上观察,必须用高频率时钟才行(clock0接16384Hz)。 可以使键1高电平是对模拟信号采样,低电平时示波器显示已存入RAM的波形数据。,实 验 与 设 计,(7) 实验内容5:仅按照以上方法,会发现示波器显示的波形并不理想,原因是从RAM中扫出的数据都不是一个完
44、整的波形周期。试设计一个状态机,结合被锁入RAM中的某些数据,改进元件CNT10B,使之存入RAM中的数据和通过D/A在示波器上扫出的数据都是一个或数个完整波形数据。 (8) 实验内容6:在图8-15的电路中增加一个锯齿波发生器,扫描时钟与地址发生器的时钟一致。锯齿波数据通过另一个D/A输出,控制示波器的X端(不用示波器内的锯齿波信号),而Y端由原来的D/A给出RAM中的采样信息,由此完成一个比较完整的存储示波器的显示控制。,实 验 与 设 计,【例8-12】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIG
45、NED.ALL; ENTITY CNT10B ISPORT (LOCK0,CLR : IN STD_LOGIC; CLK : IN STD_LOGIC;WE : IN STD_LOGIC;DOUT : OUT STD_LOGIC_VECTOR(8 DOWNTO 0);CLKOUT : OUT STD_LOGIC );END CNT10B; ARCHITECTURE behav OF CNT10B ISSIGNAL CQI : STD_LOGIC_VECTOR(8 DOWNTO 0);SIGNAL CLK0 : STD_LOGIC; BEGIN CLK0 = LOCK0 WHEN WE=1 EL
46、SECLK;PROCESS(CLK0,CLR,CQI)BEGINIF CLR = 1 THEN CQI = “000000000“;ELSIF CLK0EVENT AND CLK0 = 1 THEN CQI = CQI + 1; END IF;END PROCESS;DOUT = CQI; CLKOUT = CLK0; END behav;,实 验 与 设 计,8-4. 比较器和D/A器件实现A/D转换功能的电路设计 (1) 实验目的:学习较复杂状态机的设计。 (2) 实验原理:图8-19是一个用比较器LM311和DAC0832构成的8位A/D转换器的电路框图。其工作原理是:当被测模拟信号电压
47、vi接于LM311的“+”输入端时,由FPGA产生自小到大的搜索数据加于DAC0832后,LM311的“-”端将得到一个比较电压vc;当vcvi时,LM311输出低电平。在LM311输出由1到0的转折点处,FPGA输向0832数据必定与待测信号电压vi成正比。由此数即可算得vi的大小。(3) 实验内容1:例8-13是图8-16中FPGA的一个简单的示例性程序。,实 验 与 设 计,实验步骤如下:首先锁定引脚,编译。选择电路模式No.5,时钟CLK接clock0;CLR接键1;DD70分别接PIO31-PIO24;LM311比较信号接PIO37;显示数据DISPDATA70,可以由数码8和7显示
48、(PIO47-PIO40)。向FPGA下载文件后,打开+/-12V电源;clock0接65536Hz。将GW48 EDA系统左下角的拨码开关的4、5向下拨,其余向上。注意,拨码5向下后,能将FPGA的PIO37脚与LM311的输出端相接,这可以从电路模式No.5对应的电路中看出。由图还能看出,0832的输出端与LM311的“3”脚相连,而实验系统左下的输入口“AIN0”与LM311的“2”脚相连,因此被测信号可接于“AIN0”端。由于“AIN1”口与电位器相接,所以必须将“AIN1”与“AIN0”短接,“AIN0”就能获得电位器输出的作为被测信号的电压了。方法是将实验系统最左侧的跳线座“JL1
49、0”的“AIN0”和“AIN1”用短路帽短接。实验操作中,首先调谐电位器输出一个电压值,然后用CLR复位一次,接着即可从数码管上看到与被测电压成正比的数值。此后,每调谐电位器输出一个新的电压,就要复位一次,以便能从头搜索到这个电压值。,实 验 与 设 计,图8-16 比较器和D/A构成A/D电路框图,实 验 与 设 计,【例8-13】LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DAC2ADC ISPORT ( CLK : IN STD_LOGIC; -计数器时钟LM311
50、: IN STD_LOGIC; -LM311输出,由PIO37口进入FPGACLR : IN STD_LOGIC; -计数器复位DD : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ;-输向0832的数据DISPDATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );-转换数据显示 END; ARCHITECTURE DACC OF DAC2ADC ISSIGNAL CQI : STD_LOGIC_VECTOR(7 DOWNTO 0) ;BEGINDD = CQI ; PROCESS(CLK, CLR, LM311)BEGINIF CLR = 1 THEN CQI = “00000000“; ELSIF CLKEVENT AND CLK = 1 THENIF LM311 = 1 THEN CQI = CQI + 1; END IF;-如果是高电平,继续搜索END IF; -如果出现低电平,即可停止搜索,保存计数值于CQI中END PROCESS;DISPDATA = CQI WHEN LM311=0 ELSE “00000000“ ;-将保存于CQI中的数输出END;,