FPGA电子秒表计时器verilog实验报告
FPGA实验 计时器和倒计时的系统设计
实验五 计时器和倒计时的系统设计一、实验目的①掌握用Verilog HDL 文本输入法设计计时电路的方法,并通过电路仿真和硬件验证,进一步了解计时器的功能和特性。
②掌握用Verilog HDL 文本输入法设计倒计时电路的方法,并通过电路仿真和硬件验证,进一步了解倒计时电路的功能和特性。
二、实验原理1. 计时器24小时计时器的电路框图如图8.1所示。
图8.1 24 小时计时器的电路框图24小时计时器由2个60进制加计数器和1个24进制加计数器构成,输入CLK 为1Hz(秒)的时钟,经过60进制加计数后产生1分钟的进位时钟信号,再经过60进制加计数后产生1小时的进位时钟信号送给24进制加计数器进行加计数,当加计数到达23: 59: 59后,再来一个秒脉冲,产生时的进位输出。
将两个60进制加计数器和一个24进制加计数器的输出送数码管显示,得到计时器的显示结果。
其中,秒脉冲由EDA 实训仪上的20MHz 晶振分频得到。
2. 侧计时器24小时倒计时器的电路框图如图8.2所示。
图8.2 24 小时倒计时器的电路框图24小时倒计时器由2个60进制减计故器和1个24进制减计数器构成,输入CLK 为1Hz(秒)的时钟,经过60进制减计数后产生1分钟的借位时钟信号,再经过60进制减计数后产生1小时的借位时钟信号送给24进制减计数器进行减计数,当减计数到达00: 00: 00后,产生时的借位输出,同时24小时倒计时器停止倒计时,并发出提醒信号。
将两个60进制减计数器和一个24进制减计数器的输出送数码管显示,得到倒计时的显示结果。
其中,秒脉冲由EDA 实训仪上的20MHz 晶振分频得到。
三、实验设备秒脉冲①EDA实训仪1台。
②计算机1台(装有QuartusⅡ软件)。
四、实验内容1. 计时器在QurtusⅡ软件中,按照实验原理中24小时计时器的电路框图,用Verilog HDL编程设计计时器电路,然后进行编辑、编译(综合)、仿真,引脚的锁定,并下载到EDA实训仪中进行验证。
FPGA 数字秒表的设计
学院FPGA设计实践报告题目:数字秒表的设计院系:计算机与信息工程学院专业:电子科学与技术年级姓名:学号:指导老师:一、课程设计目的:本课程的授课对象是电子科学与技术专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相结合的重要环节。
本课程有助于培养学生的数字电路设计方法、掌握模块划分、工程设计思想与电路调试能力,为以后从事各种电路设计、制作与调试工作打下坚实的基础。
二、课程设计要求:l. 设计用于体育比赛用的数字秒表, 要求:⑴计时精度应大于l/100S, 计时器能显示1/100S的时间, 提供给计时器内部定时的时钟脉冲频率应大于l00Hz, 这里选用1kHz 。
⑵计时器的最长计时时间为l小时, 为此需要一个6位的显示器, 显示的最长时间为59分59.99秒。
2. 设置有复位和起/停开关⑴复位开关用来使计时器清零, 并作好计时准备。
⑵起/停开关的使用方法与传统的机械式计时器相同, 即按一下起/停开关, 启动计时器开始计时, 再按一下起/停开关计时终止。
⑶复位开关可以在任何情况下使用,即使在计时过程中, 只要按一下复位开关, 计时进程立刻终止, 并对计时器清零。
3. 复位和起/停开关应有内部消抖处理。
4. 采用VHDL语言用层次化设计方法设计符合上述功能要求的数字秒表。
5. 对电路进行功能仿真, 通过有关波形确认电路设计是否正确。
6. 完成电路全部设计后, 通过系统实验箱下载验证设计课题的正确性。
三、系统组成与工作原理:数字秒表框图:1、电路原理图 :2、工作原理:l.计时控制器作用是控制计时。
计时控制器的输入信号是启动、暂停和清零。
为符合惯例, 将启动和暂停功能设置在同一个按键上, 按一次是启动, 按第二次是暂停, 按第三次是继续。
所以计时控制器共有2个开关输入信号, 即启动/暂停和清除。
计时控制器输出信号为计数允许/保持信号和清零信号。
2. 计时电路的作用是计时, 其输入信号为lkHz 时钟、计数允许/保持和清零信号, 输出为l0ms、l00ms、s 和min 的计时数据。
fpga秒表设计实验报告
fpga秒表设计实验报告本次实验是基于FPGA设计的秒表。
秒表主要是用来计时的一种仪器,具有精准度高、显示清晰等优点。
在实验中,我们使用FPGA来实现秒表的设计。
1. 实验目的通过本次实验,我们的目的是掌握FPGA的使用方法,并设计出一个能够精准计时的秒表。
同时,也能够加深理解数字电路的基本原理和数字信号的处理方式。
2. 实验原理秒表的原理很简单,在起点按下计时键后,秒表开始计时,时间会显示在数码管或LCD屏幕上。
在终点按下停止键后,秒表停止计时。
我们需要用数字电路来实现这个过程,分为三个部分。
2.1. 时钟模块时钟模块是秒表实现的基础。
我们可以使用FPGA内置的时钟控制器IP,也可以自己实现时钟模块。
在这个实验中,我们使用了FPGA内置的时钟控制器IP。
2.2. 计时模块计时模块是实现秒表的关键。
我们可以使用FPGA内置的计数器IP,也可以自己实现计数器模块。
在这个实验中,我们使用了FPGA内置的计数器模块。
2.3. 显示模块显示模块用来显示计时结果。
我们可以使用数码管或LCD屏幕来显示计时结果。
在这个实验中,我们使用了数码管来显示计时结果。
3. 实验步骤3.1. 创建工程首先,我们需要在Vivado IDE中创建一个FPGA工程。
在创建工程时,需要选择适当的设备型号、板卡等参数。
3.2. 添加时钟控制器IP在Vivado IDE中,选择IP Catalog,搜索并添加时钟控制器IP。
3.3. 添加计数器IP在Vivado IDE中,选择IP Catalog,搜索并添加计数器IP。
3.4. 添加数码管IP在Vivado IDE中,选择IP Catalog,搜索并添加数码管IP。
3.5. 连接IP在Vivado IDE中,将时钟控制器IP、计数器IP和数码管IP进行连接。
3.6. 程序设计使用Vivado IDE中的HDL语言对秒表进行程序设计。
3.7. 烧录程序将程序烧录到FPGA中,实现秒表功能。
数电自主设计实验报告——Verilog秒表
姓名班级学号实验日期节次教师签字成绩基于BASYS2开发板的记忆秒表设计一、实验目的1、熟悉基于Verilog HDL语言输入方式的数字电路的设计方法。
2、掌握基于FPGA的设计流程。
3、熟悉BASYS2开发板的使用方法。
4、熟悉Xilinx ISE软件的使用方法。
5、培养自己独立自主设计并完成实验的能力。
二、总体设计方案或技术路线本实验利用BASYS2开发板的已有资源来进行设计实验,并用Xilinx ISE软件来编写和综合Verilog代码。
总体设计方案是设计一个带有记忆功能的秒表。
具体而言,该秒表通过BASYS2开发板的50M的时钟进行分频计时,最大计时时间为99.99s,用4位数码管动态显示计时时间,除了有基本的运行、暂停及复位清空功能,还有存储当前时间和查看存储时间的功能。
三、实验电路图BASYS2开发板原理图--数码管板上数码管为4位共阳极数码管,每段为低电平点亮,位选接了三极管增大驱动电流,同时为非逻辑,所以位选信号为低电平有效。
BASYS2开发板原理图--按键本实验用到了两个按键BTN0和BTN1,BTN0为复位按键,对应程序的clear信号,BTN1为存储按键,对应程序的btn[1]信号,按一次该按键数据存储一次,下一次按下时这一次存的数据将被替换掉。
BASYS2开发板原理图--开关本实验用到了两个开关SW7和SW1,SW7为运行、暂停开关,对应程序的sw[0]信号,开关打到上方为运行,下方为暂停,SW1为显示切换开关,对应程序的sw[1]信号,在计时暂停的前提下,将开关打到上方显示出存储的时间数据。
四、仪器设备名称、型号和技术指标硬件:BASYS2开发板软件:Xilinx ISE(编程)、Digilent Adept(下载)五、程序流程图六、程序源代码/////////////////////////////////////////////////////////程序文件`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// // Company:// Engineer://// Create Date: 15:45:01 11/26/2014// Design Name:// Module Name: miaobiao// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////秒表的顶层模块module miaobiao(input wire clk,///////////////////////////////开发板系统时钟50MHzinput wire[1:0] btn,////////////////////////两个按键:[0]复位和[1]存时间input wire[1:0] sw,/////////////////////////两个开关:[0]运行/暂停和[1]显示存储时间output wire[7:0] smg,/////////////////////数码管的8个段选信号output wire[3:0] smg_an/////////////////数码管的4个位选信号);wire clear;assign clear=btn[0];////////////////////////////////////将复位按键信号传给clear变量wire clk_1k;clkdiv #(50000) m0(clk,clear,clk_1k);//将50MHz进行5万分频输出1kHz时钟信号wire[15:0]number;timer m1(sw[0]&clk_1k,clear,number);///////////计时器模块,输出当前时间数据wire[15:0]num_save;save m2(clk,clear,btn[1],number,num_save);//////按键按下存储当前时间wire[15:0]num_display;/////////////////////////////////////////////////////////////////////////////根据开关状态选择显示内容choose_4num m3(sw,number,num_save,num_display);display m4(clk_1k,clear,num_display,smg,smg_an);///////将数字送给数码管显示endmodule///////////////////////////////////////////////////////////////////////////////4选1数据选择器模块module choose_4num(input wire[1:0]sw,input wire[15:0]number,input wire[15:0]num_save,output reg[15:0]num_display);always@(*)case(sw)0:num_display<=number;/////////////显示内容为当前时间1:num_display<=number;/////////////。
FPGA秒表实验报告
课程设计报告专业班级课程题目秒表的设计学号姓名同组人成绩2013年5月一、设计目的1.进一步熟悉七段码译码器的硬件接口。
2.掌握用扫描方法驱动多个数码管硬件接口。
3.掌握秒表VHDL的编程方法。
二、系统总体设计(1).设计要求:1.秒表共有6个输出显示,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应,6个计数器的输出全都为BCD码输出,这样便于和显示译码器的连接。
当计时达60分钟后,蜂鸣器鸣响10声。
2.整个秒表还需有一个启动信号和一个归零信号,以便秒表能随意停止及启动。
3.秒表的逻辑结构较简单,它主要由显示译码器、分频器、十进制计数器、六进制计数器和报警器组成。
在整个秒表中最关键的是如何获得一个精确的100HZ 计时脉冲。
(2).实验原理:秒表由于其计时精确,分辨率高(0.01秒),在各种竞技场所得到了广泛的应用。
秒表的工作原理与数字时基本相同,唯一不同的是秒表的计时时钟信号,由于其分辨率为0.01秒,所以整个秒表的工作时钟是在100Hz的时钟信号下完成。
当秒表的计时小于1个小时时,显示的格式是mm-ss-xx(mm表示分钟:0~59;ss 表示秒:0~59;xx表示百分之一秒:0~99),当秒表的计时大于或等于一个小时时,显示的和多功能时钟是一样的,就是hh-mm-ss(hh表示小时:0~99),由于秒表的功能和钟表有所不同,所以秒表的hh表示的范围不是0~23,而是0~99,这也是和多功能时钟不一样的地方。
在设计秒表的时候,时钟的选择为100Hz。
变量的选择:因为xx(0.01秒)和hh(小时)表示的范围都是0~99,所以用两个4位二进制码(BCD码)表示;而ss(秒钟)和mm(分钟)表示的范围是0~59,所以用一个3位的二进制码和一个4位的二进制码(BCD)码表示。
显示的时候要注意的问题就是小时的判断,如果小时是00,则显示格式为mm-ss-xx,如果小时不为00,则显示hh-mm-ss。
秒表计时电路设计verilog
电子科技大学通信学院秒表计时电路实验报告班级通信一班学生学号教师秒表计时电路秒表计时电路一、设计思路概述1.设计要求秒表计时功能,显示分、秒、0.01秒具有启动、暂停、停止和清空功能增加有趣的流水灯输入信号:4bit按键,50MHz时钟输出信号:6位数码管2.设计分析本设计要求秒表计时功能,显示分、秒、0.01秒,而这可以由分频电路实现,将电路的输入时钟进行分频,得到1/60Hz,1Hz,和100Hz信号,就可以达到本设计要求的显示要求了。
本设计要求具有启动、暂停、停止和清空功能,而这个可以由状态机实现,通过合理的配置状态转换,就可以达到要求。
流水灯的实现说来简单,其实也可以做的复杂,漂亮的流水灯其观赏性还是很好地,这里我们只讨论简单流水灯的实现,即单个灯从左到右逐步发光。
这实际是一个移位寄存器,我们可以通过不同的时钟来驱动它,实现不同的流水速度。
这里,我们实现了一个1Hz,和一个10Hz的流水灯电路。
二、总体设计框图及详细说明三、各部分代码设计1、500000进制计数器(分频器)设计:always @(negedge clk or negedge rst10ms)beginif (~rst10ms) beginclk10ms<=0;clk10msreg<=0;endelse if (clk10msreg == 249999) beginclk10ms<=~clk10ms ;clk10msreg<=clk10msreg+1;endelse if (clk10msreg==499999) beginclk10ms<=~clk10ms;clk10msreg<=0;endelse begin clk10msreg<=clk10msreg+1;endend2、状态机设计always @(negedge clk or negedge clear) beginif (~clear) beginstate <= idlestate; rst <= 0; rst10ms <= 0;endelse begincase (state)idlestate: beginif(~start)beginstate<= prestate; rst<=0;rst10ms<=0;endelsestate<=idlestate; endprestate: beginstate<=runstate;rst<=1;rst10ms<=1;endholdstate: beginif(~stop)beginstate<=idlestate; rst<=1;rst10ms<=0;endelse if(~start)beginstate<= runstate; rst<=1;rst10ms<=1;endelsestate<=holdstate; endrunstate: beginif(~stop)beginstate<=idlestate; rst<=1;rst10ms<=0;endelse if(~hold)beginstate<= holdstate; rst<=1;rst10ms<=0;endelsestate<=runstate;enddefault: state <= state;endcaseendend3.10进制计数器(分频器)设计module count10(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) begin clkout<=0;counter<=0;endelse if (counter == 4) begin clkout<=~clkout;counter<=counter+1; endelse if (counter == 9) begin clkout<=0;counter<=0; endelse begin counter<=counter+1;endendendmodule4、6进制计数器(分频器)设计module count6(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) beginclkout <= 0;counter <= 0;endelse if (counter == 2) beginclkout <= ~clkout;counter <= counter + 4'b1;endelse if (counter == 5) beginclkout <= ~clkout;counter <= 0;endelse begincounter <= counter + 4'b1;endendendmodule5、流水灯设计always @(negedge clk1s or negedge rst)beginif (~rst)ledg <= 8'b0;else if (ledg == 8'b0)ledg<=8'b10000000;elseledg<=(ledg>>1);endalways @(negedge clk100ms or negedge rst) beginif (~rst)ledr <= 18'b0;else if (ledr == 18'b0)ledr<=18'b100000000000000000;elseledr<=(ledr>>1);end6、显示译码电路设计always @(negedge clk or negedge rst) begin if (~rst) begindisplayreg <= 3'b000;segcode[0] <= 7'b1111111;segcode[1] <= 7'b1111111;segcode[2] <= 7'b1000000;segcode[3] <= 7'b1000000;segcode[4] <= 7'b1000000;segcode[5] <= 7'b1000000;segcode[6] <= 7'b1000000;segcode[7] <= 7'b1000000;endelse begincase (timeout[displayreg])0: segcode[displayreg] <= 7'b1000000;1: segcode[displayreg] <= 7'b1111001;2: segcode[displayreg] <= 7'b0100100;3: segcode[displayreg] <= 7'b0110000;4: segcode[displayreg] <= 7'b0011001;5: segcode[displayreg] <= 7'b0010010;6: segcode[displayreg] <= 7'b0000010;7: segcode[displayreg] <= 7'b1011000;8: segcode[displayreg] <= 7'b0000000;9: segcode[displayreg] <= 7'b0010000;default: segcode[displayreg] <= 7'b1111111;endcasedisplayreg <= displayreg + 3'b1;endend四、总体电路设计module today(key, ledr, ledg, hex, clk);input [3:0] key;input clk;output reg [17:0] ledr;output reg [7:0] ledg;output [55:0] hex;wire clear;wire start;wire stop;wire hold;assign clear = key[0];assign start = key[1];assign stop = key[2];assign hold = key[3];reg [19:0] clk10msreg;reg clk10ms;wire clk100ms;wire clk1s;wire clk10s;wire clk1min;wire clk10min;wire clk1h;reg [1:0] state;parameter idlestate = 2'b00, prestate = 2'b01, holdstate = 2'b10, runstate = 2'b11;reg rst;reg rst10ms;reg [2:0] displayreg;wire [3:0] timeout [7:0];reg [6:0] segcode[7:0];assign hex = {segcode[7], segcode[6], segcode[5], segcode[4], segcode[3], segcode[2], segcode[1], segcode[0]};always @(negedge clk or negedge clear) beginif (~clear) beginstate <= idlestate; rst <= 0; rst10ms <= 0;endelse begincase (state)idlestate: beginif(~start)beginstate<= prestate;rst<=0;rst10ms<=0;endelsestate<=idlestate;endprestate: beginstate<=runstate;rst<=1;rst10ms<=1;endholdstate: beginif(~stop)beginstate<=idlestate;rst<=1;rst10ms<=0;endelse if(~start)beginstate<= runstate;rst<=1;rst10ms<=1;endelsestate<=holdstate;endrunstate: beginif(~stop)beginstate<=idlestate;rst<=1;rst10ms<=0;endelse if(~hold)beginstate<= holdstate;rst<=1;rst10ms<=0;endelsestate<=runstate;enddefault: state <= state;endcaseendendalways @(negedge clk or negedge rst10ms)beginif (~rst10ms) beginclk10ms<=0;clk10msreg<=0;endelse if (clk10msreg == 249999) beginclk10ms<=~clk10ms ;clk10msreg<=clk10msreg+1;endelse if (clk10msreg==499999) beginclk10ms<=~clk10ms; clk10msreg<=0;endelse begin clk10msreg<=clk10msreg+1;endendcount6 min10counter(rst, clk10min, clk1h, timeout[7]); count10 min1counter (rst, clk1min,clk10min, timeout[6]); count6 sec10counter(rst, clk10s,clk1min, timeout[5]); count10 sec1counter (rst, clk1s, clk10s, timeout[4]); count10 ms100counter(rst, clk100ms, clk1s, timeout[3]); count10 ms10counter (rst, clk10ms, clk100ms, timeout[2]); assign timeout[1] = 4'b1111;assign timeout[0] = 4'b1111;always @(negedge clk or negedge rst) beginif (~rst) begindisplayreg <= 3'b000;segcode[0] <= 7'b1111111;segcode[1] <= 7'b1111111;segcode[2] <= 7'b1000000;segcode[3] <= 7'b1000000;segcode[4] <= 7'b1000000;segcode[5] <= 7'b1000000;segcode[6] <= 7'b1000000;segcode[7] <= 7'b1000000;endelse begincase (timeout[displayreg])0: segcode[displayreg] <= 7'b1000000;1: segcode[displayreg] <= 7'b1111001;2: segcode[displayreg] <= 7'b0100100;3: segcode[displayreg] <= 7'b0110000;4: segcode[displayreg] <= 7'b0011001;5: segcode[displayreg] <= 7'b0010010;6: segcode[displayreg] <= 7'b0000010;7: segcode[displayreg] <= 7'b1011000;8: segcode[displayreg] <= 7'b0000000;9: segcode[displayreg] <= 7'b0010000;default: segcode[displayreg] <= 7'b1111111;endcasedisplayreg <= displayreg + 3'b1;endendalways @(negedge clk1s or negedge rst)beginif (~rst)ledg <= 8'b0;else if (ledg == 8'b0)ledg<=8'b10000000;elseledg<=(ledg>>1);endalways @(negedge clk100ms or negedge rst) beginif (~rst)ledr <= 18'b0;else if (ledr == 18'b0)ledr<=18'b100000000000000000;elseledr<=(ledr>>1);endendmodulemodule 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) beginclkout <= 0;counter <= 0;endelse if (counter == 2) beginclkout <= ~clkout;counter <= counter + 4'b1;endelse if (counter == 5) beginclkout <= ~clkout;counter <= 0;endelse begincounter <= counter + 4'b1;endendendmodulemodule count10(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) begin clkout<=0;counter<=0;endelse if (counter == 4) begin clkout<=~clkout;counter<=counter+1; endelse if (counter == 9) begin clkout<=0;counter<=0; endelse begin counter<=counter+1;endendendmodule五、总结及心得体会通过这次试验,我们基本掌握了状态机的实现方法,进一步熟悉和掌握了Verilog HDL的基本使用方法。
基于FPGAVerilog的数字式秒表设计
基于FPGA的数字式秒表一、设计任务及要求秒表由于其计时精确,分辨率高(秒),在各种竞技场所得到了广泛的应用,本次设计的任务就是设计一个基于 FPGA 的数字式秒表。
1、基本要求:(1)性能指标:秒表的分辨率为秒,最长计时时间为秒;(2)设置启/停开关和复位开关(计数控制器):启/停开关 S1 的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。
复位开关 S2 用来使计时器清 0,复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时进程应立即终止,并对计时器清零。
(开关按下为 0,弹起为 1)。
(3)秒表的计时基准信号:以周期为秒(频率 100HZ)的计时脉冲作为一个比较精准的计时基准信号输入到秒位计数器的时钟端;在设计中采用分频器把 1000HZ 的时钟信号转换为 100HZ 的计时基准信号,其分频系数为 10。
(4)数码管动态显示:七段数码管采用动态扫描的方式显示,扫描需要一个比较高频率的信号,本次设计选用 1000HZ 。
为了得到 1000Hz 信号,必须对输入的时钟信号 50MHZ 进行分频。
显示模块共用 11 个管脚,其中 8 个用于连接 8 个数码管的七段 LED,还有 3 个管脚用于选择点亮哪个数码管,每隔很短的一段时间 8 个数码管交替点亮,依次循环,动态显示,由于人眼的视觉残留,可以观察到连续的测量计数器的计数值。
上电后,八个数码管中左边四个显示自己的学号后四位,在运行过程中一直不变;右边四个显示计时时间,范围 0000~9999,利用两个按钮 S1、S2 控制计时。
2、提高要求:加入小数点,计时数码管显示范围 ~。
二、 系统原理框图100Hz50MHz1000Hz 三、 电路实现四、 功能模块1、 分频器(以10分频器为例)(1)Verilog HDL 语言程序module fp10(Clk,Out10分频器);input Clk;output Out;reg Out;reg [3:0] Cout;reg Clk_En;initialOut<=0;always @(posedge Clk )beginCout <= (Cout == 4'd10) 4'd0 : (Cout + 4'd1); Clk_En <= (Cout >= 4'd5) 1'd1 : 1'd0;Out<=Clk_En;endEndmodule(2)模块化电路(3)波形仿真由波形仿真图可以看出,10分频器将1000Hz的脉冲分频成100Hz的脉冲。
FPGA-verilog秒表设计
大规模集成电路秒表设计专题实习报告一、实习题目:大规模集成电路秒表设计二、模块名称:计数器,控制逻辑,译码器,数据选择器三、实习目的:对quartusII软件的使用,同时增强对Verilog HDL语言的编程与运用;将软件与硬件的使用结合起来。
掌握秒表设计的思路,各模块的设计方法,培养缜密的设计思想。
四、模块源程序:1、控制逻辑:module miaoobiao(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML);input CLK,CLR,PAUSE; output[3:0] MSH,MSL,SH,SL,MH,ML;reg[3:0] MSH,MSL,SH,SL,MH,ML;reg cn1,cn2;always @(posedge CLK or posedge CLR)begin if(CLR) begin{MSH,MSL}<=8'h00; cn1<=0; endelse if(!PAUSE)beginif(MSL==9) begin MSL<=0;if(MSH==9) begin MSH<=0; cn1<=1; endelse MSH<=MSH+1;endelse begin MSL<=MSL+1; cn1<=0; endendendalways @(posedge cn1 or posedge CLR)begin if(CLR) begin {SH,SL}<=8'h00; cn2<=0; endelse if(SL==9)begin SL<=0;if(SH==5) begin SH<=0; cn2<=1; endelse SH<=SH+1;endelse begin SL<=SL+1;cn2<=0; endendalways @(posedge cn2 or posedge CLR)begin if(CLR) begin {MH,ML}<=8'h00;endelse if(ML==9)begin ML<=0;if(MH==5) MH<=0;else MH<=MH+1;endelse ML<=ML+1;endEndmodule2、计数器程序:module jishuqi(clk,state);input clk;output[2:0]state;reg [2:0]state;always @(posedge clk)if (state==5)state=0;elsestate=state+1;Endmodule3、数据选择器源程序:module mux6_1(out,in0,in1,in2,in3,in4,in5,sel); input[3:0] in0,in1,in2,in3,in4,in5;input[2:0] sel;output[3:0] out; reg[3:0] out;always @(in0 or in1 or in2 or sel)begin case (sel)3'b000:out=in1;3'b001:out=in0;3'b010:out=in3;3'b011:out=in2;3'b100:out=in5;default:out=in4;endcaseendEndmodule4.译码器module decode47(decodeout,dec_in);input[3:0] dec_in;output[6:0] decodeout; reg[6:0] decodeout; always @(dec_in)begin case(dec_in)4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;default:decodeout=7'bx;endcaseendendmodule模块图:1、控制器:2、计数器:3、6选用1选择器:4、译码器:cin cin1 clk rst out[7..0]coutjishu100inst9五、仿真图:六、原理图:七、心得体会:通过“秒表的设计”,书本知识与实际的融会贯通,我学到了很多:i.刚开始我什么都不懂,就抱为考试复习做准备的心态,熟悉书本知识;ii.熟悉了加法器的设计,乘法器的设计,计数器的设计,选择器的设计;iii.专周从刚开始没头绪,到从模块设计,到程序的书写,到波形的仿真,到网表生成,到引脚的定义,基本熟悉了秒表的设计过程;iv.从最基本的verilog HDL语言的基本要数,到行为语句的熟悉,一步一步的将书本的知识应用到专周的设计中;v.熟悉了Quartus7.2软件的应用;vi.Verilog HDL 过程赋值语句,“always”过程语句通常带触发条件,assign为持续赋值语句;vii.条件语句case多用于译码器,数据选择器中,一般case(敏感表达式);viii.复习了同步清零和异步清零的区别;ix.中间我们遇到的问题是怎么选位和怎么选段;x.以及怎么将编辑的模块联系起来;。
Verilog 实验报告 秒表
Verilog HDL实验报告基于Verilog HDL的数字秒表班级:信科14-04班姓名:温华强学号:08143080教师:王冠军基于Verilog HDL的数字秒表一、秒表功能1. 计时范围:00:00:00—59:59:992. 显示工作方式:八位数码管显示3.具有暂停和清零的功能二、实验设计原理1、秒表的逻辑结构较简单,它主要由十进制计数器、六进制计计数器、分频器、数据选择器和显示译码器组成,在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。
2、秒表有共有8个输出显示,其中6个显示输出数据,分别为百分之一秒,十分之一秒,秒,十秒,分,十分,所以共有6个计数器与之相对应,另外两个为间隔符,显示‘-’。
8个计数器的输出全都为BCD码输出,这样便与同显示译码器连接。
3、可定义一个24位二进制的寄存器hour用于存放8个计数器的输出,寄存器从高位到低位每连续4位为一组,分别存放百分之一秒,十分之一秒,间隔符,秒,十秒,间隔符,分,十分,由频率信号输出端输出频率为100HZ的时钟信号输入到百分之一秒模块的时钟端ckl,百分之一秒模块为100进制的计数器,当计数器到“1001”时,百分之一秒模块清零,同时十分之一秒模块加1,十分之一秒模块也为100进制的计数器,当计数到“1001”时,十分之一模块清零,同时秒模块加1;以此类推,一直到分模块计数器到59进59。
秒表计数单位与对应的输出信号4、为了消除按键消抖问题,定义寄存器key-inner来存储按键key的输入信号,key-flag作为启动/暂停的转换标志,key-inner[0]出现一个下降沿时,key-flag取反一次,当key-flag为0时计数器启动,1时计数器暂停,当key-flag 为1同时key-inner[1]为9时,计数器清零。
5、定义18位寄存器count用于存放分频和扫描用的计数值。
FPGA——Verilog时序电路实验报告
Verilog设计实验报告唐睿电子工程2011301200062武汉大学电工电子实验教学示范中心集成电路设计实验实验报告:学院:电子信息学院专业:电子信息工程2014 年 5 月7 日实验名称时序逻辑电路基础指导教师曹华伟姓名唐睿年级2011级学号2011301200062 成绩一、预习部分1.实验目的(预期成果)2.实验基本原理(概要)3.主要仪器设备(实验条件,含必要的元器件、工具)1).实验目的1.掌握时序逻辑电路的实现方法;2.了解时序电路的仿真与测试;3.熟悉并理解硬件描述语言;4.用硬件描述语言实现基本时序电路基础的电路;5.在DE2-115开发板中验证并测试其时序逻辑电路功能是否实现。
2).实验基本原理1. D触发器工作原理:SD 和RD 接至基本RS 触发器的输入端,它们分别是预置和清零端,低电平有效。
当SD=1且RD=0时(SD的非为0,RD的非为1,即在两个控制端口分别从外部输入的电平值,原因是低电平有效),不论输入端D为何种状态,都会使Q=1,Q非=0,即触发器置1;当SD=0且RD=1(SD的非为1,RD的非为0)时,Q=0,Q非=1,触发器置0,SD和RD通常又称为直接置1和置0端。
我们设它们均已加入了高电平,不影响电路的工作。
2. 时序逻辑电路(Sequential Logic Circuit)输出不仅取决于当前输入信号,而且取决于电路之前所处的状态。
基本的时序电路单元有触发器(D、JK、T 等触发器)、锁存器、计数器等。
3. VHDL 中,主要程序分析,时序电路通过process(clk)和if clk’event and clk = ‘1’then 边沿检测语句实现触发器风格的电路;具有非完分支的if、case 语句形成锁存器电路。
例如:process(clk)begin ――D 触发器if (clk’event and clk = ‘1’) thenq <= d; end if;end process;process(g,d) begin ――锁存器if g=1 then q <= d; end if;end process;Verilog HDL 中,时序电路通过always 块语句和@(posedge clk)或@(negedge clk)边沿条件方式实现,例如:always @(posedge clk) //二分频器begin if (! Rst) clk_out = 0;else clk_out =~clk_out; end3. 实验设备与软件平台D E2-115实验板,Q u a r tu s I I v5.0,微型计算机,。
FPGA秒表实验报告
现代电子技术综合实验秒表实验报告时间:2013年6月6日1摘要随着电子信息产业的不断发展,基于FPGA的应用技术发展迅速,在某些领域FPGA正逐步代替dsp、arm、单片机等微处理器。
本文设计一个基于FPGA技术的数字秒表。
首先,我们把晶振产生的50MHZ时钟信号送入FPGA芯片内,经FPGA内分频模块处理产生1KHZ时钟信号。
秒表的功能模块由VHDL语言编写,在Xilinx的ISE环境下调试,并在Modelsim上完成仿真,在最后把产生的信号送入LED显示电路里进行显示。
本文从电子秒表的具体设计触发,详细阐述了基于FPGA的数字秒表的设计方案,设计了各模块的代码,并对硬件电路进行了仿真。
关键词:FPGA,VHDL,电子秒表2第一章引言随着电子信息产业的发展,数字系统的规模越来越大,更多采用自顶而下的模块化设计方法,这就要求技术人员对于基本的模块有着深入的理解。
随着FPGA技术的发展和成熟,用FPGA来做为一个电路系统的控制电路逐渐显示出其无与伦比的优越性。
因此本文采用FPGA来做为电路的控制系统,采用模块化的设计方法设计一个能显示从00-00-00到59-59-99,并且具备秒表所有功能的小型数字系统。
第二章基于FPGA的VHDL设计流程2.1 概述数字秒表是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。
秒表的设计有传统方法和现代方法,传统的设计方法耗时耗功,设计强度大,且容易出错,设计的质量不一定是最好的。
自然我们考虑到现代方法,即二十世纪八十年代兴起的电子设计自动化技术,英文为Electronic Design Auto,缩写为EDA。
在EDA设计工具中,用的最广泛的是VHDL和VERILOG,当然还有其它的。
比较VHDL和VERILOG,在顶层设计方面VHDL优于VERILOG,在门级电路设计方面VERILOG优于VHDL。
FPGA电子秒表计时器verilog实验报告
华中科技大学《电子线路设计、测试与实验》实验报告实验名称:用EDA技术设计多功能数字钟院(系):电子信息与通信学院专业班级:姓名:学号:时间:地点:实验成绩:指导教师:2018 年 3 月 27 日一. 实验任务及要求基本要求:电子秒表1)可计时的范围0.00s~99.99s(显示用七段数码管,显示小数点)。
2)能够暂停,能够在计时结束使用灯光或者声音报警提示。
提高要求: PWM波产生器1)可输出占空比按10%递进的PWM波(示波器测量查看)。
二.实验条件实验板:Nexys4 DDR实验软件:ISE14.7,ModelSim三.预习要求1.NEXYS 4 DDR开发板说明。
2.有限状态机。
3.数码管扫描显示。
四.实验原理1.电子秒表设计框图模块分析1)分频模块(Divider.v)将系统给定的100MHZ 的频率通过分频模块变成100Hz 的clk(用来计时)和4000Hz的clk_seg(用来扫描数码管)。
代码如下:原理:输入的100MHz 的信号为CLK_100MHz,每当CLK_100MHz 上升沿来时,Count_DIV 计数加1,且每当Count_DIV =100M/(2*100)=0.5M 时,CLK_Out取反一次并且Count_DIV <=0,这样会得到一个100Hz 的信号。
当需要得到4000Hz的clk_seg时,在顶层模块中修改parameter OUT_Freq=4000;这样,每当Count_DIV=100M/(2*4000)=12500时,CLK_Out取反一次并且Count_DIV <=0,这样会得到一个4000Hz 的信号。
在主程序中修改参数如下:仿真时,为便于观察,在testbench中,将CLK_100MHz的周期设为2ns:always #1 CLK_100MHz <= ~CLK_100MHz;并修改参数如下,验证分频模块的正确性(图中数字16,8,1只表示频率的倍数关系,并非真正的频率)其仿真图如下图:从图中可以看出,CLK_100MHz的周期为2ns,clk_seg的周期为4ns,clk的周期为32ns,符合倍数关系,故分频模块的正确性得到验证。
verilog秒表实验报告
一,实验原理二,各模块程序与仿真结果图。
1,分频器,将晶振的48MHz频率分频为电子秒表的最小分辨频率,周期0.01S。
同时在译码部分需要一个1KHz的扫描信号,所以分频器的功能就是产生一个100Hz信号和1kHz信号。
源代码如下:module divclk(clk,clk_100,clk_1k);input clk;output reg clk_100,clk_1k;reg[29:0]counter1,counter2;initial begin counter1<=0;counter2<=0;clk_100<=0;clk_1k<=0;endalways@(posedge clk)beginif(counter1==240000)begin counter1<=0;clk_100<=~clk_100;endelse begin counter1<=counter1+1;endif(counter2==24000)begin counter2<=0;clk_1k<=~clk_1k;endelse begin counter2<=counter2+1;endendendmodule仿真结果2,计数器秒表计数器和一般计数器不同的是进制,在0.01s__0.99s时,都是十进制的,而到了秒和分的时候,十位秒和个位秒是十进制,秒和分之间则为六十进制所以在进位时注意区分。
秒表有两个按键,一个复位按键reset,一个run/stop按键,reset按键比较好处理,因为是点触式,可以检测其下降沿部位(低电平有效),当硬件检测到,说明是有按键按下。
而run/stop按键则为,按下一次这个键,秒表run和stop切换一次可定义一个信号寄存器,在检测到这个按键按下时,自身在0和1之间翻转一次,1表示run,0表示stop。
我们知道,在按键按下一次时会有如下的毛刺信号,这个毛刺信号持续时间虽然只有1-3ms,但是这对于硬件来说,还是很长的,最关键的是,会产生很多个下降沿和电平触发。
基于FPGA数字秒表设计实验报告
电子科技大学标准实验报告实验项目:基于FPGA数字秒表设计目录1.秒表设计要求 (1)2.设计思路 (1)2.1功能模块 (1)2.1.1分频器 (1)2.1.2计数器 (1)2.1.3数据锁存器 (1)2.1.4控制器 (1)2.1.5扫描显示的控制电路 (2)2.1.6显示电路 (3)2.1.7按键消抖电路 (3)3.电路实现 (4)4.程序仿真 (10)4.1分频器 (10)4.1.1计数器电路综合 (11)4.1.2计数器电路仿真 (11)4.2同步计数器 (13)4.2.1计数器实现 (13)4.2.2计数器仿真 (15)4.2.3同步计数器电路综合 (17)4.3按键消抖电路 (18)4.3.1按键消抖电路实现 (18)4.3.2按键消抖电路仿真 (18)4.3.3按键消抖电路综合 (20)4.4八段译码器 (20)4.4.1八段译码器实现 (20)4.4.2八段译码器仿真 (21)4.4.3八段译码器电路综合 (22)4.5控制器 (23)4.5.1控制器 (23)4.5.1控制器仿真 (24)4.5.3控制器电路综合 (25)5.2View Technology Schematic : (26)5.3管脚锁定: (27)6.实验结论 (27)1.秒表设计要求(1)秒表的计时范围为00:00:00 ~ 59:59:99。
(2)两个按钮开关Start/Stop和Split/Reset,控制秒表的启动、停止、分段和复位:在秒表已经被复位的情况下,按下“Start/Stop”键,秒表开始计时。
在秒表正常运行的情况下,如果按下“Start/Stop”键,则秒表暂停计时;再次按下该键,秒表继续计时。
在秒表正常运行的情况下,如果按下“Split/Reset”键,显示停止在按键时的时间,但秒表仍然在计时;再次按下该键,秒表恢复正常显示。
在秒表暂停计时的情况下,按下“Split/Reset”键,秒表复位归零。
FPGA设计的秒表设计实验报告
《FPGA原理及应用》实验报告书(7)题目秒表设计学院专业姓名学号指导教师2015年10—12月一、实验目的掌握小型电路系统的 FPGA 设计法。
二、实验内容用文本法结合原理图的方法设计一个秒表,并在实验箱上进行验证。
秒表基本功能要求如下:(1)要求设置复位开关。
当按下复位开关时,秒表清零并做好计时准备。
在任何情况下只要按下复位开关,秒表都要无条件地进行复位操作,即使是在计时过程中也要无条件地进行清零操作。
(2)要求设置启/停开关。
当按下启/停开关后,将启动秒表并开始计时,当再按一下启/停开关时,将终止秒表的计时操作。
(3)要求计时精确度大于 0。
01 秒.要求设计的计时器能够显示分(2 位)、秒(2 位)、0.1 秒(1 位)的时间。
(4)要求秒表的最长计时时间为 1 小时。
要求外部时钟频率尽量高,分频后再给秒表电路使用.三、实验条件1、开发软件:QuartusⅡ2、实验设备:KX_DN8EDS实验开发系统3、拟用芯片:EP3C55F484C8四、实验设计1、六进制计数器仿真波形2、十进制计数器3、分频计4、七段数码管译码器5、100进制原理图6、60进制原理图7、秒表原理图8、管脚锁定新建好工程文件,芯片选择Cyclone Ⅲ下面的EP3C55F484C8系列。
然后锁定引脚:选择Assignments → Assignments Editor命令.9、编译文件下载将编译产生的SOF格式配置文件下载进FPGA中。
10、FPGA实验箱接线在KX-EDA40A++实验箱上进行连线,分配J4,J5的引脚,输入CLK(PIN_接到时钟信号,输入的EN,RST 接到电平开关L1,L2。
五、实验总结经过本次实验,我对QuartusⅡ的使用认识更加深刻,对FPGA技术有了更深层次的认识,有助于我对以后的电子电路设计有极大帮助。
电子技术综合实验报告-秒表
流 交 习 学 供 仅
程序 1)分频程序
module fenpin100Hz(clk,hz,hz_1k); input clk; output reg [3:0]hz;
output reg [15:0]hz_1k;
if(hz_1k==47999) hz_1k<=0; else hz_1k<=hz_1k+1;
always @(negedge hz_1k[16]) if(hz==9)
hz<=0; else
结果用 8 只数码管显示;有两个按钮开关,一个按钮使秒表复位,
另一个按钮控制秒表的启动/暂停。
下图显示了该跑表前面板的基本排布构想。
Stopwatch
POWER
RESET
RUN/STOP
(五)实验内容:Verilog 的语法,建模,设计时间测量的方法:
使用 现在时间测量一般采用数字计器来进行
(六) 实验原理
module jishu_jinwei(hz,rst,stop,n_1,n_2,n_3,n_4,n_5,n_6); input hz; input stop; input rst; output reg [3:0]n_1,n_2,n_3,n_4,n_5,n_6;
wire [3:0]cnt_1,cnt_2,cnt_3,cnt_4,cnt_5,cnt_6; *//Jinwei U2、U3、U5、U9 是十进制位,jinwei_6 U4、U6 是六进制位//*
input [3:0]num; output reg [6:0]led; 译码仿真图
用
使
பைடு நூலகம்
verilog电子秒表设计
华中科技大学《电子线路设计、测试与实验》实验报告实验名称:电子秒表院(系):光学与电子信息学院专业班级:光材1102姓名:***学号:U*********时间:2013.12.5地点:南一楼实验成绩:指导教师:**2013 年12 月3 日实验目的:利用层次化方法在实验板设计实现一个能显示00.00 秒(百分之一秒)到59.99 秒,当计时达到并超过1 分钟时,给出LED 常亮信号告警,计数结果停留在计数最大值(即99.99 秒)上的电子秒表。
功能要求:基本功能:6) 设计一个能显示00.00 秒到59.99 秒的电子秒表。
7) 利用实验板所提供的50MHz 信号做为时钟信号。
8) 计数结果在AN3~AN0 中提供的数码管中显示。
9) 具有继续/暂停按键和复位清零开关。
拨码开关SW0 为复位开关,当SW0 为HIGH 时,系统复位,电子秒表显示时间为0 秒;当SW0 为LOW 时,系统开始按继续/暂停按键BTN0 控制进行工作;BTN0 为继续/暂停按键,当继续/暂停按键BTN0 按下时,系统暂停计数,AN1~AN0 显示停留在所暂停时刻;当继续/暂停按键BTN0 松开时,系统正常计数,显示精度为0.01 秒。
10) 当计时达到并超过1 分钟时,LD0 闪烁告警,计数结果停留在计数最大值上。
设计步骤与要求:1) 计算并说明采用Basys2 实验板时钟50MHz 实现系统功能的基本原理。
2) 在Xilinx ISE13.1 软件中,利用层次化方法,设计实现模一百计数及显示的电路系统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。
3) 对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快得出仿真结果)。
4) 输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit类型文件。
# PlanAhead Generated physical constraintsNET "CLK" LOC = B8;NET "CLR" LOC = P11;NET "PAUSE" LOC = G12;NET "WARN" LOC = M5;NET "display[0]" LOC = F12;NET "display[1]" LOC = J12;NET "display[2]" LOC = M13;NET "display[3]" LOC = K14;NET "out_display[0]" LOC = L14;NET "out_display[1]" LOC = H12;NET "out_display[2]" LOC = N14;NET "out_display[3]" LOC = N11;NET "out_display[4]" LOC = P12;NET "out_display[5]" LOC = L13;NET "out_display[6]" LOC = M12;NET "out_display[7]" LOC = N13;NET "CLR" CLOCK_DEDICA TED_ROUTE = FALSE;# PlanAhead Generated IO constraintsNET "CLK" IOSTANDARD = LVCMOS33;NET "CLR" IOSTANDARD = LVCMOS33;NET "PAUSE" IOSTANDARD = LVCMOS33;NET "WARN" IOSTANDARD = LVCMOS33;NET "display[0]" IOSTANDARD = LVCMOS33;NET "display[1]" IOSTANDARD = LVCMOS33;NET "display[2]" IOSTANDARD = LVCMOS33;NET "display[3]" IOSTANDARD = LVCMOS33;NET "out_display[0]" IOSTANDARD = LVCMOS33;NET "out_display[1]" IOSTANDARD = LVCMOS33;NET "out_display[2]" IOSTANDARD = LVCMOS33;NET "out_display[3]" IOSTANDARD = LVCMOS33;NET "out_display[4]" IOSTANDARD = LVCMOS33;NET "out_display[5]" IOSTANDARD = LVCMOS33;NET "out_display[6]" IOSTANDARD = LVCMOS33;NET "out_display[7]" IOSTANDARD = LVCMOS33;NET "CLK" DRIVE = 12;5) 在Basys2 实验板上下载所生成的.bit 文件,观察验证所设计的电路功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华中科技大学
《电子线路设计、测试与实验》实验报告
实验名称:用EDA技术设计多功能数字钟
院(系):电子信息与通信学院
专业班级:
姓名:
学号:
时间:
地点:
实验成绩:
指导教师:
2018 年 3 月 27 日
一. 实验任务及要求
基本要求:电子秒表
1)可计时的范围0.00s~99.99s(显示用七段数码管,显示小数点)。
2)能够暂停,能够在计时结束使用灯光或者声音报警提示。
提高要求: PWM波产生器
1)可输出占空比按10%递进的PWM波(示波器测量查看)。
二.实验条件
实验板:Nexys4 DDR
实验软件:ISE14.7,ModelSim
三.预习要求
1.NEXYS 4 DDR开发板说明。
2.有限状态机。
3.数码管扫描显示。
四.实验原理
1.电子秒表
设计框图
模块分析
1)分频模块(Divider.v)
将系统给定的100MHZ 的频率通过分频模块变成100Hz 的clk(用来计时)和4000Hz的
clk_seg(用来扫描数码管)。
代码如下:
原理:输入的100MHz 的信号为CLK_100MHz,每当CLK_100MHz 上升沿来时,Count_DIV 计数加1,且每当Count_DIV =100M/(2*100)=0.5M 时,CLK_Out取反一次并且Count_DIV <=0,这样会得到一个100Hz 的信号。
当需要得到4000Hz的clk_seg时,在顶层模块中修改parameter OUT_Freq=4000;这样,每当Count_DIV=100M/(2*4000)=12500时,CLK_Out取反一次并且Count_DIV <=0,这样会得到一个4000Hz 的信号。
在主程序中修改参数如下:
仿真时,为便于观察,在testbench中,将CLK_100MHz的周期设为2ns:
always #1 CLK_100MHz <= ~CLK_100MHz;
并修改参数如下,验证分频模块的正确性(图中数字16,8,1只表示频率的倍数关系,并非真正的频率)
其仿真图如下图:
从图中可以看出,CLK_100MHz的周期为2ns,clk_seg的周期为4ns,clk的周期为32ns,符合倍数关系,故分频模块的正确性得到验证。
2)七段数码管显示模块
运用4个七段数码管,前两个显示秒的十位和个位,后两个显示小数点后两位,因为要显示4个数码管,因此用4000Hz的频率扫描4个数码管,使每个数码管每隔1ms亮一次。
代码如下:
3)十进制计数器模块
因为每个数码管的计数规律都为:0-1-2-3-4-5-6-7-8-9-0-1……,所以采用十进制计数器。
传入的参数stop表示暂停信号,若有暂停信号或没有使能,则保持计数不变。
代码如下:
4)主程序模块
代码如下:
代码分析:
Second0[3:0]表示百分位的数字,Second0[7:4]表示十分位的数字,Second1[3:0]表示个位的数字,Second1[7:4]表示十位的数字。
如果start为1,即计时开始,则开启数码管使能,数码管开始显示计数值,如果finish 等于1,表示计时完成,则alarm=1;点亮报警灯。
接下来调用四个counter10模块,通过控制其使能信号实现正确计时,第一个(C1)的使能信号为start,也就是按下开启键便开始计时,第二个(C2)的使能信号为Second0[3:0]==4’d9,也就是当百分位计时到了9,且下一个时钟的上升沿到来时,则十分位加1;第三个(C3)的使能信号为Second0==8’h99,也就是当小数点后计时到了99,且下一个时钟的上升沿到来时,则个位加1;第四个(C4)的使能信号为Second1[3:0]==4’h9 && Second0==8’h99,也就是当小数点后计时到了99而且个位计数到了9,且下一个时钟的上升沿到来时,则十位加1;这样,就能确保计时的准确性。
TestBench
`timescale 1ns / 1ns
module stopwatch_test;
reg CLK_100MHz;
reg rst;
reg start;
reg stop;
reg finish;
wire [6:0] HEX0;
wire [7:0] scan;
wire alarm;
wire dot;
stopwatch uut (
.CLK_100MHz(CLK_100MHz),
.rst(rst),
.start(start),
.stop(stop),
.finish(finish),
.HEX0(HEX0),
.scan(scan),
.alarm(alarm),
.dot(dot)
);
initial begin
CLK_100MHz = 0;
rst = 0;
start = 0;
stop = 0;
finish = 0;
#5;rst=1;#5;rst=0;
start=1'b1;
#64;stop=1'b1;#64;stop=0;
#6400;finish=1'b1;
#700;
end
always #1 CLK_100MHz<=~CLK_100MHz; endmodule
仿真波形
1.暂停键
从图中可以看出,当stop=0即暂停键没有按下的时候,只要clk上升沿一到,Second0的数值就加一;当stop=1即暂停键按下的时候,即使clk上升沿到了,Second0也不变,也就是暂停计时了。
2.结束键
从图中可以看出,当finish=1也就是结束键按下的时候,警报灯亮起(alarm=1),同时计时停止。
3.进位
1)
这是从Second0[3:0]向Second0[7:4]进位,从图中可以看出,Second0=8`b0000_1001时,当下一个clk上升沿到来的时候,Second0变为8`b0001_0000,即实现了从0.09到0.10的进位。
2)
这是从Second0向Second1[3:0]进位,从图中可以看出,Second0=8`b1001_1001时(也就是计时到了99),当下一个clk上升沿到来的时候,Second0变为8`b0000_0000, Second1[3:0]由0变成了1,即实现了从0.99到1.00进位。
2. PWM波产生器
本实验的思路较简单,在一个固定的时间间距内,当Count_DIV的值从0计数到duty时,输出电平反转;计数到这个时间间距后,电平再反转,将Count_DIV置零,并将duty的值增加10%。
然后下一个循环开始,以此达到输出占空比按10%递进的PWM波的目的。
实验代码:
Testbench:
仿真波形:
从图中可以看出,输出波形的占空比以10%逐渐增加,可知代码正确。
五.调试过程及实验结果
1. 电子秒表
引脚分配如下:
调试过程及结果
在调试过程中,我碰到了如下问题,并找到了相应的解决方案:
1.问题:按下start按钮后,数码管没有显示。
解决方案:检查代码后发现,原来是忘记开启数码管使能(EN_SEG=1),于是在原代码中加上后解决了这个问题。
2.问题:实验中发现,本来只要一个小数点亮,但四个数码管的小数点都亮了起来。
解决方案:在SEG7_LUT.v(数码管模块)中,扫描数码管时,将其他三个数码管的小数点的电平设为无效电平(dot=1),而需要显示小数点的那个数码管的dot= ~EN_SEG_in,也就是当数码管使能(EN_SEG_in=1)时,小数点亮;不使能则不亮。
修改后的代码如下:
2.PWM波产生器
引脚分配如下:
调试过程及结果
调试步骤:
1.将开发板与示波器共地,并将开发板的G6引出与示波器的CH1相连,在示波器上观察波形,实现了预期结果。
六.实验的收获、体会与改进建议
在这次实验过程中,我掌握了verilog程序的模块化设计方法和数码管的扫描。
以下是我的一些感悟:
1.电子秒表实验中,通过使能信号的灵活运用从而达到控制计数的目的,可谓巧妙。
不仅
代码简洁,由此设计出的电路也更简单和易于调试。
2.模块化设计能减轻开发人员的难度,逻辑更清晰。