三位计时电路设计-南京理工大学紫金学院vhdl实验报告-eda

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

EDA技术与应用实验报告实验名称:三位计时电路设计姓名:学号:班级:通信时间:2013南京理工大学紫金学院电光系一、实验目的1、学习利用顺序语句描述电路的方法。2、学习进程、常用顺序语句的使用。3、掌握分频电路的设计;掌握利用不完整条件语句构成时序逻辑电路的方法。二、实验原理1、if语句if语句是具有条件控制功能的语句,它根据指定的条件及其条件是否成立来确定语句的执行顺序,格式如下。1)格式1if条件1then第1组顺序语句;Elsif条件2then第2组顺序语句;……elsif条件nthen第n组顺序语句;else第n+1组顺序语句;endif;在该形式的if语句中,只要满足条件1到条件n中的一个条件就执行一条顺序语句,且最优先的条件为条件1,次要的条件列到后面。2)格式2(嵌套)if条件1thenif条件2then……一组顺序语句endif;endif;在该形式的if语句中,只有满足条件1到条件n中的所有条件才能执行相应的顺序语句,且最优先的条件为条件1,次要的条件列到后面。3)格式3if条件then顺序语句;else顺序语句;endif;注意:只有不完整的条件语句才能构成时序逻辑电路,完整的条件语句只能构成组合逻辑电路。2、进程语句进程主要用于描述顺序语句,其格式如下:标记:process(敏感信号表)声明语句;begin顺序语句endprocess;声明语句中可以定义一些局部量,可以包括数据类型、常数、变量、属性、子程序等,不能定义信号。进程语句本为一无限循环语句,进程的启动由敏感信号的变化来启动,否则必须有一个wait语句来激励。虽然进程中包含了顺序语句,但是进程本身是并行语句,即同一结构体中不同进程是并行运行的。信号和变量3、信号信号代表电路内部信号传输线路,在元件之间起互连作用,相当于连线,可以通过端口和其他模块相连接。说明:1)信号时一个全局量,可以在ENTITY和ARCHITECTURE中定义,不可以在进程和子程序的顺序语句中定义信号,但可以在VHDL语句的并行部分和顺序部分同时使用。2)信号赋值的执行和信号值的更新有延时,只有到了规定的仿真时间才赋值,即延时以后信号才能得到新值,否则保持原值不变。3)信号赋值语句在进程内部出现时,是一种顺序描述语句;在结构体的进程之外时时一种并发语句。4)信号说明语句格式:signal信号名:数值类型:=初始值:信号可以赋初始值,也可以不赋初始值。5)信号赋值只能用“=”,信号赋值语句格式:信号=表达式:4、变量变量仅用于局部的电路描述,变量的作用是在进程中作为临时的数据存储单元。说明:1)变量时一个局部量,只能在Process和Function中定义,只能在VHDL语言程序的顺序部分说明和使用,只能出现在进程、过程和函数中。2)变量赋值没有延迟,变量在赋值语句执行后立即得到新值。3)变量赋值只是一种顺序描述语句,二不能作为并发语句使用。4)变量赋值语句格式:variable变量名:数据类型:=初始值;变量初始值定义不是必须的。而且由于硬件电路上电后的随机性,综合器并不支持出示字设置初始值。5)变量赋值只能用“:=”,语句格式:目标变量:=表达式;三、实验内容三位计时器1设计三位计时器1,计时范围0秒-9分59秒,要求电路具有启动、停止、复位三个按钮,时钟频率为1Hz,要求计时器的时间能在数码管上显示。该三位计时器的框图如下所示:clkclrstartstopsec1[3..0]sec0[3..0]min0[3..0]clockinst其中“clk”为时钟脉冲输入端口,“clr”为清零(或复位)端口,“start”为启动端口,“stop”为停止端口,“min0”、“sec0”、“sec1”为输出端口,连接到数码管显示。该三位计时电路的时序如下:该计时电路的结构体主要由三个进程构成,各进程作用如下:进程1:在该进程中主要设置计时器计时和保持的功能。进程2:该进程中设置异步清零,设置秒十位和秒个位的计时。进程3:该进程中设置分个位的计时。1、建立工程、输入代码代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityclockisport(clk,clr,start,stop:instd_logic;sec1,sec0,min0:outstd_logic_vector(3downto0));end;architecturerh1ofclockisbeginprocess(clk,clr,start,stop)variablecnt2,cnt1,cnt0:std_logic_vector(3downto0);beginifclr='1'thencnt2:=0000;cnt1:=0000;cnt0:=0000;elsifstop='1'thencnt2:=cnt2;cnt1:=cnt1;cnt0:=cnt0;elsifclk'eventandclk='1'andstart='1'thencnt0:=cnt0+1;ifcnt0=1010thencnt1:=cnt1+1;cnt0:=0000;ifcnt1=0110thencnt2:=cnt2+1;cnt1:=0000;ifcnt2=1010thencnt2:=0000;endif;endif;endif;endif;min0=cnt2;sec1=cnt1;sec0=cnt0;endprocess;endrh1;2、编译仿真3、管脚配置4、下载将程序下载到实验箱,对实验箱进行操作,将“clock2”区的短路帽插到1Hz管脚上,利用键1控制启动,键2控制停止,键3控制复位。三位计时器2三位计时器2,计时范围0秒-9分59秒,要求同一个按钮实现启动、停止功能,若连续按该按钮超过2秒,电路将清零。时钟频率为1024Hz,要求计时器的时间能在七段数码管上显示。三位计时器2时序如下:该计时电路的结构体主要由三个进程构成,各进程作用如下:进程1:该进程中主要设置分频。由于在实际情况中不存在1Hz的时钟频率源,故要将外部的频率为1024Hz的脉冲分成1Hz的脉冲,以满足计时器电路中所需的时钟脉冲。进程2:该进程主要控制计时和保持两种状态。在该进程中可以利用一个信号(如“converse”)控制计时器的工作状态(计时器计时或处于保持状态)。当复位信号有效时“converse”为低电平,当为高电平时计时器工作,当“converse”为低电平时计时器不工作,处于保持状态;我们可以设置在“start”的下降沿使信号“converse”实现高低电平的翻转。进程3:该进程主要设置计时器的复位功能。要求连续按该按钮超过2秒,电路将复位。也就是说“start”按钮高电平维持的时间要超过2s才能实现复位。可以定义一个变量,时钟脉冲每来一个上升沿,变量加计数一次,当变量值大于2047时(即时间大于2s时),“reset”为高电平,此时计时器复位,否则“reset”为低电平。在该进程中主要利用嵌套的if语句实现复位功能。进程4:该进程主要实现计时以及显示。主要利用嵌套的if语句实现计时。利用case语句实现七段数码管显示。1、建立工程、输入代码libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityclock1isport(clk,start:instd_logic;min0,sec1,sec0:outstd_logic_vector(3downto0));end;architecturerhgofclock1issignalreset:std_logic;signalconverse:std_logic;signalclk_1s:std_logic;beginp1:process(clk,reset)variablecnt:integerrange0to512;beginifreset='1'thencnt:=0;elsif(clk'eventandclk='1')thencnt:=cnt+1;ifcnt=512thenclk_1s=notclk_1s;cnt:=0;endif;endif;endprocess;p2:process(clk_1s,converse,reset)variablem0:std_logic_vector(3downto0);variables1:std_logic_vector(3downto0);variables0:std_logic_vector(3downto0);beginifreset='1'thenm0:=0000;s1:=0000;s0:=0000;elsif(clk_1s'eventandclk_1s='1')andconverse='1'thens0:=s0+1;ifs0=1010thens0:=0000;s1:=s1+1;ifs1=0110thens1:=0000;m0:=m0+1;ifm0=1010thenm0:=0000;endif;endif;endif;endif;min0=m0;sec1=s1;sec0=s0;endprocess;p3:process(start,reset)beginifreset='1'thenconverse='0';elsif(start'eventandstart='0')thenconverse=notconverse;endif;endprocess;p4:process(clk,start)variablecnt1:integerrange0to3000;beginifstart='1'thenif(clk'eventandclk='1')thencnt1:=cnt1+1;ifcnt12048thenreset='1';cnt1:=2048;elsereset='0';endif;endif;elsereset='0';cnt1:=0;endif;endprocess;endrhg;2、编译仿真四、小结与体会通过本次实验,我学会了利用顺序语句描述电路的方法和进程、常用顺序语句的使用掌握分频电路的设计,还掌握了利用不完整条件语句构成时序逻辑电路的方法。

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功