《第9章 FPGA在微机工程中实践应用.pptx》由会员分享,可在线阅读,更多相关《第9章 FPGA在微机工程中实践应用.pptx(70页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第1页9.1 键盘接口设计键盘接口设计9.2 LED驱动器设计驱动器设计9.3 D/A接口设计接口设计9.4 A/D接口设计接口设计 第第9章章 FPGA在微机工程中实践应用在微机工程中实践应用 第2页教学目标教学目标n了解键盘接口原理及设计方法了解键盘接口原理及设计方法n理解理解LED驱动器设计原理驱动器设计原理n理解和掌握理解和掌握D/A接口设计的主要内容接口设计的主要内容n理解和掌握理解和掌握A/D接口设计的主要内容接口设计的主要内容 第3页教学重点教学重点n理解理解LED驱动器设计驱动器设计n理解和掌握理解和掌握D/A接口设计的主要内容接口设计的主要内容n理解和掌握理解和掌握A/D接
2、口设计的主要内容接口设计的主要内容 第4页键盘工作原理键盘工作原理 l键盘是由一组规则排列的按键组成,一个按键实际上是一个开关元件,它是微型计算机最常用的输入设备。l微机键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。9.1键盘接口设计 第5页l在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。l硬件去抖动措施:在键数较少时,可
3、采用硬件去抖l软件去抖动措施:当键数较多时采用软件去抖。去抖动措施去抖动措施 第6页矩阵式键盘的结构及原理矩阵式键盘的结构及原理 该类型键盘由行线和列线组成,按键位于行、列线的交叉点上。由图9-2可知,一个44的行、列结构可以构成一个含有16个按键的键盘,但是只占用8个I/O口线,因此,矩阵式键盘较之独立式按键键盘可以节省很多I/O口。图9-2 第7页矩阵式键盘按键的识别矩阵式键盘按键的识别 l识别按键的方法很多,其中,最常见的方法是扫描法。l以下是以8号键的识别为例来介绍扫描法:l8号键按下时,第2行一定为低电平,然而,第2行为低电平时,能否肯定是8号键按下呢?回答是否定的,因为9、10、1
4、1号键按下同样使第2行为低电平。接下页 第8页l为进一步确定具体键,不能使所有列线在同一时刻都处在低电平,可在某一时刻只让一条列线处于低电平,其余列线均处于高电平,另一时刻,让下一列处在低电平,依此循环,这种依次轮流每次选通一列的工作方式称为键盘扫描。采用键盘扫描后,再来观察8号键按下时的工作过程,当第0列处于低电平时,第2行处于低电平,而第1、2、3列处于低电平时,第2行却处在高电平,由此可判定按下的键应是第2行与第0列的交叉点,即8号键。第9页l对于矩阵式键盘,按键的位置由行号和列号唯一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号。如图9.
5、2中的8号键,它位于第2行,第0列,因此,其键盘编码应为20H。采用上述编码对于不同行的键离散性较大,不利于散转指令对按键进行处理。因此,可采用依次排列键号的方式对安排进行编码。以图9-2中的44键盘为例,可将键号编码为:01H、02H、03H0EH、0FH、10H等16个键号。编码相互转换可通过计算或查表的方法实现。键盘的编码键盘的编码 第10页矩阵式按键矩阵式按键FPGA描述描述 键盘接口顶层模块 第11页library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSI
6、GNED.ALL;entity key is Port(clk:in std_logic;keyin:in std_logic_vector(3 downto 0);keyvalue:out std_logic_vector(3 downto 0);keypressed:out std_logic;keydrv:inout std_logic_vector(3 downto 0);end key;architecture Behavioral of key is接下页 第12页component keyscanport(clk_scan:in std_logic;-扫描时钟key_drv:ou
7、t std_logic_vector(3 downto 0)-扫描信号);end component;component clkgenport(clk:in std_logic;clk_scan:out std_logic);end component;接下页 第13页component keydecoderport(key_in:in std_logic_vector(3 downto 0);-键盘输入 key_drv:in std_logic_vector(3 downto 0);-键盘输出 clk:in std_logic;-全局时钟 clk_scan:in std_logic;-扫描时
8、钟keyvalue:out std_logic_vector(3 downto 0);-键盘的键值key_pressed:out std_logic);end component;signal clk_scan:std_logic;begin接下页 第14页keyscan1:keyscanport map(clk_scan=clk_scan,key_drv=keydrv);clkgen1:clkgenport map(clk=clk,clk_scan=clk_scan);keydecoder1:keydecoder port map(key_in=keyin,接下页 第15页key_drv=k
9、eydrv,clk=clk,clk_scan=clk_scan,keyvalue=keyvalue,key_pressed=keypressed);end Behavioral;第16页键盘扫描电路模块键盘扫描电路模块 接下页 第17页library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity keyscan is Port(clk_scan:in std_logic;-扫描时钟 key_drv:out std_logic_vector(
10、3 downto 0);end keyscan;architecture Behavioral of keyscan isconstant s0:STD_LOGIC_VECTOR(3 DOWNTO 0):=1110;constant s1:STD_LOGIC_VECTOR(3 DOWNTO 0):=1101;constant s2:STD_LOGIC_VECTOR(3 DOWNTO 0):=1011;接下页 第18页constant s3:STD_LOGIC_VECTOR(3 DOWNTO 0):=0111;signal present_state:STD_LOGIC_VECTOR(3 DOW
11、NTO 0);-当前状态机signal next_state:STD_LOGIC_VECTOR(3 DOWNTO 0);-下次状态机beginprocess(clk_scan)beginif(clk_scanevent and clk_scan=1)then present_statenext_statenext_statenext_statenext_statenext_state=s0;end case;end process;key_drv=present_state;-输出译码信号end Behavioral;第20页键盘译码电路模块键盘译码电路模块 接下页 第21页library I
12、EEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity keydecoder is Port(key_in:in std_logic_vector(3 downto 0);-键盘输入 key_drv:in std_logic_vector(3 downto 0);-键盘输出 clk:in std_logic;-全局时钟 clk_scan:in std_logic;-扫描时钟 keyvalue:out std_logic_vector(3 downto
13、0)-键盘的键值 );接下页 第22页key_pressed:out std_logic);-有键盘按下去的标志end keydecoder;architecture Behavioral of keydecoder issignal temp:STD_LOGIC_VECTOR(7 DOWNTO 0);-键盘的输入信号signal temp_preseed:STD_LOGIC;-键盘按下标志位signal temp1,temp2,temp3,temp4,temp5,temp6:STD_LOGIC;-同步化信号signal key_pressed_asy:STD_LOGIC;begintempk
14、eyvalue=CONV_STD_LOGIC_VECTOR(1,4);temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(2,4);temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(3,4);temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(4,4);temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(5,4);temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(6,4);temp_preseedkeyvalue=CONV
15、_STD_LOGIC_VECTOR(7,4);temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(8,4);2.temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(9,4);4.temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(10,4);6.temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(11,4);8.temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(12,4);10.temp_preseedkeyvalue=CO
16、NV_STD_LOGIC_VECTOR(13,4);12.temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(14,4);14.temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(15,4);temp_preseedkeyvalue=CONV_STD_LOGIC_VECTOR(16,4);temp_preseedtemp_preseed=0;end case;end process;接下页 第26页process(clk_scan)begin if(clk_scanevent and clk_scan=1)then temp1
17、=temp_preseed;temp2=temp1;temp3=temp2;temp4=temp3;end if;key_pressed_asy=temp1 OR temp2 OR temp3 OR temp4;end process;接下页 第27页process(clk)beginif(clkevent and clk=1)thentemp5=key_pressed_asy;temp6=temp5;end if;key_pressed=temp5 AND(NOT(temp6);end process;end Behavioral;第28页时钟电路产生模块时钟电路产生模块 接下页 第29页l
18、ibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity clkgen is Port(clk:in std_logic;clk_scan:out std_logic );end clkgen;architecture Behavioral of clkgen is接下页 第30页signal cnt:INTEGER range 0 to 199;beginprocess(clk)beginif(clkevent and clk=1)th
19、enif(cnt=199)thencnt=0;elsecnt=199/2)then clk_scan=1;else clk_scan q3 q3 q3 q3 q3 q3 q3 q3 q3 q3 q3=X17D783F)thendivcounter=X0000000;divclk=not divclk;elsedivcounter=X“9”)thensec_counter1=X5)thensec_counter2=X9)thenmin_counter1X5)thenmin_counter2=X0;elsein_counter2=min_counter2+1;end if;elsemin_coun
20、ter1=min_counter1+1;end if;接下页 第45页 else sec_counter2=sec_counter2+1;end if;elsesec_counter1=sec_counter1+1;end if;end if;end process;process(clk)beginif(clkevent and clk=1)thenscan=scan+1;end if;end process;scan_clkseg=SecSeg1;aseg=SecSeg2;aseg=MinSeg1;aseg=MinSeg2;aseg=11111111;aSecSeg1SecSeg1SecS
21、eg1SecSeg1SecSeg1SecSeg1SecSeg1SecSeg1SecSeg1SecSeg1SecSeg1SecSeg2SecSeg2SecSeg2SecSeg2SecSeg2SecSeg2SecSeg2MinSeg1(7 downto 0)MinSeg1(7 downto 0)MinSeg1(7 downto 0)MinSeg1(7 downto 0)MinSeg1(7 downto 0)MinSeg1(7 downto 0)MinSeg1(7 downto 0)MinSeg1(7 downto 0)MinSeg1(7 downto 0)MinSeg1(7 downto 0)Mi
22、nSeg1(7 downto 0)MinSeg2MinSeg2MinSeg2MinSeg2MinSeg2MinSeg2MinSeg2=11111111;end case;end process;en=0;end Behavioral;第51页D/A 转换器概述lD/A转换器输入的是数字量,经转换后输出的是模拟量。有关D/A转换器的技术性能指标很多,例如分辩率、建立时间、接口形式、偏移量误差以及线性度等等。lD/A转换器有2大类:一类是在电子线路中使用,不带使能控制端口和控制端口,只有数字量输入和模拟量输出;另外一类带有使能控制端口,可以与微机直接连接。在本书电路板中采用后者中的DAC0832,
23、以实现数字信号到模拟信号的转换,下面将重点介绍该芯片的结构及使用。9.3 D/A接口设计接口设计 第52页DAC0832 转换精度:8位;单电源供电:+5V+15V;基准电压:10V;电流建立时间:1S;工艺:CMOS;低功耗:20mW;封装:20引脚,DIP 第53页FPGA与DAC0832接口电路原理图 第54页FPGA与DAC0832接口电路设计nP1_310向DAC0832的数据输入口(DI0DI7)输送数据。nP1_2提供DAC0832数据锁存允许控制信号ILE,高电平有效。nP1_1提供DAC0832控制信号(CS:片选信号;),低电平有效。nIout1、Iout2、Rfb与运算放
24、大器LM324完成电流/电压的转换 第55页DAC0832 输出控制时序图 第56页DAC0832 时序 l根据DAC0832 输出控制时序,利用接口电路图,通过改变输出数据设计一个锯齿波发生器。DAC0832是8位的D/A转换器,转换周期为1s。锯齿波形数据可以由256个点构成,每个点的数据长度为8位。又因为FPGA的系统时钟为50MHz,必须对其进行分频处理,这里进行64分频,得到的锯齿波的频率为762.9Hz。第57页DAC0832 接口电路程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.al
25、l;use ieee.std_logic_arith.all;entity DAC0832 is port(clk:in std_logic;-系统时钟 rst:in std_logic;-复位信号 ile:out std_logic;-数据锁存允许信号 cont:out std_logic;-控制信号 data_out:out std_logic_vector(7 downto 0);-波形数据输出end DAC0832;接下页 第58页architecture behav of DAC0832 is signal q:integer range 0 to 63;-计数器signal dat
26、a:std_logic_vector(7 downto 0);-波形数据Beginprocess(clk)beginif rst=1 then q=0;-复位,对计数器q清零elsif clkevent and clk=1 then if q=63 then q=0;-此IF语句对系统时钟进行64分频接下页 第59页if data=11111111 then data=00000000;else data=data+1;end if;else q=q+1;end if;end if;end process;ile=1;cont=0;data_outnext_state=st1;ale=0;st
27、art=0;ennext_state=st2;ale=1;start=0;ennext_state=st3;ale=0;start=1;en ale=0;start=0;en=0;if eoc=1 then next_state=st3;接下页 第68页 else next_state ale=0;start=0;en=0;if eoc=0 then next_state=st4;-检测EOC的上升沿 else next_statenext_state=st6;ale=0;start=0;ennext_state=st0;ale=0;start=0;en=1;regl next_state=st0;ale=0;start=0;en=0;end case;end process;clock:process(clk)begin接下页 第70页if clkevent and clk=1 then qq=qq+1;-在clk1的上升沿,转换至下一状态if QQ=01111111 THEN clk1=1;current_state=next_state;elsif qq=01111111 then clk1=0;end if;end if;end process;q=regl;abc_out=abc_in;end behav;