FPGA综合设计实例.ppt
《FPGA综合设计实例.ppt》由会员分享,可在线阅读,更多相关《FPGA综合设计实例.ppt(130页珍藏版)》请在三一办公上搜索。
1、第十章综合设计实例,1 键盘扫描与显示,矩阵式键盘:行,列,矩阵是键盘以行列形式排列,键盘上每个按键其实是一个开关电路,当某键被按下时,该按键对应的位置就呈现逻辑0状态.,行扫描方式:逐行送0电平,读取列的状态,以判断按下的键号.列扫描方式:逐列送0电平,读取行的状态,以判断按下的键号.,以行扫描为例:,1给行依次送0111,1011,1101,1110信号;,2读取列电平状态,数码管显示,library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity key_scan is port(column
2、:in std_logic_vector(3 downto 0);-列状态 scan_cnt:in std_logic_vector(3 downto 0);-扫描字 row:out std_logic_vector(3 downto 0);-行状态 key_pressed:out std_logic);-按键有效与否,后续判断为零则为有键按下end;architecture rtl of key_scan isbegin row=1110 when scan_cnt(3 downto 2)=00 else 1101 when scan_cnt(3 downto 2)=01 else 1011
3、 when scan_cnt(3 downto 2)=10 else 0111;key_pressed=column(0)when scan_cnt(1 downto 0)=00 else column(1)when scan_cnt(1 downto 0)=01 else column(2)when scan_cnt(1 downto 0)=“10 else column(3);end rtl;,按键扫描控制程序,按键处理控制模块,library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee
4、.std_logic_arith.all;entity scan_count isport(clk:in std_logic;-clockscan_clk:in std_logic;-1khz clkkey_pressed:in std_logic;-检测按键有效与否,停止计数.scan_cnt:out std_logic_vector(3 downto 0);-计数end;architecture behav of scan_count issignal qscan:std_logic_vector(3 downto 0);begin scan_1:process(clk,scan_clk,
5、key_pressed)begin if(clkevent and clk=1)then if(scan_clk=1 and key_pressed=1)then qscan=qscan+1;end if;end if;end process;scan_cnt=qscan;end;,按键消抖控制模块,library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity debounce isport(key_pressed:in std_logic
6、;clk:in std_logic;-同步时钟 scan_clk:in std_logic;-1khz clock key_valid:out std_logic);end;architecture behav of debounce isbegin,debounce:process(clk,scan_clk,key_pressed)variable dbnq:std_logic_vector(5 downto 0);begin if(key_pressed=1)then dbnq:=111111;-unkey_pressed,count reset at 63 elsif(clkevent
7、and clk=1)then if scan_clk=1 then if dbnq/=1 then dbnq:=dbnq-1;-key_pressed not enough long time end if;end if;end if;if dbnq=2 then key_valid=1;-key_valid after key_pressed 1/63k second else key_valid=0;end if;end process;end;,键盘译码及按键存储模块,library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_
8、unsigned.all;use ieee.std_logic_arith.all;entity code_tran isport(clk:in std_logic;-clock for synchrony scan_cnt:in std_logic_vector(3 downto 0);-1khz clock key_valid:in std_logic;butt_code:out std_logic_vector(3 downto 0);end;architecture bb of code_tran isbegin process(clk)begin if(clkevent and cl
9、k=1)then if key_valid=1 then case scan_cnt is,when0000=butt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_codebutt_code=1111;-fend case;end if;end if;end process;end;,电锁控制模块,library ieee;use ieee.std_logic_1164.all;use i
10、eee.std_logic_unsigned.all;entity ctrl is port(data_n:in std_logic_vector(3 downto 0);key_valid,clk:in std_logic;enlock:out std_logic;d,c,b,a:out std_logic_vector(3 downto 0);end;architecture aaa of ctrl is signal acc,reg:std_logic_vector(15 downto 0);signal nc:std_logic_vector(2 downto 0);signal qa
11、,qb:std_logic;beginkeyin:block is begin process(data_n,key_valid),begin if data_n=1101 then acc=0000000000000000;nc=000;elsif key_validevent and key_valid=1 then if data_n1101 then if nc=4 then acc=acc(11 downto 0),enlock=qa and not qb;d=acc(15 downto 12);c=acc(11 downto 8);b=acc(7 downto 4);a=acc(3
12、 downto 0);end aaa;,动态扫描显示控制模块,library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sel_display isport(clk:in std_logic;d,c,b,a:in std_logic_vector(3 downto 0);db_out:out std_logic_vector(3 downto 0);dis_out:out std_logic_vector(3 downto 0);end
13、 entity;architecture rtl of sel_display is signal sel:std_logic_vector(1 downto 0);signal dis:std_logic_vector(3 downto 0);signal db:std_logic_vector(3 downto 0);begin,counter:block is signal q:std_logic_vector(6 downto 0);begin process(clk)begin if clkevent and clk=1 then q=q+1;end if;end process;s
14、el=q(1 downto 0);end block counter;,multiplexer:block is begin process(sel)begin if sel=0 then db=d;dis=0111;elsif sel=1 then db=c;dis=1011;elsif sel=2 then db=b;dis=1101;elsif sel=3 then db=a;dis=1110;end if;end process;end block multiplexer;db_out=db;dis_out=dis;end rtl;,实例1 数字钟设计,实时显示时、分、秒,分析:1、最
15、小计时单位:秒。因此,首先要由时钟产生1HZ的信号;2、对秒进行0-59的计数,并且有进位功能,且显示;3、对分进行0-59的计数,并且有进位功能,且显示;4、对时进行0-59的计数,且显示;,library ieee;use ieee.std_logic_1164.all;entity second is port(clk,clr:in std_logic;-clk=1Hz sec1,sec0:out std_logic_vector(3 downto 0);co:out std_logic);end second;architecture arch of second isbegin,pr
16、ocess(clk,clr)variable cnt1,cnt0:std_logic_vector(3 downto 0);begin if clr=0 then cnt1:=0000;cnt0:=0000;elsif clkevent and clk=1 then if cnt1=0101 and cnt0=1000 then co=1;cnt0:=1001;elsif cnt01001 then cnt0:=cnt0+1;,else cnt0:=0000;if cnt10101 then cnt1:=cnt1+1;else cnt1:=0000;co=0;end if;end if;end
17、 if;sec1=cnt1;sec0=cnt0;end process;end arch;,实例2 出租车计费器设计,功能:(1)实现计费功能。车起步开始计费,首先显示起步价,设起步费为8.00元,车在行驶3 km以内,只收起步价8.00元。车行驶超过3 km后,每公里2元,车费依次累加。当总费用达到或超过40元时,每公里收费4元。当遇到红灯或客户需要停车等待时,则按时间计费,计费单价为每20S收费1元。(2)实现预置功能:预置起步费、每公里收费、车行加费里程、计时收费。(3)实现模拟功能:模拟汽车行驶、停止、暂停等状态。(4)实现显示功能:将路程与车费显示出来,以十进制显示。,系统流程如下:
18、,(1)系统接收到reset信号后,总费用变为8元,同时其他计数器,寄存器等全部清零。(2)系统接收到start信号后,首先把部分寄存器赋值,总费用不变,单价price寄存器通过对总费用的判断后赋为2元。其他寄存器和计数器等继续保持为0。(3)speed进程:通过对速度信号sp的判断,决定变量kinside的值。kinside即是行进100m所需要的时钟周期数,然后每行进100m,则产生一个脉冲clkout。(4)kilometers进程:由于一个clkout信号代表行进100m,故通过对clkout计数,可以获得共行进的距离kmcount。(5)time进程:在汽车启动后,当遇到顾客等人或红
19、灯时,出租车采用计时收费的方式。通过对速度信号sp的判断决定是否开始记录时间。当sp=0时,开始记录时间。当时间达到足够长时则产生timecount脉冲,并重新计时。一个timecount脉冲相当于等待的时间达到了时间计费的长度。这里选择系统时钟频率为500Hz,20s即计数值为1000。(6)kmmoney可分为kmmoney1和kmmoney2两个进程。kmmoney1进程:根据条件对enable和price赋值。当记录的距离达到3公里后enable变为1,开始进行每公里收费,当总费用大于40元后,则单价price由原来的2元每公里变为4元每公里。kmmoney2进程:在每个时钟周期判断t
20、imecount和clkout的值。当其为1时,则在总费用上加上相应的费用。,speed模块speed进程首先根据start信号判断是否开始计费,然后根据输入的速度档位sp2.0的判断,确定行驶100M所需要的时钟数,每前进100M,输出一个clkout信号。同时由cnt对clk进行计数,当cnt=kinside时,把clkout信号置1,cnt清0。,Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity feesystem is Port(clk:in std_logic;reset:i
21、n std_logic;start:in std_logic;stop:in std_logic;sp:in std_logic_vector(2 downto 0);clkout:out std_logic);end feesystem;architecture behav of feesystem isbegin process(clk,reset,stop,start,sp)type state_type is(s0,s1);variable s_state:state_type;variable cnt:integer range 0 to 28;variable kinside:in
22、teger range 0 to 30;begin case sp is-7档速度选择,具体每档kinside的值可根据实际情况设定 when 000=kinside:=0;-停止状态或空挡,when 001=kinside:=28;-第一档,慢速行驶状态,行驶100m需要28个时钟周期 when 010=kinside:=24;-第二档 when 011=kinside:=20;-第三档 when 100=kinside:=16;-第四档 when 101=kinside:=12;-第五档 when 110=kinside:=8;-第六档 when 111=kinside:=4;-第七档,也
23、是速度最大的档 end case;if reset=1then s_state:=s0;elsif clkevent and clk=1then case s_state is when s0=cnt:=0;clkout=0;if start=1then s_state:=s1;else s_state:=s0;end if;,when s1=clkout=0;if stop=1 then s_state:=s0;-相当于无客户上车 elsif sp=000 then s_state:=s1;-有客户上车,但车速位0,即客户刚上车还未起步 elsif cnt=kinside then cnt:
24、=0;clkout=1;s_state:=s1;else cnt:=cnt+1;s_state:=s1;end if;end case;end if;end process;end behav;,kilometers模块此模块主要用于记录行进的距离。通过对clkout信号的计数,可以计算行驶的距离kmcount。一个clkout脉冲相当于行进100m,所以只要记录clkout的脉冲数目即可确定共行进的距离。kmcount1为十分位,kmcount2为个位,kmcount3为十位,分别为十进制数。,Library ieee;Use ieee.std_logic_1164.all;Use ieee
25、.std_logic_unsigned.all;Entity kilometers is Port(clkout,reset:in std_logic;kmcnt1:out std_logic_vector(3 downto 0);kmcnt2:out std_logic_vector(3 downto 0);kmcnt3:out std_logic_vector(3 downto 0);end kilometers;architecture behav of kilometers isbegin process(clkout,reset)variable km_reg:std_logic_v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 综合 设计 实例
链接地址:https://www.31ppt.com/p-5574952.html