FPGA综合设计实例[可修改版ppt]课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《FPGA综合设计实例[可修改版ppt]课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可修改版ppt FPGA 综合 设计 实例 修改 ppt 课件
- 资源描述:
-
1、FPGA综合设计实例1 键盘扫描与显示 矩阵式键盘:行,列矩阵是键盘以行列形式排列,矩阵是键盘以行列形式排列,键盘上每个按键其实是一个键盘上每个按键其实是一个开关电路,当某键被按下时,开关电路,当某键被按下时,该按键对应的位置就呈现逻该按键对应的位置就呈现逻辑辑0状态状态.行扫描方式:逐行送0电平,读取列的状态,以判断按下的键号.列扫描方式:逐列送0电平,读取行的状态,以判断按下的键号.以行扫描为例以行扫描为例:1给行依次送给行依次送0111,1011,1101,1110信号信号;2读取列电平状态读取列电平状态,数码管显示library ieee;use ieee.std_logic_1164
2、.all;use ieee.std_logic_unsigned.all;entity key_scan is port(column: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_sca
3、n isbegin row=1110 when scan_cnt(3 downto 2)=00 else 1101 when scan_cnt(3 downto 2)=01 else 1011 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
4、 ;按键扫描控制程序按键扫描控制程序按键处理控制模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.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;arc
5、hitecture behav of scan_count issignal qscan:std_logic_vector(3 downto 0);begin scan_1:process(clk,scan_clk,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_l
6、ogic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity debounce is port(key_pressed:in std_logic; clk:in std_logic;-同步时钟同步时钟 scan_clk:in std_logic;-1khz clock key_valid:out std_logic); end; architecture behav of debounce is begin debounce:process(clk,scan_clk,key_presse
7、d) variable dbnq:std_logic_vector(5 downto 0); begin if(key_pressed=1)then dbnq:=111111;-unkey_pressed,count reset at 63 elsif(clkevent 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
8、 key_pressed 1/63k second else key_validbutt_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 ieee.std_
9、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,qb:s
10、td_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)&data_n; nc=nc+1; end if;end if;end if;end process;end block; lock:block is begin process
11、(clk,data_n) begin if(clkevent and clk=1)then if nc=4 then if data_n=1110 then reg=acc; qa=1;qb=0; elsif data_n=1111 then if reg=acc then qa=0;qb=1; end if;end if;end if;end if;end process;end block; enlock=qa and not qb; d=acc(15 downto 12); c=acc(11 downto 8); b=acc(7 downto 4); a=acc(3 downto 0);
12、 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);en
13、d 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);begincounter: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 pro
14、cess; sel=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
15、数字钟设计数字钟设计实时显示时、分、秒实时显示时、分、秒分析:分析:1、最小计时单位:秒。因此,首先要由时钟产生、最小计时单位:秒。因此,首先要由时钟产生1HZ的信号;的信号;2、对秒进行、对秒进行0-59的计数,并且有进位功能,且显示;的计数,并且有进位功能,且显示;3、对分进行、对分进行0-59的计数,并且有进位功能,且显示;的计数,并且有进位功能,且显示;4、对时进行、对时进行0-59的计数,且显示;的计数,且显示;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.allentity second i
16、s 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 process(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
17、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 if; sec1=cnt1; sec0 kinside:=0; -停止状态或空挡 when 001= kinside:=28; -第一档,慢速行驶状态,行驶100m需要28个时钟周期 when 010= kinside:=24; -第二档 when 011= kinside:=
18、20; -第三档 when 100= kinside:=16; -第四档 when 101= kinside:=12; -第五档 when 110= kinside:=8; -第六档 when 111= kinside:=4; -第七档,也是速度最大的档 end case; if reset=1then s_state:=s0; elsif clkevent and clk=1then case s_state is when s0= cnt:=0;clkout clkout=0; if stop=1 then s_state:=s0; -相当于无客户上车 elsif sp=000 then
19、s_state:=s1; -有客户上车,但车速位0,即客户刚上车还未起步 elsif cnt=kinside then cnt:=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,所以只要记,所以
20、只要记录录clkout的脉冲数目即可确定共行进的距离。的脉冲数目即可确定共行进的距离。kmcount1为十分位,为十分位,kmcount2为个位为个位,kmcount3为十位,分别为十进制数。为十位,分别为十进制数。Library ieee;Use ieee.std_logic_1164.all;Use ieee.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_vect
21、or(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_vector(11 downto 0);begin if reset=1then km_reg:=000000000000; elsif clkoutevent and clkout=1then -km_reg(3 downto 0)对应里程十分位 if km_reg(3 dow
22、nto 0)=1001then km_reg:=km_reg+0111; -十分位向个位的进位处理 else km_reg(3 downto 0):=km_reg(3 downto 0)+0001; end if; if km_reg(7 downto 4)=1010then km_reg:=km_reg+01100000; -个位向十位的进位处理 end if;end if;kmcnt1=km_reg(3 downto 0);kmcnt2=km_reg(7 downto 4);kmcnt3 waittime:=0;timecount if sp=000then t_state:=t2; el
23、se waittime:=0;t_state:=t1; end if; when t2 = waittime:=waittime+1; timecount=0; if waittime=1000 then timecount=1; -20s,即1000个clk,产生一个时间计费脉冲 waittime:=0; elsif stop=1then t_state:=t0; elsif sp=000then t_state:=t2; else timecount=000001000000then price=0100; Else price=0011)or(kmcnt3=0001)then enabl
24、e=1; Else enable=0; End if; End process;kmmoney2:process(reset,clkout,clk,enable,price,kmcnt2)variable reg2:std_logic_vector(11 downto 0);variable clkout_cnt:integer range 0 to 10;begin if reset=1 then cash1001 then reg2(7 downto 0):=reg2(7 downto 0)+00000111; if reg2(7 downto 4)1001 then cash =reg2
25、+000001100000; else cash=reg2; end if; else cash00001001then reg2(7 downto 0):=reg2(7 downto 0)+00000110+price; if reg2(7 downto 4)1001then cash=reg2+000001100000; else cash=reg2; end if; else cash=reg2+price; end if; else clkout_cnt:=clkout_cnt+1; end if;end if;end if;end process;count1=cash(3 down
展开阅读全文