1、BTN0启动/停止开关消抖模块 xiaodouBTN1复位开关消抖模块 fuweixiaodou具体设计如下:500000分频模块fpq 输入端口:clk : in std_logic; 输出端口:clkout : out std_logic; 生成符号: 设计思路:利用计数法实现分频 主要代码:(完整代码请见源程序)signal clktmp : std_logic;signal tmp : integer range 0 to 249999;begin process (clk) begin if clkevent and clk=1 then if tmp=249999 then -50
2、0000分频 tmp=0; clktmp=not clktmp; else tmp=tmp+1; end if; end if; end process; clkout1-2-3-4-5-0-1; 当计数到5时,进位信号变为1;否则状态自增,进位信号保持在0 SIGNAL qs :STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ca :STD_LOGIC;BEGIN PROCESS(clk) IF(reset=)THEN qs=0000; ELSIF(clkEVENT AND clk=)THEN IF(en=0) THEN IF(qs=0101) THEN -计数到5
3、 qs= ca= ELSE=qs+1; END IF; END IF; END PROCESS; PROCESS(ca,en) BEGIN q=qs; carry7-8-9-1 当计数到9时,进位信号变为1;1001) THEN -计数到9 PROCESS(ca)24进制计数器模块cnt24: 输入端口en,Reset,clk: in STD_LOGIC; 输出端口 carry: out STD_LOGIC;qa: out STD_LOGIC_VECTOR(3 DOWNTO 0);qb:低位qa状态变化: 高位qb状态变化: 当低位qa计数到9时,qb自增,进位信号保持在0 当低位qa为3且高
4、位qb为2时,进位信号变为1, 同时qa变为0、qb变为0主要代码:process(clk,Reset,en)variable tma: STD_LOGIC_VECTOR(3 DOWNTO 0);variable tmb:If Reset = then tma: tmb: else if clk-当BTN0键没有第一次按下时,正常计数 if tma=tmb:=tmb+1; elsif tmb=0010 and tma=0011 then -计数到23 tma: else tma:=tma+1; end if;qa=tma;qb=tmb;carryend process;译码模块yima:car
5、ry:data: in std_logic_vector(3 downto 0); dataout: out std_logic_vector(7 downto 0); 设计思路: 根据输入信号的不同,使用case语句进行不同的译码操作即可。具体来说: (四位二进制)译为30(八位二进制)31232333434535636737838939其他译为20 signal dis:std_logic_vector(7 downto 0); process(data) if(carry=) then disdis00100000-其他译为 end case;dataout=dis;LCD1602显示模
6、块LCD1602: 输入端口:YIMA_DATA1: in std_logic_vector(7 downto 0); -译码数据信号1 YIMA_DATA2: -译码数据信号2 YIMA_DATA3: -译码数据信号3 YIMA_DATA4: -译码数据信号4 YIMA_DATA5: -译码数据信号5 YIMA_DATA6: -译码数据信号6 YIMA_DATA7: -译码数据信号7 YIMA_DATA8: -译码数据信号8LCD_Clk :-状态机时钟信号,同时也是液晶时钟信号,其周期应该满足液晶数据的建立时间 carry : LCD_RS : -寄存器选择信号 LCD_RW : -液晶读
7、写信号 LCD_EN : -液晶时钟信号 LCD_Data : out std_logic_vector(7 downto 0); -液晶数据信号 设计思路: 主要代码: (完整代码请见源程序)type ram is array(0 to 10) of std_logic_vector(7 downto 0);signal ram1:ram; LCD_EN = LCD_Clk ; LCD_RW = ; ram1(0)=YIMA_DATA8;-译码数据信号8,秒表小时部分十位 ram1(1)=YIMA_DATA7;-译码数据信号7,秒表小时部分个位 ram1(2)=x3a -显示冒号: ram1
8、(3)=YIMA_DATA6;-译码数据信号6,秒表分钟部分十位 ram1(4)=YIMA_DATA5;-译码数据信号5,秒表分钟部分个位 ram1(5) ram1(6)=YIMA_DATA4;-译码数据信号4,秒表秒钟部分十位 ram1(7)=YIMA_DATA3;-译码数据信号3,秒表秒钟部分个位 ram1(8)2e -显示小数点. ram1(9)=YIMA_DATA2;-译码数据信号2,秒表十分秒位 ram1(10)LCD_RSlcd_data00001100-0x0Cwhen 2 =00000001-0x01 when 3 =00000110-0x06- when 4 =1000000
9、0-0x80-display,0x00+0x80-data display-when 5=10100000-空格 when 6=when 7=when 8=ram1(0);-秒表小时部分十位 when 9=ram1(1);-秒表小时部分个位 when 10=ram1(2);-冒号:when 11=ram1(3);-秒表分钟部分十位 when 12=ram1(4);-秒表分钟部分个位 when 13=ram1(5);when 14=ram1(6);-秒表秒钟部分十位 when 15=ram1(7);-秒表秒钟部分个位 when 16=ram1(8);-小数点. when 17=ram1(9);-
10、秒表十分秒位 when 18=ram1(10);-秒表百分秒位 when 19=-空格 when 20=-空格 -when 21=11000000-设定显示的位置在40H+80H,when 22=when 23=when 24=-空格when 25=when 26=when 27=when 28=when 29=when 30=when 31=when 32=when 33=when 34=when 35=when 36= when 37=BTN0启动/停止开关消抖模块xiaodou:in std_logic; key_en: 输出端口: en_out:out std_logic;采用计数型防
11、抖当key_en第一次为时,en_out延迟一段时间后变为, 并且en_out就此保持在高电平; 直到key_en第二次为。 signal cnt:integer range 0 to 3; -采用计数型防抖 signal en,en_tmp:std_logic; p0:process(clk)event and clk = if key_en = if cnt = 3 then en else cnt=cnt+1;en end if; else cnt end process p0; p1:process(en) if enevent and en= en_tmp=not en_tmp; en_out=en_tmp; end process p1;BTN1复位开关消抖模块fuweixiaodou: fuwei:fuwei_out: out std_logic;当fuwei为时,fuwei_out延迟一段时间后变为 然后fuwei_o
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1