当前位置:文档之家› Verilog秒表计时电路

Verilog秒表计时电路

秒表计时电路
1.实验内容
1.秒表计时功能,显示分、秒、0.01秒
2.具有启动、暂停、停止和清空功能
3.增加有趣的流水灯
4.输入信号:4bit按键,50MHz时钟
5.输出信号:6位数码管
2.实验原理
(1) Verilog语言
Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

本实验使用Verilog语言编写代码,通过编译,综合等实现电路设计。

其中涉及基本的语法知识,可通过查阅相关资料进行了解。

(2) quartus软件
Quartus是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHD等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

本实验以quartus为平台,完成代码的编辑,编译,综合及分配引脚等,最后下载。

(3) Altera DE2实验板
DE2板具有很多特性可以允许使用者实现像从单个电路到多媒体工程的广泛的电路设计。

除了一些硬件特性,DE2还有对标准IO接口的软件支持和一个可以接入多种元件的控制平台。

并且这些软件还提供一系列展现DE2板高级性能的演示。

为了向用户提供最大的灵活性,所有的连接通过Cyclone II FPGA设备。

因此用户可以配置FPGA来实现任何系统设计。

本实验用到的电路模块如右
(4) 数码管
采用共阳数码管,数码管段选方式如下
每一个数码管单独与FPGA连接
通过并行总线控制数码管显示
3.设计思路及实现方案
(1)时钟分频
clk10ms→ clk100ms → clk1s→clk10s→clk1min→clk10min→clk1h
分频单元:六分频,十分频
50MHz到100Hz分频,500000分频
(2)状态机设计
(3)设计框图
4.代码添加及说明
a)六进制分频代码
//计数器实现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 == 4’b0010) begin //计数满2输出反转
clkout <= ~clkout;
counter <= counter + 4'b1;
end
else if (counter == 4’b0101) begin //计数满4输出反转同时清零clkout <= ~clkout;
counter <= 0;
end
else begin
counter <= counter + 4'b1;
end
end
endmodule
b)十进制分频代码
//计数器实现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 counter<=0;clkout<=0; end
//计数满4输出反转
else if (counter ==4'b0100) begin clkout<=~clkout;counter<=counter+1; end //计数满9输出反转同时计数清零
else if (counter ==4'b1001) begin clkout<=~clkout;counter<=0; end
else begin counter<=counter+1; end
end
endmodule
c)时钟分频代码
always @(negedge clk or negedge rst10ms) begin
if(~rst10ms)begin clk10msreg<=0;clk10ms<=0;end
else if(clk10msreg==249999)begin clk10ms<=~clk10ms;clk10msreg<=0;end
else begin clk10msreg<=clk10msreg+1;
end
d)状态机代码
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)begin state<=prestate;rst<=0;rst10ms<=0;end
else begin state<=idlestate;end
end
prestate: begin state<=runstate;rst<=1;rst10ms<=1;end
holdstate:begin if(~start)begin state<=runstate;rst<=1;rst10ms<=1;end
else if(~stop)begin state<=idlestate;rst<=1;rst10ms<=0;end
else begin state<=holdstate;end
end
runstate:begin if(~stop)begin state<=idlestate;rst<=1;rst10ms<=0;end
else if(~hold)begin state<=holdstate;rst<=1;rst10ms<=0;end
else begin state<=runstate;end
end
default: state <= state;
endcase
end
end
e)各级分频代码
count6 min10counter(rst, clk10min,clk1h, timeout[7]); //10min6分频得1h
count10 min1counter (rst, clk1min, clk10min, timeout[6]);//1min 10分频得10min
count6 sec10counter(rst, clk10s, clk1min, timeout[5]);//10s 6分频得1min
count10 sec1counter (rst, clk1s, clk10s, timeout[4]);// 1s 10分频得10s
count10 ms100counter(rst, clk100ms, clk1s, timeout[3]); // 100ms10分频得1s
count10 ms10counter (rst, clk10ms, clk100ms, timeout[2]); // 10ms10分频得100ms
assign timeout[1] = 4'b1111;
assign timeout[0] = 4'b1111;
5.实验结果及分析
实验中共有四个控制按键分别测试其控制功能即启动,暂停,停止,清空。

当按下启动按键时计时器开始计时;
当按下暂停按键时计时器停止计数,再按启动又继续计时;
当按下停止按键时停止计时,再按启动从0开始;
无论何时只要按下清空按键计时器便清零。

其现象如下:
6.实验心得
1.编译时出现许可证问题;分析是软件并未破解,关闭软件重新破解。

2.编译出错;分析是代码有错,检查代码更正错误,重新编译。

3.通过本次实验对状态转移图有了更多的了解,对其应用方法有了基本的掌握。

4.进一步熟悉了硬件编程语言。

相关主题