




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CPLD课程学习报告学生姓名:熊军 同组者姓名:黄辉CPLD的全称是 Complex Programmable Logic Device (即复杂可编程器件),但本次试验所使用的器件并不是CPLD而是FPGA,FPGA的全称是Field Programmable Gate Array (即现场可编程门阵列)。FPGA与CPLD有很多相似点,它们都是可编程数字逻辑器件,都在时序逻辑电路和组合逻辑电路中有很强的优势。它们的区别在于,FPGA的容量大、速度慢且不可预测、掉电信息丢失,二CPLD容量小、速度快且有很好的可预测性、掉电信息不丢失。CAD的全称是 Computer Aided Design(即计算机辅助设计)。本实验所用到的软件是MAX+PLUS II,本次试验目的是做一个数字时钟。该数字时钟包含五个主模块,它们分别是数字时钟模块、闹钟模块、跑表模块、模式选择模块和音乐模块。完成的功能如下:1、数字时钟,时、分、秒六位数码管显示(标准时间23点59分59秒),具有小时、分钟加减调时调分的校准功能,整点报时:55,56,57,58,59低音响,正点高音,间断振铃(嘟-嘟-嘟-嘟-嘟-嘀);2,、定时闹钟,可在00:00到23:59之间由用户设定任一时间,到时报警,定时闹钟花样,前10s一般振铃,其后13秒较急促,再其后17秒急促,最后20秒特急促振铃。并可随时关断;3、跑表,最大计时99分59秒999毫秒。独立的跑表功能,不影响数字钟正常工作。另外附加一段音乐,可随时控制播放和停止,不影响其他任何功能,音乐的内容是两只蝴蝶。系统原理图如下:系统共有九个输入管脚,41个输出管脚,输出管脚中包括一个蜂鸣器,八个数码管,八个LED发光二极管。图中的D触发器的作用是为了使跑表具有后台功能。下面依次介绍这五个模块。一、 数字时钟模块数字时钟模块包含四个部分,它们分别是六十进制计数器、二十四进制计数器、分频器和整点报时控制器。它们的原理图如下,程序见附录。六十进制计时器和二十四进制计数器的思想一样,都是利用时钟沿计数,并将计数值输出,不同的是计数器模(即计数上限值)。六十进制计数器的模式60,二十四进制计数器的模是24。它们都包含clk、reset、en、sub、qh、ql、carry七组引脚,其中只有qh和ql的宽度是四位,其它全为一位。clk 是时钟输入端,上升沿有效;reset 是异步复位端,高电平有效;en 是使能端,低电平有效,高电平计数保持;sub 是减计数,高电平有效;qh、ql分别是计数器的十位和个位,高电平有效;carry 是进位端,正脉冲有效。将两个六十进制计数器和一个二十四进制计数器依次串联起来,用1Hz的时钟驱动,就组成了简单的数字时钟。同时为了实现调时功能,将调时信号和时钟信号做异或运算后的信号作时钟信号。这里之所以使用与异或门,是因为无论调时信号的状态如何,都不会封锁正常的时钟线号,只是电平相反,时钟超前或滞后半个时钟周期,这是异或门的优点。而与门和或门就不行,低电平封锁与门,高电平封锁或门。分频器是将50MHz的时钟信号分频成clk1、clk2、clk3 三种频率的方波,它们的频率分别是500Hz、1500Hz、1Hz。500Hz对应的音调是 嘟,1500Hz对应的音调是 嘀,1Hz的信号就作时钟驱动信号。整点报时控制器是在59分55、56、57、58、59秒从beep引脚送出clk1,整点时从beep引脚送出clk2 。但是为了使每秒之间的响声是间断的,我们将 clk1 和 clk2 分别与clk3 相与后再送入整点报时控制器,从而使beep 发出 嘟-嘟-嘟-嘟-嘟-嘀 的声音。二、 闹钟模块闹钟模块包括五个部分,它们分别是分频器,铃声控制器,六十进制计数器、二十四进制计时器、比较选择器。它的原理框图如下,程序见附录。分频器和铃声控制器实现闹钟的铃声控制。分频器将从 clk 送来的50MHz 的时钟信号分频成1Hz 的 clk1、2Hz 的 clk2、3Hz的 clk3、4Hz的 clk4、1KHz的clkout 。铃声控制器是在09s 之间将clk1 与 clkout 相与后输出给 speaker ,1022s 之间将clk2 与 clkout 相与后输出给 speaker ,2339s 之间将clk3 与 clkout 相与后输出给 speaker ,4059s 之间将clk4 与 clkout 相与后输出给 speaker 。前10s一般振铃,其后13秒较急促,再其后17秒急促,最后20秒特急促振铃。这里的六十进制和二十四进制计数器就是利用上面的六十进制计数器的模块和二十四进制计数器的模块,这里就不在赘述,但是在计数器外部有些不同,在闹钟模块里面只有调时时钟而没有驱动时钟。比较选择器有四组引脚,它们分别是 A、B、Y、s、k,其中只有s和k是一位宽度,其他都为四位 。它的作用是,当s 为高电平时,Y等于A,当s为低电平时,Y等于B,且当A与B相等时,k为高电平,否则为低电平。最后,4个k输出端口和speaker端口以及闹钟开关,共六个端口接入一个六输入与门。这样就完成了定时,当时钟时间与定时时间相等时,四个k都输出高电平。如果闹钟开关alarm_switch也为高电平(即闹钟开)是,六输入的与门就打开,beep就会按speaker的节奏响起相应的音乐。同时将四个s接到一起,就可以实现显示控制,是显示闹钟还是显示时钟。三、 跑表模块跑表模块包括分频、六十进制计数器、十进制计数器、选择器四个部分。它的原理图如下,程序见附录。跑表模块里的内容几乎都是用前面的模块,唯独不同的是这里专门用了一个分频器产生1KHz的时钟信号,用它驱动级联的三个十进制计数器、一个六十进制计数器和一个一百进制计数器。这里的一百进制计数器与前面的六十进制计数器以及二十四进制计数器实质是一样的,总体框架与时钟模块非常相似。四、 模式选择模块模式选择的作用是为了实现时钟调时、闹钟调时和跑表调时。它的引脚比较多,共en,reset,sub,setmin,sethour,sel_m; time_en,time_res,time_sub,time_min,time_hour; alarm_en,alarm_res,alarm_sub,alarm_min,alarm_hour; piaobiao_en,piaobiao_res,piaobiao_sub,piaobiao_min,piaobiao_hour; time_alarm,paobiao; model_x 二十四个,其中只有model_x是四位宽度,其他都为一位。程序见附录。en,reset,sub,setmin,sethour 这五个管脚是用来调节的,sel_m 是用来切换模式的,有0,1,2,3 四种模式,通过model_x输出显示。0模式下en,reset,sub,setmin,sethour 失效,输出控制脚全部接地,time_alarm,paobiao 全高,显示时钟;1模式下en,reset,sub,setmin,sethour分别与time_en,time_res,time_sub,time_min,time_hour对应连接,此时可调节时钟时间,time_alarm,paobiao全高,显示时钟时间;2模式下en,reset,sub,setmin,sethour分别与alarm_en,alarm_res,alarm_sub,alarm_min,alarm_hour对应连接,此时可调节闹钟时间,time_alarm为低,paobiao为高,显示闹钟时间;3模式下en,reset,sub,setmin,sethour分别与piaobiao_en,piaobiao_res,piaobiao_sub,piaobiao_min,piaobiao_hour对应连接,此时可调节跑表时间,time_alarm,paobiao全底,显示跑表时间。五、 音乐模块音乐模块程序结构比较简单,但是篇幅较长。大体上说,包括音律部分,分频部分,译码部分和LED灯控制部分。它的原理是先读出音律,将音律译码成对应的分频系数,再将分频系数送到分频器,输出对应频率的信号,得到对应的音乐效果。而LED灯控制器则是在不同的音律下点亮不同的LED灯,实现随音律闪烁的效果。程序见附录。做完了实验,上完了CPLD及电子CAD课,我感觉很愉快,看到了自己的成果。开始我们做的是十进制计数器,从简单到复杂,紧接着做六十进制计数器和二十四进制计数器,再在各个计数器上加上减计数,使它能够双向计数,最后将它们组合起来,做成一个数字时钟。同时,这次试验也让我学会了MAX+PLUS II 这个软件以及EP1K30TC144-1 FPGA芯片。虽然这次试验有很大的收获,但是任然有需要改进的地方。首先,时钟后面可以在级联几个计数器,完成日、月、星期甚至年的显示。然后,音乐还可以加丰富一些,用几首歌切换,并且可以调节播放速度,音量大小,显示播放时间等。(本报告的重点)if reset=1 then q=0000;count:=0;elsif clkevent and clk=1 thenif en=0 thenif sub=0 then if count=9 then count:=0;carry=1;else count:=count+1;carry=0; end if;elseif count=0 then count:=9;carry=1;else count:=count-1;carry=0; end if;end if; end if;end if;本次试验总结:我觉得这次试验最令我纠结的是减调时,它出现的问题是,调时后计数器的第一个周期内不进位。分析其原因,如下:首先分析它的时序,以十进制为例。以前的程序如程序一。当计数器从9到0时,carry为高电平,产生进位信号,如果在此时将sub置为高电平,那么当下一个时钟到来时,计数器就从0到9,carry为高电平,由于carry本来就是高电平,所以不会产生脉冲信号,表现为不进位。当计数器由逆计数到正计数时,也会产生同样结果。程序一为解决这个为题,现有的方法有两种:方法一,如程序三所示。为保证计数器在正计数时仅0时刻carry为高电平,逆计数时仅9时刻carry为高电平,我们将carry采用异步置数法,在sub=0(即正计时)、count=0,和 sub=1(即逆计数时)、count=9 时,将carry置高电平,其他情况下置低电平。这样做,方法简单,易理解,但是它的缺点是,当count的值为9或0时,sub就可以充当进位时钟,即仅sub的变化会引起carry的变化。方法二,如程序二所示。减小进位脉冲的的宽度,是carry在产生进位信号后,能立即回到低电平。在十进制计数器中,将进位脉冲与时钟信号相与后,在作为新的进位信号。这样,进位脉冲信号的宽度就只有时钟信号一个周期的脉宽。以时钟为例,假设驱动秒计数器的时钟脉宽为50%,即0.5s。如果采用程序一的方法,秒向分进位的信号脉宽就为1s,分向十进位的脉宽就为1min。而整个系统进位时间最短时只有1s(23:59:59),如果在调时后,carry认为高电平,就会产生进位的回程差,不进位。如果采用程序二的方法,秒向分进位的脉宽就为0.5s,而分向十进位的脉宽任然为0.5s,所以能够保证每次驱动妙的时钟生效时,各计数器都工作在就绪状态,不会产生不进位的现象。同时carry是在时钟的驱动下工作的,所以仅sub的变化不会引起进位信号carry的变化。本实验采取的就是程序二的方法和思想。if reset=1 then q=0000;count:=0;elsif clkevent and clk=1 thenif en=0 thenif sub=0 then if count=9 then count:=0;co=1; else count:=count+1;co=0; end if;elseif count=0 then count:=9;co=1; else count:=count-1;co=0; end if;end if; end if;end if;carry=co and clk;if reset=1 then q=0000;count:=0;elsif clkevent and clk=1 thenif en=0 thenif sub=0 then if count=9 then count:=0;else count:=count+1; end if;elseif count=0 then count:=9;else count:=count-1; end if;end if; end if;end if;if (sub=0 and count=0) or (sub=1 and count=9) thencarry=1;elsecarry=0;end if;程序二程序三下面再谈谈MAX+PLUS II 的使用过程;图二、保存图一、新建文件保存文本文件的后缀名是*.vhd,图形文件的后缀名是*.gdf。 图四、图新文件中插入符号图三、将工程设置为当前文件注意:在首次打开文件或者没有建项目时,必须执行该操作,以确保编译的是当前文件。图六、编译成功 图五、编译图七、编译过程文本文件编译后,会自动生成符号文件,二图形文件则必须手动生成。图八、波形仿真过程(添加管脚)波形文件的名称必须与当前编译文件名相同。图九、选择芯片型号本次实验所用的芯片型号是EP1K30TC144-1。图十、分配引脚图十一、加载sof文件并下载到目标芯片中必须移除以前的*.sof文件,在加载目标的文件。附录:一、图片:数字时钟模块模式选择器模块跑表模块定时闹钟模块时钟分频模块音乐模块二十四进制计数器模块六十进制计数器模块闹钟分频模块整点报时模块选择比较器模块闹钟铃声控制器模块一百进制计数器模块跑表分频模块 定时闹钟内部结构数字时钟内部结构跑表内部结构系统整体结构 二、程序:六十进制计数器程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity hx11_cnt60_1 is port(clk,reset,en,sub:in std_Logic; qh,ql:out std_logic_vector(3 downto 0); carry:out std_logic);end;architecture beh of hx11_cnt60_1 issignal co:std_logic;begin process(clk,reset,en,sub) variable count:integer range 0 to 59; begin if reset=1 then qh=0000;ql=0000;count:=0; elsif clkevent and clk=1 thenif en=0 then if sub=0 thenif count=59 then count:=0;co=1; else count:=count+1;co=0; end if;elseif count=0 then count:=59;co=1; else count:=count-1;co=0; end if;end if;carry= co and clk;if count10 thenqh=conv_std_logic_vector(0,4);ql=10 and count20 thenqh=conv_std_logic_vector(1,4);ql=20 and count30 thenqh=conv_std_logic_vector(2,4);ql=30 and count40 thenqh=conv_std_logic_vector(3,4);ql=40 and count50 thenqh=conv_std_logic_vector(4,4);ql=conv_std_logic_vector(count-40,4);elseqh=conv_std_logic_vector(5,4);ql=conv_std_logic_vector(count-50,4);end if; end if; end if;end process;end beh;二十四进制计数器程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity hx11_cnt24_1 is port(clk,reset,en,sub:in std_Logic; qh,ql:out std_logic_vector(3 downto 0); carry:out std_logic);end;architecture beh of hx11_cnt24_1 issignal co:std_logic;begin process(clk,reset,en,sub) variable count:integer range 0 to 23; begin if reset=1 then qh=0000;ql=0000;count:=0; elsif clkevent and clk=1 thenif en=0 then if sub=0 then if count=23 then count:=0;co=1; else count:=count+1;co=0; end if; elseif count=0 then count:=23;co=1; else count:=count-1;co=0; end if; end if; carry=co and clk;if count10 thenqh=conv_std_logic_vector(0,4);ql=10 and count20 thenqh=conv_std_logic_vector(1,4);ql=20 thenqh=conv_std_logic_vector(2,4);ql=conv_std_logic_vector(count-20,4);end if; end if; end if; end process;end beh;时钟分频器程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity hx11_fenp is port(clk:in std_logic; clk1,clk2,clk3:out std_logic);end;architecture beh of hx11_fenp isbegin process(clk) variable cnt1:integer range 0 to 100000; begin if clkevent and clk=1 then if cnt150000 then clk1=50000 and cnt1=100000 then clk1=0; cnt1:=cnt1+1; else cnt1:=0; end if; end if; end process; process(clk) variable cnt2:integer range 0 to 34000; begin if clkevent and clk=1 then if cnt217000 then clk2=17000 and cnt2=34000 then clk2=0; cnt2:=cnt2+1; else cnt2:=0; end if; end if; end process; process(clk) variable cnt3:integer range 0 to 49999999; begin if clkevent and clk=1 then if cnt324999999 then clk3=24999999 and cnt3=49999999 then clk3=0101 and secl=1001 then beep=clk1; end if; elsif minh=0000 and minl=0000 and sech=0000 and secl=0000 then beep=clk2; else beep=0; end if; end process;end; 闹钟分频器:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity hx11_alarm_fenp is port(clk:in std_logic; clk1,clk2,clk3,clk4,clkout:out std_logic);end;architecture beh of hx11_alarm_fenp isbegin process(clk) variable cnt1:integer range 0 to 49999999; begin if clkevent and clk=1 then if cnt124999999 then clk1=24999999 and cnt1=49999999 then clk1=0; cnt1:=cnt1+1; else cnt1:=0; end if; end if; end process; process(clk) variable cnt2:integer range 0 to 24999999; begin if clkevent and clk=1 then if cnt212499999 then clk2=12499999 and cnt2=24999999 then clk2=0; cnt2:=cnt2+1; else cnt2:=0; end if; end if; end process; process(clk) variable cnt3:integer range 0 to 12499999; begin if clkevent and clk=1 then if cnt36259999 then clk3=6259999 and cnt3=12499999 then clk3=0; cnt3:=cnt3+1; else cnt3:=0; end if; end if; end process; process(clk) variable cnt4:integer range 0 to 6259999; begin if clkevent and clk=1 then if cnt43124999 then clk4=3124999 and cnt4=6259999 then clk4=0; cnt4:=cnt4+1; else cnt4:=0; end if; end if; end process; process(clk) variable cnt:integer range 0 to 49999; begin if clkevent and clk=1 then if cnt24999 then clkout=24999 and cnt=49999 then clkout=0000 and secl=1001 thenspeaker=clk1 and clk;elsif sech=0001 or (sech=0010 and secl0011) thenspeaker=0011) or sech=0011 thenspeaker=clk3 and clk;elsespeaker=clk4 and clk;end if; end process;end;比较选择器:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity hx11_mux2 is port(a,b:in std_logic_vector(3 downto 0); s:in std_Logic; y:out std_logic_vector(3 downto 0); k:out std_logic);end;architecture beh of hx11_mux2 isbeginprocess(s,a,b)beginif s=1 theny=a;elsey=b;end if;end process;process(a,b)beginif a=b thenk=1;elsek=0;end if;end process;end;跑表分频器:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity hx11_1Khz isport(clk:in std_logic; clkout:out std_logic);end;architecture beh of hx11_1Khz isbeginprocess(clk)variable count:integer range 0 to 49999;beginif rising_edge(clk) thenif count=49999 then clkout=1;count:=0;elsecount:=count+1;clkout=0;end if;end if;end process;end;十进制计数器:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity hx11_cnt10_1 is port(clk,reset,en,sub:in std_Logic; q:out std_logic_vector(3 downto 0); carry:out std_logic);end;architecture beh of hx11_cnt10_1 issignal co:std_logic;begin process(clk,reset,en,sub) variable count:integer range 0 to 9; begin if reset=1 then q=0000;count:=0; elsif clkevent and clk=1 thenif en=0 thenif sub=0 then if count=9 then count:=0;co=1; else count:=count+1;co=0; end if;elseif count=0 then count:=9;co=1; else count:=count-1;co=0; end if;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玩转黏土-传承民俗课件
- 2025年事业单位招聘考试综合类专业能力测试试卷(工程类)化学工程与工艺试题集
- 王蒙新疆的歌课件
- 2025年三支一扶考试公共基础知识试卷(食品科学类)
- 2025年四川省事业单位招聘考试教师招聘英语学科专业知识试卷范文
- 2025年深圳市公务员录用考试小语种职位外语水平测试试卷
- 2025年事业单位招聘考试综合类专业知识试卷(教育哲学与教育心理学)
- 客户数据安全共享协议-洞察及研究
- 运动想象与神经可塑性-洞察及研究
- 2025年评茶员(高级)考试试卷实战演练指南
- 安全生产费用使用范围及计量办法
- 肾脏疾病常见症状和诊疗
- 安全环保职业卫生消防题库及答案
- 数据中心负荷计算方法
- 金X绅士无双攻略
- 第八章 立体几何初步(章末复习) 高一数学 课件(人教A版2019必修第二册)
- GB/T 27518-2011西尼罗病毒病检测方法
- GB/T 26255-2022燃气用聚乙烯(PE)管道系统的钢塑转换管件
- GB/T 14202-1993铁矿石(烧结矿、球团矿)容积密度测定方法
- 新时代中小学教师职业行为十项准则考核试题及答案
- 某工业区供水管道工程施工组织设计
评论
0/150
提交评论