1、西南科技大学 设计报告 课程名称: 基于 FPGA的现代数字系统设计 设计名称: 基于原理图的数字跑表设计 姓 名: 学 号: 班 级: 指导教师: 2 西南科技大学信息工程学院 3 一、 实验目的 1、 设计一个数字跑表,具有复位、暂停、秒表等功能 二、 实验原理 1.完成一个具有数显输出的数字跑表计数器设计,原理图如下图所示。 、 数字跑表计数器原理图 4 任务分析: 输入端口: 1)复位信号 CLR,当 CLR=1,输出全部置 0,当 CLR=0,系统正常工作。 2)暂停信号 PAUSE,当 PAUSE=1,暂停计数,当 PAUSE=0,正常计数。 3)系统时钟 CLK,CLK=50MH
2、z 输出端口: 数码管驱动-DATA1 ,位宽 14 位,其中,DATA17 :0 是数 码管显示值,DATA114 :8 是数码管控 制端口 屏蔽未用端口-ctr ,位宽是 2,将未用的两个数码管显示关闭 5 (1) 跑表的计时范围为 0.01s59min59.99s,计时精度为 10ms; (2) 具有异步复位清零、启动、计时和暂停功能; (3) 输入时钟频率为 100Hz; (4) 要求数字跑表的输出能够直接驱动共阴极 7 段数码管显示. 按照自顶向下设计,应该分为以下模块: 分频-将下载板上 50MHz 时钟分频为周期是 0.01 秒的时钟,提供给百分计数 计数 1-百分计数,输入周期
3、是 0.01 秒的时钟,计数,满 100 进位,注意个位,十位的不同生成 计数 2-60 进制计数器,输入百分位,或者秒位的进位,计数,满 60 向高位进位,注意个位,十位的不 同生成 数码管显示控制-驱动数码管数据,显示控制端口。 三、 实验步骤 1、数码管显示驱动模块的设计 (1)建立工程:file-New Project ,并注意器件、 EDA 工具的正确选择 (2)建立新 Verilog HDL 模块编辑窗口,选择资源类型为 Verilog Module,并输入合法文件 名,在文本编辑窗口输入代码。 (3)执行综合得到综合后的电路,并进行功能时序仿真。 2.计数器模块的设计 设计步骤同
4、数码管的设计,并完成模块的设计输入、综合、功能仿真。 3.数码管和计数器组合为一个系统 用 Verilog HDL 将数码管和计数器组合为一个模块,完成综合、功能仿真,分析波形,修正 设计。 4.把电路进行综合的编译之后,锁定引脚,下载到板子上进行实际仿真验证 四、 实验结果及分析 1.在 Design 窗口中,选择 Design UtilitiesCreate Schematic Symbol 创建跑表模块; 6 2.时序图 激励文件代码 timescale 1ns / 1ps module TSET; reg CLK; reg CLR; reg PAUSE; wire 13:0 DATA1
5、; paobiao uut (.CLK(CLK), .CLR(CLR), .PAUSE(PAUSE), .DATA1(DATA1); initial begin CLK = 0;CLR = 0;PAUSE = 0; #10 CLR=1; #10 CLR=0; 7 forever begin #10 CLK=!CLK; end end Endmodule 解释:过了 10 时间后 clk=1,再过 10 时间后 clk=0;每过 10 个时间后,clk 的值进行一次翻转,从而生 成的时钟周期是 20 个时间单位 3. 锁定引脚 # PlanAhead Generated physical con
6、straints NET “CLK“ LOC = V10; NET “CLR“ LOC = D14; NET “PAUSE“ LOC = C14; NET “DATA10“ LOC = R7; NET “DATA11“ LOC = V7; NET “DATA12“ LOC = U7; NET “DATA13“ LOC = V6; NET “DATA14“ LOC = T6; NET “DATA15“ LOC = P6; NET “DATA16“ LOC = N5; NET “DATA17“ LOC = P7; NET “DATA113“ LOC = N8; NET “DATA112“ LOC
7、= M8; NET “DATA111“ LOC = T8; NET “DATA110“ LOC = R8; NET “DATA19“ LOC = V9; NET “DATA18“ LOC = T9; 用开关一来实现对数字的清除操作 用开关二来实现对数字的暂停操作 8 五、 体会 我初步掌握了 Verilog HDL 这种目前应用最广泛的硬件描述语言的编写方法以及联机下载到 硬件验证的整个流程,圆满完成了设计任务。 程序设计是这次实验的重点,通过老师上课讲 的内容自己实际做了进位程序以及分频程序,基本掌握了它的使用。 在写完程序后,发现不 能调用各个程序模块,后来在同学的点拨下改成使用程序模块来
8、生成具体的模块来使整个系 统正常工作。 程序设计遇到了数码管无法显示的瓶颈,在老师的指导下最终解决了这一问题。 在此次课程设计过程中,我提升了自己的自学能力和动手能力,这也是一笔很大的收获。 代码: timescale 1ns / 1ps module paobiao(CLK,CLR,PAUSE,DATA1); input CLK,CLR; input PAUSE; output13:0 DATA1; reg3:0 MSH,MSL,SH,SL,MH,ML,dig; reg cn1,cn2; reg 10:0 div_count1; reg 18:0 div_count; reg timer_c
9、lk; always (posedge CLK or posedge CLR) if(CLR) div_count = 19h0; else if(div_count = 19h7a11f) div_count = 19h0; 9 else div_count = div_count+1b1; always (posedge CLK or posedge CLR) if(CLR) timer_clk = 1b0; else if(div_count= 0) timer_clk = 1b1; else timer_clk = 1b0; always (posedge timer_clk or p
10、osedge CLR) begin if(CLR) begin MSH,MSL=8h00; cn1=0; end else if(!PAUSE) begin if(MSL=9) begin MSL=0; if(MSH=9) begin MSH=0; cn1=1; end else MSH=MSH+1; end else begin MSL=MSL+1; cn1=0; end end end always (posedge cn1 or posedge CLR) begin if(CLR) begin SH,SL=8h00; cn2=0; end else if(SL=9) begin SL=0
11、; if(SH=5) begin SH=0; cn2=1; end else SH=SH+1; 10 end else begin SL=SL+1; cn2=0; end end always (posedge cn2 or posedge CLR) begin if(CLR) begin MH,ML=8h00; end else if(ML=9) begin ML=0; if(MH=5) MH=0; else MH=MH+1; end else ML=ML+1; end function7:0 Xrom; input 3:0 sum; case(sum) 4b0000 : Xrom = 7b
12、1111110 ; 4b0001 : Xrom = 7b0110000 ; 4b0010 : Xrom = 7b1101101 ; 4b0011 : Xrom = 7b1111001 ; 4b0100 : Xrom = 7b0110011 ; 4b0101 : Xrom = 7b1011011 ; 4b0110 : Xrom = 7b1011111 ; 4b0111 : Xrom = 7b1110000 ; 4b1000 : Xrom = 7b1111111 ; 4b1001 : Xrom = 7b1111011 ; 4b1010 : Xrom = 7b1110111 ; 4b1011 : X
13、rom = 7b0011111 ; 4b1100 : Xrom = 7b1001110 ; 4b1101 : Xrom = 7b0111101 ; 4b1110 : Xrom = 7b1001111 ; 4b1111 : Xrom = 7b1000111 ; default : Xrom = 7b1111110 ; endcase endfunction always (posedge CLK or posedge CLR) 11 if(CLR) begin div_count1 = 11h0; dig = 3b000; end else begin div_count1 = div_coun
14、t1 + 1; if(div_count1 = 0) if(dig=3b101) dig = 3b000; else dig = dig + 1b1; else dig = dig; end reg13:0 DATA1; always (posedge CLK or posedge CLR) if(CLR) DATA1 = 14b0; else case(dig) 3b000:DATA1=6b111110,Xrom(MSL); 3b001:DATA1=6b111101,Xrom(MSH); 3b010:DATA1=6b111011,Xrom(SL); 3b011:DATA1=6b110111,Xrom(SH); 3b100:DATA1=6b101111,Xrom(ML); 3b101:DATA1=6b011111,Xrom(MH); default:DATA1=14h3fff; endcase endmodule