Verilog秒表计时电路
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
秒表计时电路
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