沈阳航空航天大学课程设计报告课程设计名称:计算机组成原理课程设计课程设计题目:12小时数字钟电路设计与实现院(系):计算机学院专业:计算机科学与技术班级:34010104学号:*************姓名:指导教师:***完成日期:2016 年 1月 13 日沈阳航空航天大学课程设计报告目录第1章总体设计方案 (2)1.1设计原理 (2)1.2设计思路 (2)1.3设计环境 (2)第2章详细设计方案 (2)2.1算法与程序的设计与实现 (3)2.2流程图的设计与实现 (4)第3章程序调试与结果测试 (7)3.1程序调试 (7)列举出调试过程中存在的问题 (7)3.2程序测试及结果分析 (7)参考文献 (9)附录(源代码) (10)第1章总体设计方案1.1设计原理通过Verilog语言,编写12小时数字钟电路设计与实现的Verilog程序,一般的做法是底层文件用verilog写代码表示,顶层用写的代码生成的原理图文件链接组成,最后在加上输入输出端口。
采用自上而下的方法,顶层设计采用原理图设计输入的方式。
1.2设计思路1.实时数字钟显示功能,即时、分、秒的正常显示模式,并且在此基础上增加上,下午显示。
2.手动校准。
按动方式键,将电路置于校时状态,则计时电路可用手动方式校准,每按一下校时键,时计数器加1;按动方式键,将电路置于校分状态,以同样方式手动校分。
1.3设计环境(1)硬件环境•伟福COP2000型计算机组成原理实验仪COP2000计算机组成原理实验系统由………•COP2000集成调试软件COP2000集成开发环境是为………….(2)EDA环境•Xilinx foundation f3.1设计软件Xilinx foundation f3.1是Xilinx公司的可编程期间………….第2章详细设计方案2.1 算法与程序的设计与实现(1)秒钟计时器由于秒计数器为60进制计数器,所以以秒计数器作为示例说明其编程思想。
其中秒计数器模块在程序中为always @(posedge clk)的程序段,由上面分析得秒计数器由一个十进制计数器与一个六进制计数器组成,程序中有second0表示秒计数器低位即10进制计数器,second1表示秒计数器的高位为一个六进制计数器。
clk为时钟信号,时钟周期1/60(S),当低位second0满10时,自动进一位,即second1自动进位。
Second0,second1位宽均为4位reg型变量。
(2)分钟钟计时器分钟计时器由于秒计数器为12 进制计数器,示例说明其编程思想。
其中秒计数器模块在程序中为always @(posedge mod )的程序段,由分析得小时计数器由一个二进制计数器与一个三进制计数器组成,程序中有hour0表示秒计数器低位即二进制计数器,hour1表示秒计数器的高位为一个三进制计数器。
Mod为时钟信号,来自分钟计时模块的mod,时钟周期360(S),当低位hour0满3时,自动进一位,即hour1自动进位。
hour1,hour1位宽均为4位reg型变量。
(3)小时计时器小时计时器同秒钟计时器其中小时计数器模块在程序中为always @(posedge tun)的程序段,分钟计时器的低位、高位分别由minute0、minute1表示,但分钟计时器模块的敏感信号为“posedge tun”时钟信号,“tun”的产生自秒钟计时器,可知其产生的时钟信号为1(S),每触发一次则分钟计数器计数加1一次,同时产生mod的时钟信号,同时由于做的是12小时数字钟电路,所有zox表示的是显示上下午,当小时计数器满12时zox变化一次,其中zox=0表示的是上午,zox=1表示的是下午。
(4)时间设置时间设置模块实现的功能为通过按键调节可以对当前时间进行手动控制。
其主要是在时间设置使能端有效地情况下通过SW1和i_SW2两个按键对数字钟的小时和分钟数进行调节。
Disp_drive为设置中的显示控制,即通过SW1对位的调整,Disp_drive随之变化。
i_SW2为对每一位上的数字在其范围内进行加1调节。
Disp_drive取值000、001、010和011分别对应hour1、hour0、minute1和minute0的设置,其中的加1设置在各个计时器模块,这样做的原因是防止两个“always”进程对同一个变量赋值发生错误。
(5)控制显示模块控制显示模块在整个数字钟的设计中起着非常重要的作用。
它的作用是将时间等数据用数码管显示的控制和数据传输模块,包括数据的传输以及BCD码译码等。
通过几个控制使能端将其不同功能时的时间在数码管上显示出来。
本模块中端口定义比较多,下面是其所对应的功能。
clk:时间自动模式工作使能信号;Timeset_EN:时间设置使能信号;Time_disp_select:时间显示位选信号;Disp_select:显示位选信号输出;程序设计中,各使能端信号为1表示执行该功能,以时间自动工作模式使能信号有效为例说明,当Time_EN为1时,首先将时间显示位选信号isp_select 的值赋给显示位选信号disp_select输出,定义time_disp_select的状态一共有6个,分别为100000、010000、001000、000100、000010和000001,其在各状态下分别依次表示将、hour0、hour1、minute0、minute1、second0和second1的值赋给data,用case语句来实现,其实现语句如下:always@(clk,TimeSet_EN,time_disp_select,disp_select,hour1,hour0, minute1,minute0,second1,second0)begin //时钟,秒表显示if((clk || TimeSet_EN) == 1'b1)begindisp_select <= time_disp_select;case(time_disp_select)6'b100000: Data <= hour1;6'b010000: Data <= hour0;6'b001000: Data <= minute1;6'b000100: Data <= minute0;6'b000010: Data <= second1;6'b000001: Data <= second0;default: Data <= 4'b0;endcaseend显示译码数据段主要程序如下:case(Data)4'b0000: disp_data<=7'b1111110;4'b0001: disp_data<=7'b0110000;4'b0010: disp_data<=7'b1101101;4'b0011: disp_data<=7'b1111001;4'b0100: disp_data<=7'b0110011;4'b0101: disp_data<=7'b1011011;4'b0110: disp_data<=7'b1011111;4'b0111: disp_data<=7'b1110000;4'b1000: disp_data<=7'b1111111;4'b1001: disp_data<=7'b1111011;default: disp_data<=7'b0;endcase显示译码程序说明了0到9十个数在7段数码管中所对应的值,在case 语句里面最重要的是一定不能忘了default,否则仿真会发生所不希望看到的结果。
下图13为闹钟设置使能有效时仿真结果。
2.2 流程图的设计与实现1.数字钟2.12小时数字时钟整体第3章程序调试与结果测试3.1 程序调试1、Error (10170): Verilog HDL syntax error at a.v(65) near text "always"; expecting "end"忘记在begin之后加end结束语2、Error (10161): Verilog HDL error at a.v(165): object "Dat" is not declared在程序开始Dat忘记标记和定义3、Error (10170): Verilog HDL syntax error at Time.v(49) near text "else"; expecting "endmodule"程序后面没加"endmodule"4、Error (10170): Verilog HDL syntax error at Time.v(56) near text "<="; expecting ".", or an identifier把“<=”改为“=”3.2 程序测试及结果分析1.从图中可以看出当second0满1010即10时被置为0000,而second1加1,满足秒的低位满十进一位的设置。
2.从图中可以看出,在第一个时钟周期内,时间显示位选信号time_disp_select的值为000000,此时应执行case语句的default,Data的值为0;在第二个时钟周期内,time_disp_select的值为000001,此时对应其最后一种状态,将second0的值赋给Data,即Data的值为0110,从图中看,仿真结果正确,disp_data表示的是将当前数据译码显示之后七段数码管的显示,所以在第一个周期内值为1111110,表示值为0,与Data所表示的数对应。
依次类推,可将Data的值全部表示出来。
3.从图中可以看出,当只有Timeset_EN:时间设置使能信号有效时,其七段数码管显示结果,与数字钟自动工作使能端的区别为闹钟设置使能端有效时只需对hour0、hour1、minute0和minute1进行设置,由于其同样需要将值赋给disp_select,为了统一期间,其值也设为6位,其4个状态分别为100000、010000、001000和000100。
其他与自动工作模式相同。
参考文献[1]张明.Verilog HDL实用教程.成都:电子科技大学出版社,1999[2]齐洪喜,陆颖.VHDL电路设计[M].北京:清华大学出版社,2004[3]江国强,李哲英.EDA技术与应用[M].北京:电子工业出版社,2004[4]雷伏容.VHDL电路设计[M].北京:清华大学出版社,2006[5]曾繁泰,陈美金.VHDL程序设计[M].北京:清华大学出版社,2000[6]潘松,王国栋.VHDL实用教程.成都:电子科技大学出版社,2000[7]赵雅兴.FPGA原理、设计与应用.天津:天津大学出版社,1998[8]陈俊硕,刘景林,张金萍.基于FPGA的直流电机PWM控制器设计[J].微电机2009(10)[9]卢杰,赖毅.VHDL与数字电路设计.北京:科学出版社,2001[10]张昌凡,龙永红,彭涛.可编程逻辑器件及VHDL设计技术.广州:华南工学院出版社,2001附录(源代码)源代码:///////////////////////////`timescale 1ns/1nsModule aa(clk,TimeSet_EN,SW1,i_SW2,zox,disp_select,hour1,hour0,minute1,minute0,second1,second0) ;input clk;input TimeSet_EN; //时间设置使能信号input SW1;input i_SW2;output zox; //上下午指示模output [5:0] disp_select;output [3:0] hour1,hour0,minute1,minute0,second1,second0;reg [7:0] second,minute,hour;reg tun,mod,zox;wire r_SW2;reg [2:0] disp_drive;reg [6:0] time_disp_select;reg [6:0] disp_select;reg [3:0] Data,hour1,hour0,minute1,minute0,second1,second0;reg [6:0] disp_data;reg mt,nt;initialbegintun=0;mod=0;zox=0;hour=0;minute=0;second=0;disp_drive=3'b000;endassign r_SW2=i_SW2;////////////////////////////////////////////////////////////////秒钟计时器always @(posedge clk) //上升沿触发beginif(r_SW2==1'b1)beginif(disp_drive==3'b110)second<=0;tun<=0;endelse if(second==8'h59)beginsecond<=0;tun<=1;endelse beginif(second[3:0]==9)beginsecond[3:0]<=0;second[7:4]<=second[7:4]+1;endelsebeginsecond[3:0]<=second[3:0]+1;endtun<=0;endsecond1<=second[7:4];second0<=second[3:0];end////////////////////////////////////////////////////////////// //分钟计时器always @(posedge tun) //上升沿触发beginif(r_SW2==1'b1)begincase(disp_drive)3'b010: begin //分的高位if(minute[7:4]<5)minute[7:4]<=minute[7:4] + 1;elseminute[7:4]<=0;end3'b011: beginif(minute[3:0]< 9)minute[3:0]<=minute[3:0]+1;elseminute[3:0]<=0;enddefault: beginendendcasemod<=0;endelseif(minute==8'h59)beginminute<=0;mod<=1;endelse beginif(minute[3:0]==9)beginminute[3:0]<=0;minute[7:4]<=minute[7:4]+1;endelsebeginminute[3:0]<=minute[3:0]+1;endmod<=0;endminute1<=minute[7:4];minute0<=minute[3:0];end////////////////////////////////////////////////////////////////////// ////////////////////时钟计时器always @(posedge mod ) //上升沿触发beginif(r_SW2==1'b1)begincase(disp_drive)3'b000: beginif(hour[7:4]==0)hour[7:4]<= hour[7:4]+1;else beginhour[7:4]<= 0;if(zox==0)zox<=1;elsezox<=0;endend3'b001: begin //小时的低位if(hour[3:0]<1)hour[3:0]<= hour[3:0] +1;elsehour[3:0]<=0;enddefault: beginendendcaseendelse beginif(hour==8'h11)beginhour<=0;if(zox==0)zox<=1;else zox<=0;endelsehour[3:0]<=hour[3:0]+1;endhour1<=hour[7:4];hour0<=hour[3:0];end////////////////////////////////////////////////////////////////////// ////////////////////时间设置always @(posedge SW1) //手动设置使能beginif(TimeSet_EN == 1'b1)beginif(disp_drive <3'b101)disp_drive <= disp_drive + 3'b1;elsedisp_drive <= 3'b000;endend////////////////////时钟显示always @(clk, TimeSet_EN,time_disp_select,disp_select,hour1,hour0,minute1,minute0,second1,second0)begin //时钟,秒表显示if((clk || TimeSet_EN) == 1'b1)begin //时钟,秒表显示if(clk || TimeSet_EN == 1'b1)begindisp_select <= time_disp_select;case(time_disp_select)6'b100000: Data <= hour1;6'b010000: Data <= hour0;6'b001000: Data <= minute1;6'b000100: Data <= minute0;6'b000010: Data <= second1;6'b000001: Data <= second0;default: Data <= 4'b0;endcaseendcase(Data) //显示数据译码4'b0000: disp_data <= 7'b1111110;4'b0001: disp_data <= 7'b0110000;4'b0010: disp_data <= 7'b1101101;4'b0011: disp_data <= 7'b1111001;4'b0100: disp_data <= 7'b0110011;4'b0101: disp_data <= 7'b1011011;4'b0110: disp_data <= 7'b1011111;4'b0111: disp_data <= 7'b1110000;4'b1000: disp_data <= 7'b1111111;4'b1001: disp_data <= 7'b1111011;default: disp_data <= 7'b0;endcaseendendendmodule沈阳航空航天大学课程设计报告。