电子科技大学通信学院
秒表计时电路实验报告
班 级 学 生 学 号
实验时间 2015年11月27日
一、设计思路概述
设计要求:秒表计时功能,显示分、秒、0.01秒;具有启动、暂停、停
止和清空功能;增加有趣的流水灯;输入信号:4bit按键,50MHz时钟;输出信号:6位数码管
.设计分析:本设计要求秒表计时功能,显示分、秒、0.01秒,而这可
以由分频电路实现,将电路的输入时钟进行分频,得到1/60Hz,1Hz,和100Hz信号,就可以达到本设计要求的显示要求了;本设计要求具有启动、暂停、停止和清空功能,而这个可以由状态机实现,通过合理的配置状态转换,就可以达到要求。
流水灯的实现:单个灯从左到右逐步发光。相当于是一个移位寄存器,
我们可通过不同的时钟来驱动它,实现不同的流水速度。这里,我们实现了一个1Hz,和一个10Hz的流水灯电路。
二、总体设计框图及详细说明
状态机实现清零、暂停、停止等状态的切换由2比特的key信号控制,计数
器500000进制由输入时钟产生周期0.01s的时钟,这是显示时钟信号的最小单
位。计数器10进制可实现10分频,由他产生的输出时钟为输入时钟周期的10倍,并根据他的状态即计数量作为输出显示对应位的时间信号,6进制实现6分频,实现功能类似于计数器10进制,通过如框图中的组合可产生时钟信号的不同位。显示译码电路显示时钟,输出56位,因为时钟信号具有8位,输出信号连到相应的数码管即可。
三、模块设计框图、相关时序 1.6进制计数器(分频器)设计
//计数器实现6分频,计数到达2和5,输出始终翻转一次,且计数达到5时计
数清零
module count6(rst, clk, clkout, counter); input rst; input clk;
output reg clkout;
output reg [3:0]counter;
always @(negedge clk or negedge rst) begin if (~rst) begin clkout <= 0; counter <= 0; end
else if (counter == 2 )begin clkout <= ~clkout;
counter <= counter + 4'b1; end
else if (counter == 5) begin clkout <= ~clkout; counter <= 0; end else begin
counter <= counter + 4'b1; end end
endmodule
仿真结果为:
由图可知实现了6分频。
2、10进制计数器(分频器)设计
//计数器实现10分频,计数到达4和9,输出始终翻转一次,且计数达到9时计数清零
module count10(rst, clk, clkout, counter); input rst; input clk;
output reg clkout;
output reg [3:0]counter;
always @(negedge clk or negedge rst) begin if (~rst) begin clkout <= 0; counter <= 0; end
else if (counter ==4) begin clkout <= ~clkout;
counter <= counter + 4'b1; end
else if (counter == 9) begin clkout <= ~clkout; counter <= 0; end
else begin
counter <= counter + 4'b1; end end endmodule
仿真结果为:
由图可知实现了10分频。
3、500000进制计数器(分频器)设计:
//实现500000分频,目的是把50Mhz的系统时钟分频成为100Hz的 always @(negedge clk or negedge rst10ms) begin if (~rst10ms) begin
clk10ms<=0; clk10msreg<=0; end
else if (clk10msreg == 249999) begin
clk10ms<=~clk10ms ;
clk10msreg<=clk10msreg+1; end
else if (clk10msreg==499999) begin
clk10ms<=~clk10ms; clk10msreg<=0; end else begin
clk10msreg<=clk10msreg+1; end end
4、状态机设计
代码为:
//通过状态机实现复位信号的转换
always @(negedge clk or negedge clear) begin if (~clear) begin
state <= idlestate; rst <= 0; rst10ms <= 0; end else begin
case (state)
idlestate: begin if(~start)