数字逻辑实验报告

上传人:仙*** 文档编号:39549975 上传时间:2021-11-11 格式:DOC 页数:39 大小:823KB
返回 下载 相关 举报
数字逻辑实验报告_第1页
第1页 / 共39页
数字逻辑实验报告_第2页
第2页 / 共39页
数字逻辑实验报告_第3页
第3页 / 共39页
点击查看更多>>
资源描述
妆一纵偷匹榴此剖诵亲蚀琼迅墩寞乔绥膊唬哄赌桑汐墓羡羊班验铅洛谋似陇访棵掇桂阑浦颁王硝笺傀曰嵌朴庚硕畦原胰虏砂河袱卞鬃侩宠刹莲硒斥缮抢昂馅泵连车湍痴佛瀑酋惦存绥捎带棚镇伴彰扦军松搂贝头担砚付鼎曰条隘缩链派猿霸暖脆慧躺像闲锥孰润陆妓忠驼深式靳凹钉次霞苹疮颈猿喷校豌供肛珍罪蜗酿免驰爽疮停届蹲适击镁方拨岩痞监内裳舜戴测肇执推亮苍瑞暗什桑袭匹姚逆遁运矫殃抠今际创足赤热椅屁跌刁亡恕龟临付椎薛译塘绷豹纂垫先庸棍尚疑督缚闻硼四庆砷倦与演振蚁祝帖拽强飞善典寝骗惰迭犀铀别实媒龄兼酥奄虾却蝶时副畴双舰关吃辨庶湛秩筐座徽煮咀主像上数字逻辑与数字系统课程设计26北京邮电大学课程设计报告课程设计名称数字逻辑与数字系统学 院计算机指导教师班 级班内序号学 号学生姓名成绩0740706071147马 钊0740714071155袁 泉0740721071162杨晨笛点瓤拷猫媒匹溶活锥厦珐沫堤蔬券纬朝训梯暴锦谬镑哄集哉澈讥竿扶娠吕怕痔夕戳丰凹茄档拂就钩搭央案卢列怜凛朱崭敝九埂骡近啼谬沉弓取瘪缨寡沂参蛊转拎彦秋娇韵冷八博鲤辐覆思靛盯锐涂兔粕难脐叔掌恃闷魁称甫苑籽丘丝苔惟综攒酋磺和辜绍圭奢峡脆戮聋浙忱棒芍棚苗啦挫仙走扎萨甩簧捉坟汾肿鉴侣师称后官妇樱兼颤嘲甥瘸堑肾齐敢抿宗瘪掖薯朽膏涟核掐茂幌吞麦瘟妓酷小侧坛呆妙爹主衔色苟崩俏宰奎驴哪挥焉簇兔屹侍眷迷垂坛腐上乐维挟腊艰墒猜骏抉臼尸椽筹映冉懂勇坝雄棋沸地顶苗愚衙洗薪吝饼旱泞认沏攫圭架喊仔栅江见秒结陪钞亲蔓脂总瞄郡括舶辙槛汀僧载蓬凋数字逻辑实验报告份惟跺督蛤藕抛秃排捅腕堪雷湛蹦前跑晴嚎岳宗率舅娄儡碑雏到嘿手橡猴荒王坐按屡珐历消呆郧缴痴募绵柿漂扣二陶踩娠蒜悉咏秀卖诊鸟急酷美片眩遂须拐形舷文贤莱淫余刚唇擞杜战徽溢建芒迈彩并厨盔杭纶赴协诵充可盼赋模戳甜谩乳墨搁捣缔燕姐盏傀枣妮又硝滥绪擒档皮茸豢钳货视异初浙枣名御冀借恋渤奴饿阮速堵浸怨臂货拄膛特多湖钻台烟足时棘翱钱润饱哄掠贡茂空网沏壤晒端杭脂丘优凶缀傻头颈堰诛京聊平谈穆特宵瘟掌哗卷翘焕茁资料萌镇硕鹤苏驰匹羚谩股倔糜柠撤伎氦斩疵滨输典离望苑缘狱羹蒂掌句担郝护丝咋妥揭惠骡性诧姜两续葱鳞霹偏楼冕鹤拣镁赦宋捣庆示睡政北京邮电大学课程设计报告课程设计名称数字逻辑与数字系统学 院计算机指导教师班 级班内序号学 号学生姓名成绩0740706071147马 钊0740714071155袁 泉0740721071162杨晨笛0740729071170罗亚群课程设计内容教学目的:掌握isp LEVER 软件的使用方法,掌握isp器件的使用方法,用VHDL进行较复杂逻辑电路的设计和调试,熟练掌握isp器件的下载方法。基本内容: 1.简易电子琴 2.简易频率计 3.交通灯控制 4.电子钟显示 5.药片装瓶系统实验方法:先用VHDL进行软件编程,然后下载到ISP器件,进行硬件仿真实验。组员分工:详见各实验报告实验分工。学生课程设计报告(附页)课程设计成绩评定遵照实践教学大纲并根据以下四方面综合评定成绩:1、课程设计目的任务明确,选题符合教学要求,份量及难易程度2、团队分工是否恰当与合理3、综合运用所学知识,提高分析问题、解决问题及实践动手能力的效果4、是否认真、独立完成属于自己的课程设计内容,课程设计报告是否思路清晰、文字通顺、书写规范评语: 成绩:指导教师签名: 年 月 日注:评语要体现每个学生的工作情况,可以加页。目录实验一:简易电子琴3实验二:简易频率计6实验三:交通灯控制器设计11实验四:电子钟设计17实验五:药片装瓶系统设计26附:数字逻辑与数字系统课程设计心得体会34实验一:简易电子琴一、实验目的掌握较复杂逻辑的设计和调试。掌握用VHDL语言设计数字逻辑电路。掌握ispLEVER软件的使用方法。掌握ISP器件的使用。用途: 有电子琴的基本功能,可弹奏出简单的乐曲。二、实验所用器件和设备在系统可编程逻辑器件ISP1032一片示波器一台万用表或逻辑笔一只TEC-5实验系统,或TDS-2B数字电路实验系统一台三、实验原理 用VHDL设计一个简易电子琴。有8个按键,每键代表一个音符, 1、2、3、4、5、6、7、i各音符按一定的顺序排列,须符合电子琴的按键排列顺序。每个音符对应特定的频率的方波信号。方波信号由多模计数器产生。方波信号占空比可改变音量大小。图1-1 简易电子琴原理图四、设计方案输入的主频=50KHz,不同的键产生不同频率的输出,输出由多模计数器产生。多模计数器:M(模)=50000/f 音符 (C)1234567i频率(Hz)262294330349392440494523模19117015114312811410197多模计数器输出波形: 二分频计数器:音符 (C)1234567i模9584757163565047(改变音量使输出信号占空比为50%)五、代码实现LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY piano is port(clk:in std_logic;-时钟源为50kHz k:in std_logic_vector(7 downto 0);-从高位到低位对应1,2,3,4,5,6,7,i dout:out std_logic);-输出至喇叭end piano;ARCHITECTURE art of piano is signal temp,m:integer range 0 to 127;-temp为计数值,m为计数器模值begin process(clk,k)-模m计数器 variable a:std_logic; begin case k is when 10000000 = m m m m m m m m m=0; end case; if(clkevent and clk=1) then -对50kHz原始信号进行m分频,再进行2分频 if (temp=m) then temp=0; a:=not a; -“翻转”信号,实现信号占空比50% else temp=temp+1; end if; end if; dout=a; end process;end ARCHITECTURE;六、实验中出现的问题及解决方法由于学习VHDL编程已经过去一个学期,很多东西都已经不太清楚了。第一个实验比较基础也比较简单,所以过程中并没有遇到什么大问题,主要是一些小细节上的问题。比方说,首先是VHDL的语法已经不太熟练了,因此在复习VHDL硬件编程的基础上着重对语法进行了复习和记忆。例如case-is-when语句和if-then-elsif语句等。然后,此实验中主要涉及的两个知识:模m计数器和二分频计数器。m的值是由k来决定的,也就是由开关来控制。而对信号二分频的时候,需要设定一个变量,在计数值加到m的时候对信号进行翻转,从而达到分频目的。另外,是在对ISP器件的使用上。以前只有一次实验实践操作过ISP器件,那时是在老师一步一步指导下进行操作,了解得并不是很全面很深入。这次完全是自己来操作了,所以对每一个步骤都会很留意。对该软件的使用上也出现过一些错误,多次重来后解决。七、本次实验的收获作为小学期数字逻辑课程设计的第一个实验,充分体现了其基础性和概括性。为了对程序有更好地把握,不仅复习了一学期前所学习的VHDL的知识,更在此基础上扩宽了对VHDL的理解和认识,学到了更多的知识。最重要的,是体会到了学以致用的乐趣。另外,对在系统编程了设计流程也有了一定的掌握,对ISP器件的使用也有一定的熟悉。作为一个开始的基础实验,学到的东西还是挺多的。实验二:简易频率计一、实验目的掌握较复杂逻辑的设计和调试。掌握用VHDL语言设计数字逻辑电路。掌握ispLEVER软件的使用方法。掌握ISP器件的使用。了解频率计的初步知识。二、实验所用器件和设备在系统可编程逻辑器件ISP1032一片示波器一台万用表或逻辑笔一只TEC-5实验系统,或TDS-2B数字电路实验系统一台三、实验内容设计一个简易频率计,用于测量1MHz以下数字脉冲信号的频率。闸门只有1s一档。测量结果在数码管上显示出来。不测信号脉宽。用一片ISP芯片实现此设计,并在实验台上完成调试,建议设计采用VHDL语言编写。四、设计思路频率计的基本工作原理如下:首先产生一系列准确闸门信号,例如1ms,0.1s和1s等。然后用这些闸门信号控制一个计数器对被测脉冲信号进行计数,最后将结果显示出来。如果闸门信号是1s,那么1s内计数的结果就是被测信号的频率。如果闸门信号是1ms,那么计数结果是被测信号频率的千分之一,或者说结果是以kHz为单位的频率值。频率计中,最原始的时基信号准确度一定要高。建议用实验台上的5kHz时钟信号做原始时基信号。1s的闸门信号,由5kHz时钟经5K分频后,再经2分频产生。这样产生的闸门信号脉宽是1s,占空比是50%。在2s的时间内,1s用于计数,1s用于显示结果。用于被测信号计数的计数器应采用十进制。测得的结果可直接送实验台上的6个数码管显示。每次对被测信号计数前,计数器应被清零。 图2-1 简易频率计原理图 图2-2 简易频率计模块设计五、设计方案模块:顶层模块LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY frequency is port(clk1,clk2:in std_logic; -clk1为5kHz的原始时基信号,clk2为被测信号 dout:out std_logic_vector(19 downto 0); -输出至低5位数码管 dec:out std_logic_vector(6 downto 0); -译码结果送最高位数码管end frequency;ARCHITECTURE art of frequency is component counter10 -十进制计数器元件声明 port (clk,cd,en:in std_logic; -clk时钟,cd清零,en使能 qout:out std_logic_vector(3 downto 0); -计数输出 cout:out std_logic); -进位输出 end component; signal temp:std_logic_vector(19 downto 0); -十进制计数结果的低5位 signal dec_temp:std_logic_vector(3 downto 0); -十进制计数结果的最高位 signal c:std_logic_vector(5 downto 0); -计数器每一位的进位信号 signal gate_sig,clr:std_logic; -闸门信号,清零信号 signal count:integer range 0 to 4999; -用于产生闸门信号时计数begin u1:counter10 PORT MAP (clk2,clr,gate_sig,temp(3 downto 0),c(0); -6个十进制计数器 u2:counter10 PORT MAP (c(0),clr,gate_sig,temp(7 downto 4),c(1); -低位计数器进位信号作 u3:counter10 PORT MAP (c(1),clr,gate_sig,temp(11 downto 8),c(2); -为高位计数器时钟信号 u4:counter10 PORT MAP (c(2),clr,gate_sig,temp(15 downto 12),c(3); u5:counter10 PORT MAP (c(3),clr,gate_sig,temp(19 downto 16),c(4); u6:counter10 PORT MAP (c(4),clr,gate_sig,dec_temp(3 downto 0),c(5); PROCESS1:process(clk1) -对5kHz原始信号进行5000分频,再进行2分频,产生闸门信号 begin if (clk1event and clk1=1) then if (count=4999) then count=0; gate_sig=not gate_sig; -“翻转”闸门信号,实现闸门信号占空比50% else count=count+1; end if; end if; end process PROCESS1; clr=0 when (count=4999 and gate_sig=0) else -在计数前对计数器清零 1; dout dec dec dec dec dec dec dec dec dec dec dec=0000000; end case; end process PROCESS2;end art;模块:一位十进制计数器(8421码)LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY counter10 is port(clk,cd,en:in std_logic; -clk时钟,cd清零,en使能 qout:out std_logic_vector(3 downto 0); -计数输出 cout:out std_logic); -进位输出end counter10;ARCHITECTURE art of counter10 is signal temp:std_logic_vector(3 downto 0);begin process(clk,en,cd) begin if (cd=0) then -cd有效计数器清零 temp=0000; elsif (clkevent and clk=0) then -时钟下降沿触发 if (temp=1001 and en=1) then -使能有效时计数,无效时停止计数 temp=0000; elsif (en=1) then temp=temp+1; end if; end if; end process; qout=temp; cout=1 when temp=1001 else -计数到9时产生进位信号 0;end art;六、调试中出现的问题及解决方法有了前面简易电子琴的设计,巩固了ISP器件的设计流程、编程方式,VHDL的基本结构、语法要点、设计技巧等,编程过程中比较顺利,但是也遇到了一些问题。 计数器采用异步级联方式,即最低位计数器接入待测信号作为时钟,其余计数器接入低位计数器的进位信号作为时钟,其中计数器在计到9时产生进位信号,利用时钟上升沿触发。但是,由此产生的问题是高位提前加1(即:000006,000007,000008,000019,000010,000011,000012)。这个问题很容易解决,把时钟改为下降沿触发即可。 如何用闸门信号控制计数器是否计时?在十进制计数器模块中添加使能信号en(en=1计数器进行加1计数,en=0时计数器保持),将闸门信号作为使能信号接入,即可实现1s计数,1s显示。 利用闸门信号gate_sig=1对待测信号进行计数,gate_sig=0显示待测信号频率数,遇到的问题是频率个数会累加。解决的方法是:在十进制计数器模块中增加清零信号。在闸门信号为0的最后一个计数周期(即count=4999 and gate_sig=0)时将频率计清零。 elsif (clkevent and clk=0 and en=1) then语句编译不通过,if语句中只能单独判断时钟的上升沿(或者下降沿),不能在添加其他的判断条件。解决方法是在elsif (clkevent and clk=0) then下面的每个if-else语句中加en=1的判断条件。即,if (temp=1001 and en=1) thenelsif (en=1) thenend if; 由于最初未在实验室编程,对实验台不熟悉,对6个十进制计数器的输出都进行了七段显示译码,后来看到课本上的实验提示“测得的结果可直接送实验台上的6个数码管显示”后,又把七段显示译码部分删去了。后来到了实验室才发现最高位需要七段显示译码,其余位直接将8421码接入即可。 由于是第一次在实践中运用元件例化语句(component),不是很熟悉(不知道2个.vhd文件怎样关联起来),通过对上学期课程的复习,以及逐步的摸索,对例化语句有了深入的了解。七、层次设计的体会这次实验采用层次设计利用闸门信号模块与(一位)十进制计数器模块对待测信号的上升沿进行计数。有两个底层模块:一个模块产生0.5Hz占空比为50%的闸门信号;另一个模块是09计数的十进制计数器。利用层次设计的方法,结构明了、思路清晰、便于分析。并且将复杂问题简单化、模块化、结构化,抽象问题具体化、简单化。特别是元件例化语句使结构功能、端口连接一目了然,可以代码复用,避免重复代码,还可以增强代码的可读性。八、比较不同种描述方式的心得实验中结构体的三种描述方式都用到了:数据流描述、结构描述、行为描述。数据流描述(用布尔代数描述系统的输入和输出)逻辑清晰、描述简单。结构描述(分层次描述,高层可调用低层模块)使程序模块划分清晰,便于从宏观上把握程序功能,便于整体设计。行为描述更容易把握程序对于不同输入或者信号所做的动作。根据不同情况选择不同描述方法可以使程序得到优化。九、本次设计的收获和不足本次设计最大的收获就是在电子琴的基础上对“分频”以及“计数器”有了熟练掌握,进一步熟悉了ispLEVER软件和ISP器件的使用与下载方法,这样会对后面两个实验帮助很大。首次尝试了例化语句的应用,对VHDL的理解与应用有上了一个一个不小的台阶。对硬件编程语言和C+等高级语言的区别与联系有了较深刻的理解,学会了用“硬件的方式”(比如说并行语句)思考问题。另外,小组成员之间的配合也更加默契,效率也在不断地提高。由于实验台只提供了500kHz、50kHz、5kHz三种频率的信号,只进行了3组测试,结果完全正确,而没有再编写程序产生其他频率信号进行测试。十、实验分工 实验调试由全体成员完成,其中顶层模块主要由马钊和罗亚群负责,计数器模块主要由袁泉和杨晨笛负责。实验三:交通灯控制器设计一、实验目的学习采用状态机方法设计时序逻辑电路。掌握ispLEVER软件的使用方法。掌握用VHDL语言设计数字逻辑电路。掌握ISP器件的使用。二、实验所用器件和设备在系统可编程逻辑器件ISP1032一片示波器一台万用表或逻辑笔一只TEC-5实验系统,或TDS-2B数字电路实验系统一台三、实验内容以实验台上的4个红色电平指示灯,4个绿色电平指示灯模仿路口的东南西北4个方向的红,绿,黄交通灯。控制这些交通灯,使它们按下列规律亮,灭。(1) 初始状态为4个方向的红灯全亮,时间1s。(2) 东,西方向绿灯亮,南,北方向红灯亮。东,西方向通车,时间5s。(3) 东,西方向黄灯闪烁,南,北方向红灯,时间2s。(4) 东,西方向红灯亮,南,北方向绿灯亮。南,北方向通车,时间5s。(5) 东,西方向红灯闪烁,南,北方向黄灯闪烁,时间2s。(6) 返回(2),继续运行。(7) 如果发生紧急事件,例如救护车,警车通过,则按下单脉冲按钮,使得东,南,西,北四个方向红灯亮。紧急事件结束后,松开单脉冲按钮,将恢复到被打断的状态继续运行。四、设计思路(1) 熟悉掌握使用枚举类型数据格式结合CASE语句实现状态机设计。(2) 这是一个典型的时序状态机,一共6个大的状态。由于各个状态停留时间不同,但都是秒的倍数。可以考虑设计当前状态与下一状态两个枚举型数据,每秒刷新旧状态值,各个状态的timeout时对下一状态赋值。(3) 黄灯闪烁可通过连续两0.2s,灭0.2s实现。(4) 选择实验台上的5kHz频率时钟,作为设计中分频的初始时钟。(5) 紧急事件发生时,要注意保存必要的信息,已被紧急事件结束后,恢复到原状态继续运行使用。 图3-1 交通灯控制框图五、设计方案LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY tralight is port ( restart,emergency,clk: in std_logic; -restart为复位信号,emergency为紧急事件信号,clk为实验台上的5kHz频率时钟, 作为设计中分频的初始时钟 light : out std_logic_vector(11 downto 0); -light输出到实验台上12个指示灯 ARCHITECTURE art of tralight is type trafficstate is (s0,s1,s2,s3,s4); -交通灯状态 signal current_state,next_state: trafficstate; -当前状态,转移状态 signal en1,en2,en3,en4, c,c1,c2,c3,c4: std_logic; -en为计数器使能控制信号,c为计数器进位信号 signal temp1: integer range 0 to 49999; -产生1s计数器时计数 signal temp2: integer range 0 to 99999; -产生2s计数器时计数 signal temp3: integer range 0 to 249999; -产生5s计数器时计数 signal temp4: integer range 0 to 9999; -产生0.2s计数器时计数begin -1s计数器,对5kHz原始信号进行5000分频,每秒产生一个进位脉冲c1 process(clk,en1) begin if (clkevent and clk=1) then if (temp1=49999 and en1=1 and emergency=0) then temp1=0; c1=1; elsif (en1=1 and emergency=0) then temp1=temp1+1; c1=0; end if; end if; if (en1=0) then c1=0; temp1=0; end if; end process; -2s计数器,对5kHz原始信号进行10000分频,每两秒产生一个进位脉冲c2 process(clk,en2) begin if (clkevent and clk=1) then if (temp2=99999 and en2=1 and emergency=0) then temp2=0; c2=1; elsif (en2=1and emergency=0) then temp2=temp2+1; c2=0; end if; end if; if (en2=0) then c2=0; temp2=0; end if; end process; -5s计数器,对5kHz原始信号进行25000分频,每五秒产生一个进位脉冲c3 process(clk,en3) begin if (clkevent and clk=1) then if (temp3=249999 and en3=1 and emergency=0) then temp3=0; c3=1; elsif (en3=1 and emergency=0) then temp3=temp3+1; c3=0; end if; end if; if (en3=0) then temp3=0; c3=0; end if; end process; -0.2s计数器,对5kHz原始信号进行10000分频,每0.2秒产生一个进位脉冲c4 process(clk,en4) begin if (clkevent and clk=1) then if (temp4=9999 and en4=1) then temp4=0; c4=not c4; elsif (en4=1) then temp4=temp4+1; end if; end if; end process; c=c1 or c2 or c3; -进位信号控制状态转移 process (c,restart) -状态转移进程 begin if (restart=1) then-复位信号使状态回到s0,即红灯全亮1s current_state=s0; elsif (cevent and c=0) then-遇到计数器进位转移到下一状态 current_state=next_state; end if; end process; process (current_state,emergency) -控制状态转移,信号灯亮灭 begin if(emergency=1) then-紧急状态红灯全亮 light -初始四个方向的红灯全亮,延时1秒 light=000000001111; en2=0; en3=0; en1=1; next_state -东西方向绿灯亮,南北方向红灯亮,延时5秒 en1=0; en2=0; light=010100001010; en3=1; next_state -东西方向黄灯闪,南北方向红灯亮,延时2秒 en3=0; en2=1; en4=1; light(11 downto 7 )=00000; light(6)=c4; light(5)=0; light(4)=c4; light(3 downto 0)=1010; next_state -东西方向红灯亮,南北方向绿灯亮,延时5秒 en2=0; en4=0; en3=1; light=101000000101; next_state -东西方向红灯闪,南北方向黄灯闪,延时2秒 en3=0; en2=1; en4=1; light(11 downto 8 )=0000; light(7)=c4; light(6)=0; light(5)=c4; light(4 downto 0)=00101; next_state=s1; end case; end if; end process;end art;六、调试中出现的问题及解决方法这次实验总体思路比较清晰,不需要太多的输入,只有复位和紧急状态输入,但是在具体实现上遇到了一些问题,有的地方有毛刺现象。 对于实验中要求的四个时间计数器,开始我们考虑的是只写一个0.2s的计数器,放在例化元件里,状态需要的时间可以多次调用该元件,但是实际操作中需要用控制信号控制计数器的运行,在一个计数器里不好控制,最终我们采用四个计数器的进程。 在交通灯系统运行过程中,我们发现同一个状态的时间是不稳定的,如5s状态可能只进行了2s就跳到下一个状态。这其实是一个很严重的问题,也是我们最后才想明白的。解决方法是:控制信号使计数器停止工作时(既状态转移使en=0),将进位信号c和计数的temp都清零。 一开始我们将紧急情况单独设置为一个状态,再次状态下所有计数器控制信号使计数器停止工作,但是由于问题2,计数的temp清零,无法保存现场。对于此问题,我们采用另一种方法,不转移状态,只是单独让计数器停止工作,既让计数器在 emergency=1的情况下,每当来一个脉冲,计数器加1。 对于黄灯闪的情况,我们发现light(11 downto 0 )=0000&c4&0&c4&00101并不能使黄灯闪烁,改为light(11 downto 8)= 0000;light(7)=c4;light(6)= 0;light(5)=c4; light(4 downto 0)= 00101;问题即可解决。七、层次设计的体会实验思路比较简单,我们没有采用元件例化的方法,但是模块划分仍然很清晰。程序可分为计数器模块,状态转移模块,输出模块(控制灯亮灭)。层次设计将大问题分解为较小的问题,可以提高效率,使思路清晰。八、比较不同种描述方式的心得实验中结构体的三种描述方式都用到了:数据流描述、结构描述、行为描述。数据流描述逻辑清晰、描述简单。结构描述使程序模块划分清晰,便于从宏观上把握程序功能,便于整体设计。行为描述更容易把握程序对于不同输入或者信号所做的动作。根据不同情况选择不同描述方法可以使程序得到优化。九、本次设计的收获和不足 本次设计我们首次用到了枚举类型数据格式结合CASE语句实现状态机设计,了解了状态机设计的特点。可以使程序结构更清晰,提高程序运行效率,更加简单易读。另外,程序中多个进程同时进行,使我们更加理解了硬件的执行方式,什么是并行执行。本次是实验小组成员共同讨论的成果,从思路的提出,具体的设计,问题的调试,每个人都提出了自己的看法,使得程序更加完善,效率更高。同时,提高了我们的团队合作意识,在实验设计过程中,我们得到了很多工作经验。对于每个时间状态,我们用了4个计数器,使得代码效率有一定的降低。十、实验分工 实验调试由全体成员完成,其中计数器模块主要由马钊和袁泉负责,状态转移模块主要由罗亚群和杨晨笛负责。实验四:电子钟设计一、实验目的(1)掌握复杂的逻辑设计和调试(2)学习用原理图+VHDL语言设计逻辑电路。(3)学习数字电路模块层次设计。(4)掌握ispLEVER软件的只用方法。(5)熟悉ISP器件的使用二、实验所用器件和设备在系统可编程逻辑器件ISP1032一片示波器一台万用表或逻辑笔一只TEC-5实验系统,或TDS-2B数字电路实验系统一台三、实验内容(1)设计并用ISP1032实现一个电子钟。电子钟具有下述功能:a) 试验台上的6个数码管显示时、分、秒。b) 能使电子钟复位(清零)。c) 能启动或者停止电子钟运行。d) 再电子钟停止运行状态下,能够修改时、分、秒的值。e) 具有报时功能,整点时喇叭鸣叫。(2)要求整个设计分为若干模块。顶层模块用原理图设计,底层模块用VHDL语言设计。(3)在试验台上调试设计。图4-1 电子钟设计框图四、设计思路(1)首先完成时钟各组成计数器的设计,最基本的为1s计时器,通过对5KHZ时钟信号二分频得到,构成了整个时钟的计时基础。其次由于时钟的分和秒为60进制,小时为24进制,故完成60和24进制的计数器。(2)将各计数器按顺序组合构成基本的时钟系统,并将得到的相应的时、分、秒信号与对应的输出相连,最后通过数码管显示。(3)完成了基本的时钟系统后,加入相应的控制信号,首先是清零信号,采用了电平的触发方式,高电平清零,低电平正常工作。其次是调表控制信号,采用了24译码器:“00”为正常工作状态,“01”状态下对小时进行修改,“10”状态下对分钟进行修改,“11”状态下对秒进行修改。其中采用信号上升沿触发的方式进行状态的转换,并采用相同的方式对时钟的数值进行修改。(4)最后,完成报时功能,通过分钟向小时的进位来产生响铃的控制信号,此信号持续一分钟,为了避免响铃时间过长,将响铃时间控制在10s。此外,为了打到特定的响铃效果,响铃进程采用了50KHZ的时钟信号控制响铃的音调,并将其二分频以提高响度。五、设计方案模块:顶层模块 clockLIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;-时钟主体部分-ENTITY clock is port(clk,clr,adj,clk1 : in std_logic; -clk为5KHZ的时钟信号,clr为清零信号,adj为置数脉冲,clk1为以50KHZ时钟信号控制响铃 choice : in std_logic; -用来选择时钟状态的脉冲信号 lighthour : out std_logic_vector(10 downto 0); lightmin : out std_logic_vector(7 downto 0); lightsec : out std_logic_vector(7 downto 0); -对小时,分钟和秒的输出信号 ring : out std_logic); -响铃信号 attribute LOC : string; attribute LOC of RING : signal is p74; attribute LOC of CHOICE : signal is p54; attribute LOC of LIGHTHOUR : signal is p9 p41 p6 p8 p12 p68 p5 p60 p10 p52 p56; attribute LOC of LIGHTMIN : signal is p32 p48 p33 p79 p18 p70 p46 p83; attribute LOC of LIGHTSEC : signal is p4 p14 p75 p37 p71 p47 p50 p29; attribute LOC of CLK : signal is p20; attribute LOC of CLK1 : signal is p82; attribute LOC of ADJ : signal is p15; attribute LOC of CLR : signal is p39; -锁定管脚end clock;-时钟的结构体部分-ARCHITECTURE behavioral of clock is component counter_60 port(clock : in std_logic; clk_1s : in std_logic; adjust : in std_logic; clr : in std_logic; load : in std_logic; s1 : out std_logic_vector(3 downto 0); s10 : out std_logic_vector(3 downto 0); co : out std_logic); end component; -对模60计数器的例化 component counter_24 port(clock : in std_logic; clk_1s : in std_logic; adjust : in std_logic; clr : in std_logic; load : in std_logic; s1 : out std_logic_vector(3 downto 0); s10 : out std_logic_vector(6 downto 0); end component; -对模24计数器的例化 signal sec,a:std_logic; -通过2分频产生一周期1s的sec信号 signal l1,l2,l3:std_logic; -通过l1,l2,l3来判定对时,分,秒的修改 signal c1,c2:std_logic; -低位向高位的进位信号,c1为从秒向分的进位,c2为从分向时的进位 signal load:std_logic_vector(1 downto 0); signal temp:integer range 0 to 2499; signal temp1:integer range 0 to 95; -计数信号 signal sec_temp:std_logic_vector(7 downto 0); -对秒的暂存信号-基本时钟进程-begin u1 : counter_60 port map (sec,sec,adj,clr,l1,sec_temp(3 downto 0),sec_temp(7 downto 4),c1); u2 : counter_6
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 成人自考


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!