收藏 分销(赏)

VHDL实验.doc

上传人:仙人****88 文档编号:11731566 上传时间:2025-08-11 格式:DOC 页数:5 大小:158KB 下载积分:10 金币
下载 相关 举报
VHDL实验.doc_第1页
第1页 / 共5页
VHDL实验.doc_第2页
第2页 / 共5页


点击查看更多>>
资源描述
班级:2009211411 学号:09211999 姓名:陈东东 三十进制和六分频计数电路设计 1.实验目的:(1)计数器设计 设计一个三十进制计数器,要求用两位七段数码管显示(计时电路) (2)分频电路设计,六分频电路设计,在前面三十进制计数器基础上设计六分频电路,并同时用七段数码管显示。 2.实验内容和原理: 采用几个触发器的状态,按照一定规律随时钟变化来记忆时钟的个数。一个4位二进制计数器可以构成1位十进制计数器,即1位BCD计数器。2位十进制计数器连起来可以构成一个30进制计数器.当时钟个数记到30时,十位和各位都变为0000,否则的话,每来一个时钟,个位就加1,当各位为1001时,时钟到来十位加1.再分别将个位十位bcd码转换为七段数码管对应的数字。 校正函数:function zhuan(j:in std_logic_vector(3 downto 0)) return std_logic_vector is variable k:std_logic_vector(6 downto 0); begin case j is when "0000"=>k:="1111110";--不显示00首两位表示数码管是(0)否(1)显示 when "0001"=>k:="0110000"; when "0010"=>k:="1101101"; when "0011"=>k:="1111001"; when "0100"=>k:="0110011"; when "0101"=>k:="1011011"; when "0110"=>k:="0011111"; when "0111"=>k:="1110000"; when "1000"=>k:="1111111"; when "1001"=>k:="1110011"; when others=>k:="1000000"; end case; return(k); end zhuan; 3.程序框图:机器频率=》分频得到目的频率=》对上升沿个数计数=》十位各位对上升沿到来时相应的变化=》BCD码与七段数码管的转化关系=》六分频与上升沿的变化关系。 4..源程序: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY houcheng_09212004 IS PORT(a: IN STD_LOGIC; Clkout: OUT std_logic_vector(6 downto 0); m: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); n: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END houcheng_09212004; ARCHITECTURE rtl OF houcheng_09212004 IS SIGNAL bcd1n: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL bcd10n: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL x: STD_LOGIC_VECTOR(3 DOWNTO 0); signal clkin: std_logic:='0'; SIGNAL Counter:Integer ; SIGNAL y:Integer; SIGNAL clk :std_logic; function zhuan(j:in std_logic_vector(3 downto 0))—BCD码对应七段数码管的转换 return std_logic_vector is variable k:std_logic_vector(6 downto 0); begin case j is when "0000"=>k:="1111110";--不显示00首两位表示数码管是(0)否(1)显示 when "0001"=>k:="0110000"; when "0010"=>k:="1101101"; when "0011"=>k:="1111001"; when "0100"=>k:="0110011"; when "0101"=>k:="1011011"; when "0110"=>k:="0011111"; when "0111"=>k:="1110000"; when "1000"=>k:="1111111"; when "1001"=>k:="1110011"; when others=>k:="1000000"; end case; return(k); end zhuan; BEGIN m<=zhuan(bcd1n);--多个变量含有bcd10,和bcd1,所以不再用bcd n<=zhuan(bcd10n);--m,n,clkout分别为三十进制的十位,个位,六分频的输出的七段数码管信号,通过函数zhuan实现从bCD到七段数码管信号的转换 clkout<=zhuan(x); PROCESS(a) BEGIN IF(a'event AND a='1') THEN—a为机器晶振的频率,clk为希望的道德频率,此处为了得到合适的频率,而缩小了机器的频率。 IF(y=0) THEN—为了仿真方便,此处选用y=0,为2分频 y <= 0; clk<=NOT clk; ELSE y<=y+1; END IF; END IF; END PROCESS; PROCESS(clk) --处理个位 BEGIN IF(clk'event AND clk='1') THEN—对个位的处理,当为9时,上升沿到来变为0,不为9则加1 IF(bcd1n="1001") THEN bcd1n<="0000"; ELSE bcd1n<=bcd1n+1; end if; end if; IF(clk'event AND clk='0') THEN对十位的处理,当为29时,上升沿到来时变为0,否则,在个位为9时且上升沿到来加1处理。 IF(bcd1n ="1001") THEN IF(bcd10n = "0010") THEN bcd10n<="0000"; ELSE bcd10n<=bcd10n+1; end if; end if; IF Counter=2 THEN—对得到的频率clk 6分频 Counter <= 0; clkin<=NOT clkin; ELSE Counter<=Counter+1; END IF; end if; END PROCESS; PROCESS(clkin) --对6分频后的频率5进制计数显示,则30进制和6分频后的5进制同时变为0. BEGIN IF(clkin'event AND clkin='1') THEN IF(x="0100") THEN x<="0000"; ELSE x<=x+1; end if; end if; end process; END rtl; 5.测试用例:为仿真方便,取a为5MHZ,对a二分频,得到目的频率clk 为2.5MHZ, 测试目的:观察是否实现30进制计数,六分频的实现 预计结果:bcd10n和bcd1n一起从0到29计数,x实现了5进制计数,且和30进制计数同时变为0. 6.仿真波形图: 由图可见,bcd1n从0变为9循环显示,bcd10n从0变为2循环显示。X从0变为4循环显示,m,n,clkout分别对应bcd1n,bcd10n,x的七段数码管信号变化。由于延时的存在,6分频变为0时,30进制滞后了2us后变为0,但这不影响他们同时变为0的结论。所以与预期结果一致。 7.遇到的困难和解决办法: (1)怎么实现三十进制的七段数码管表示? 想到用bcd码表示十进制数,然后通过case语句实现bcd码与七段数码信号的转换。 (2)六分频与30进制的上升沿信号不同,怎么实现同步置零? 想到利用分频语句,实现上升沿分频,通过两个process进程语句,实现新的上升沿作为计数敏感信号。从而使得30进制与6分频同步置零。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服