verilog计数器实验报告

合集下载

计数器实验报告结论

计数器实验报告结论

计数器实验报告结论计数器实验报告引言:计数器是数字电路中常见的模块之一,它可以实现对特定信号的计数功能。

在本次实验中,我们将学习如何设计和实现一个简单的二进制计数器,并通过仿真和实际电路测试来验证其正确性。

一、实验目的:1.了解数字电路中计数器的基本原理;2.学习使用Verilog HDL设计二进制计数器;3.掌握仿真工具ModelSim的使用方法;4.通过实际电路测试验证设计的二进制计数器正确性。

二、实验原理:1.二进制计数器:二进制计数器是指一种能够按照二进制码进行递增或递减的数字电路。

2.Verilog HDL:Verilog HDL是一种硬件描述语言,用于描述数字电路的结构和行为。

3.ModelSim:ModelSim是一种常用的数字电路仿真工具,可以用于验证设计是否正确。

三、实验过程:1.根据设计要求,使用Verilog HDL编写代码,包括模块声明、端口定义和具体功能实现。

2.使用ModelSim进行仿真,检查代码是否有误,并观察输出结果是否符合预期。

3.将代码下载到FPGA开发板上进行测试,检查输出结果是否符合预期。

四、实验结果:1.仿真结果:通过ModelSim进行仿真,输出结果符合预期,计数器能够递增或递减。

2.实际测试结果:将代码下载到FPGA开发板上进行测试,输出结果符合预期,计数器能够递增或递减。

五、实验结论:本次实验中,我们成功设计并实现了一个简单的二进制计数器,并通过仿真和实际电路测试验证了其正确性。

该计数器具有较高的可靠性和稳定性,可以应用于数字电路中的各种场合。

同时,我们还学习了Verilog HDL的基本语法和ModelSim的使用方法,为今后的数字电路设计工作打下了坚实的基础。

计数器实验报告

计数器实验报告

计数器实验报告实验报告:计数器的设计与实现一、实验目的本实验旨在通过设计一个基本的计数器电路,理解和掌握数字逻辑电路的基本原理和设计方法,锻炼学生的逻辑思维能力和实际动手能力。

二、实验原理计数器是数字逻辑电路中常见的一个基本组件。

在本次实验中,我们设计了一个4位二进制计数器,它由四个D触发器和一些逻辑门组成。

D触发器是一种最常用的锁存器,具有一位输入端D和一位输出端Q,输入端的数值在时钟脉冲到达时被锁存到输出端。

三、实验器材与仪器1. 基于FPGA的实验平台2. Xilinx ISE设计软件四、实验步骤1. 打开Xilinx ISE设计软件,并创建一个新项目。

2. 在工程目录下新建一个源文件,并输入计数器的Verilog代码。

3. 设计一个时钟脉冲模块,控制时钟信号的频率。

4. 在源文件中实例化四个D触发器,将输入端和时钟信号连接。

5. 修改约束文件,将FPGA芯片的引脚与D触发器的输出端连接。

6. 点击“综合”按钮生成综合后的电路网表。

7. 点击“实现”按钮生成位文件。

8. 点击“下载”按钮将位文件下载到FPGA开发板上。

五、实验结果与分析经过以上实验步骤,我们成功地设计并实现了一个4位二进制计数器。

通过按下开发板上的复位按钮,可以将计数器的数值清零。

然后,每次按下计数按钮,计数器的数值就会加一,直到达到最大值时(1111),会自动循环回零。

在实际操作中,我们发现计数器的数值变化非常迅速,并且在达到最大值后会很快重新开始计数。

这是因为计数器的时钟频率相当高,每个时钟周期只需要几十纳秒的时间,所以人眼很难看到数值的变化。

此外,计数器的计数范围是0到15,即使用4位二进制表示,所以数值只会在0和15之间循环。

六、实验总结通过本次实验,我对数字逻辑电路的设计和实现有了更深入的理解。

计数器作为一个基本组件,它在各个数字系统中都有着广泛的应用。

通过学习和实践,我进一步掌握了Verilog语言的使用方法,提高了自己的电路设计能力。

Verilog HDL 实验报告

Verilog HDL 实验报告

Verilog实验报告班级:学号:姓名:实验1 :用 Verilog HDL 程序实现直通线1 实验要求:(1) 编写一位直通线的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 建议用模式 52 试验程序:module wl(in,out);input in;output out;wire out;assign out=in;endmodule3 测试基准:`include “wl.v”module wl_tb;reg in_tb;wire out_tb;initialbeginin_tb =0;#100 in_tb =1;#130 in_tb =0;endendmodule4 仿真图形:实验2 :用 Verilog HDL 程序实现一位四选一多路选择器1实验要求:(1) 编写一位四选一多路选择器的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4)建议用模式 52 试验程序:module mux4_to_1 (out,i0,i1,i2,i3,s1,s0);output out;input i0,i1,i2,i3;input s1, s0;reg out;always @ (s1 or s0 or i0 or i1 or i2 or i3)begincase ({s1, s0})2'b00: out=i0;2'b01: out=i1;2'b10: out=i2;2'b11: out=i3;default: out=1'bx;endcaseendendmodule3 测试基准:`include "mux4_to_1.v"module mux4_to_1_tb1;reg ain,bin,cin,din;reg[1:0] select;reg clock;wire outw;initialbeginain=0;bin=0;cin=0;din=0;select=2'b00;clock=0;endalways #50 clock=~clock;always @(posedge clock)begin#1 ain={$random} %2;#3 bin={$random} %2;#5 cin={$random} %2;#7 din={$random} %2;endalways #1000 select[0]=!select[0];always #2000 select[1]=!select[1];mux4_to_1 m(.out(outw),.i0(ain),.i1(bin),.i2(cin),.i3(din),.s1(select[1]),.s0(select[0])); endmodule4 仿真图形:实验3:用 Verilog HDL 程序实现十进制计数器1实验要求:(1) 编写十进制计数器的 Veirlog HDL 程序. 有清零端与进位端, 进位端出在输出为 9 时为高电平.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2 实验程序:module counter_10c (Q, clock, clear, ov);output [3:0] Q;output ov;input clock, clear;reg [3:0] Q;reg ov;initial Q=4'b0000;always @ (posedge clear or negedge clock)beginif (clear)Q<=4'b0;else if (Q==8)beginQ<=Q+1;ov<=1'b1;endelse if (Q==9)beginQ<=4'b0000;ov<=1'b0;endelsebeginQ<=Q+1;ov<=1'b0;endendendmodule3 测试基准:`include"./counter_10c.v"module counter_10c_tb;wire[3:0] D_out;reg clk,clr;wire c_out;reg[3:0] temp;initialbeginclk=0;clr=0;#100 clr=1;#20 clr=0;endalways #20 clk=~clk;counter_10c m_1(.Q(D_out),.clear(clr),.clock(clk),.ov(c_out)); endmodule4 仿真波形:实验4 :用 Verilog HDL 程序实现序列检测器1 实验要求:、(1) 编写序列检测器的 Veirlog HDL 程序. 检测串行输入的数据序列中是否有目标序列5'b10010, 检测到指定序列后, 用一个端口输出高电平表示.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2试验程序:module e15d1_seqdet( x, z, clk, rst);input x,clk, rst;output z;reg [2:0] state;wire z;parameter IDLE = 3 'd0,A = 3'd1,B = 3'd2,C = 3'd3,D = 3'd4,E = 3'd5,F = 3'd6,G = 3'd7;assign z =(state==D && x==0)?1:0;always @(posedge clk or negedge rst)if(!rst)beginstate<=IDLE;endelsecasex(state)IDLE: if(x==1)state<=A;else state<=IDLE;A: if (x==0)state<=B;else state<=A;B: if (x==0)state<=C;else state<=F;C: if(x==1)state<=D;else state<=G;D: if(x==0)state<=E;else state<=A;E: if(x==0)state<=C;else state<=A;F: if(x==1)state<=A;else state<=B;G: if(x==1)state<=F;else state <=G;default: state<=IDLE;endcaseendmodule3测试基准:`include"e15d1_seqdet.v"`timescale 1ns/1ns`define halfperiod 20module e15d1_seqdet_tb;reg clk, rst;reg [23:0] data;wire z;reg x;initialbeginclk =0;rst =1;#2 rst =0;#30 rst =1;data= 20 'b1100_1001_0000_1001_0100;#(`halfperiod*1000) $stop;endalways #(`halfperiod) clk=~clk;always @ (posedge clk)begin#2 data={data[22:0],data[23]};x=data[23];ende15d1_seqdet m(.x(x),.z(z),.clk(clk),.rst(rst)); endmodule4仿真波形:。

实验六Verilog设计分频器计数器电路

实验六Verilog设计分频器计数器电路

实验六Verilog设计分频器/计数器电路一、实验目的1进一步掌握最基本时序电路的实现方法;2学习分频器/计数器时序电路程序的编写方法;3进一步学习同步和异步时序电路程序的编写方法。

二、实验内容1、用Verilog设计一个10分频的分频器,要求输入为clock(上升沿有效),reset(低电平复位),输出clockout为5个clock周期的低电平,5个clock周期的高电平),文件命名为fenpinqi10.v。

2、用Verilog设计一异步清零的十进制加法计数器,要求输入为时钟端CLK(上升沿)和异步清除端CLR(高电平复位),输出为进位端C和4位计数输出端Q,文件命名为couter10.v。

3、用Verilog设计8位同步二进制加减法计数器,输入为时钟端CLK(上升沿有效)和异步清除端CLR(低电平有效),加减控制端UPDOWN,当UPDOWN为1时执行加法计数,为0时执行减法计数;输出为进位端C和8位计数输出端Q,文件命名为couter8.v。

4、用VERILOG设计一可变模数计数器,设计要求:令输入信号M1和M0控制计数模,当M1M0=00时为模18加法计数器;M1M0=01时为模4加法计数器;当M1M0=10时为模12加法计数器;M1M0=11时为模6加法计数器,输入clk上升沿有效,文件命名为mcout5.v。

5、VerilogHDL设计有时钟时能的两位十进制计数器,有时钟使能的两位十进制计数器的元件符号如图所示,CLK是时钟输入端,上升沿有效;ENA是时钟使能控制输入端,高电平有效,当ENA=1时,时钟CLK才能输入;CLR是复位输入端,高电平有效,异步清零;Q[3..0]是计数器低4位状态输出端,Q[7..0]是高4位状态输出端;COUT是进位输出端。

三、实验步骤:第一个实验:1、打开QuartusII,新建一个工程f_fenpinq10yjq2、新建一个Verilog HDL文件3、输入程序:module fenpinqi10(clk,reset,clkout);input clk,reset;output clkout;reg clkout;reg[2:0] cnt;always @(posedge clk , negedge reset)beginif(!reset)begin clkout<=0;cnt<=0;endelse if(cnt==4)begin cnt<=0;clkout<=~clkout;endelse cnt<=cnt+1;endendmodule4、设置顶层实体名(点settings>general >下拉选fenpinqi10)5、编译6、执行file>Create/Update>Create Symbol Files for Current Flie为VHDI设计文件生成原件符号7、建立波形文件8、导入引脚9、仿真结果如下:总结:仿真结果与实验一的题意相符,所以仿真正确。

verilog实验报告

verilog实验报告

verilog实验报告Verilog实验报告引言:Verilog是一种硬件描述语言(HDL),用于设计和模拟数字电路。

它是一种高级语言,能够描述电路的行为和结构,方便工程师进行数字电路设计和验证。

本实验报告将介绍我在学习Verilog过程中进行的实验内容和所获得的结果。

实验一:基本门电路设计在这个实验中,我使用Verilog设计了基本的逻辑门电路,包括与门、或门和非门。

通过使用Verilog的模块化设计,我能够轻松地创建和组合这些门电路,以实现更复杂的功能。

我首先创建了一个与门电路的模块,定义了输入和输出端口,并使用逻辑运算符和条件语句实现了与门的功能。

然后,我创建了一个测试模块,用于验证与门的正确性。

通过输入不同的组合,我能够验证与门的输出是否符合预期。

接下来,我按照同样的方法设计了或门和非门电路,并进行了相应的测试。

通过这个实验,我不仅学会了使用Verilog进行基本门电路的设计,还加深了对逻辑电路的理解。

实验二:时序电路设计在这个实验中,我学习了如何使用Verilog设计时序电路,例如寄存器和计数器。

时序电路是一种具有状态和时钟输入的电路,能够根据时钟信号的变化来改变其输出。

我首先设计了一个简单的寄存器模块,使用触发器和组合逻辑电路实现了数据的存储和传输功能。

然后,我创建了一个测试模块,用于验证寄存器的正确性。

通过输入不同的数据和时钟信号,我能够观察到寄存器的输出是否正确。

接下来,我设计了一个计数器模块,使用寄存器和加法电路实现了计数功能。

我还添加了一个复位输入,用于将计数器的值重置为初始状态。

通过测试模块,我能够验证计数器在不同的时钟周期内是否正确地进行计数。

通过这个实验,我不仅学会了使用Verilog设计时序电路,还加深了对触发器、寄存器和计数器的理解。

实验三:组合电路设计在这个实验中,我学习了如何使用Verilog设计组合电路,例如多路选择器和加法器。

组合电路是一种没有状态和时钟输入的电路,其输出只取决于当前的输入。

verilog HDL十进制加减法计数器报告

verilog HDL十进制加减法计数器报告

十进制加减法计数器1.实验要求(1)在Modelsim环境中编写十进制加减法计数器程序;(2)编译无误后编写配套的测试程序;(3)仿真后添加信号,观察输出结果。

2.设计程序如下module decade_counter#(parameter SIZE=4)(input clock,load_n,clear_n,updown,input [SIZE-1:0]load_data,output reg [SIZE-1:0]q);always@(negedge load_n,negedge clear_n,posedge clock)if (!load_n)q<=load_data;else if (!clear_n)q<=0;else //clockif(updown)q<=(q+1)%10;elsebeginif(q==0)q<=9;elseq<=q-1;endendmodule3.测试程序如下`timescale 1ns/1nsmodule test_decade_counte;reg clock,load_n,clear_n,updown;reg [3:0]load_data;wire [3:0]q;decade_counter T1(clock,load_n,clear_n,updown,load_data,q);initialbeginclock=0;clear_n=0;#30 clear_n=1;load_n=0;load_data=7;#30 load_n=1;updown=0;#300 updown=1;#300 updown=0;#300 updown=1;#300 $stop;endalways#10 clock=~clock;always@(q)$display("At time%t,q=%d",$time,q);endmodule4.波形如下5.测试结果如下# At time 0,q= 0# At time 30,q= 7# At time 70,q= 6# At time 90,q= 5# At time 110,q= 4# At time 130,q= 3# At time 150,q= 2# At time 170,q= 1# At time 190,q= 0# At time 210,q= 9# At time 230,q= 8# At time 250,q= 7# At time 270,q= 6# At time 290,q= 5# At time 310,q= 4# At time 330,q= 3# At time 370,q= 3 # At time 390,q= 4 # At time 410,q= 5 # At time 430,q= 6 # At time 450,q= 7 # At time 470,q= 8 # At time 490,q= 9 # At time 510,q= 0 # At time 530,q= 1 # At time 550,q= 2 # At time 570,q= 3 # At time 590,q= 4 # At time 610,q= 5 # At time 630,q= 6 # At time 650,q= 7 # At time 670,q= 6 # At time 690,q= 5 # At time 710,q= 4 # At time 730,q= 3 # At time 750,q= 2 # At time 770,q= 1 # At time 790,q= 0 # At time 810,q= 9 # At time 830,q= 8 # At time 850,q= 7 # At time 870,q= 6 # At time 890,q= 5 # At time 910,q= 4 # At time 930,q= 3 # At time 950,q= 2 # At time 970,q= 3 # At time 990,q= 4 # At time 1010,q= 5 # At time 1030,q= 6 # At time 1050,q= 7 # At time 1070,q= 8 # At time 1090,q= 9 # At time 1110,q= 0 # At time 1130,q= 1 # At time 1150,q= 2 # At time 1170,q= 3 # At time 1190,q= 4 # At time 1210,q= 5# At time 1250,q= 7。

verilog实验报告 - 程超

verilog实验报告 - 程超

西安邮电學院基于Verilog的数字电路模拟实验系部名称:通信与信息工程学院学生姓名:张宏扬专业名称:通信工程班级:通工0809学号:03081469(01)时间:2010年12月20号实验题目门级建模仿真实验一、实验内容设计的一个带有清零的顺序输出结果的计数器,q从0计数到15二、技术规范1、输入引脚:reset,clk;输出引脚:q。

2、功能:这时也个具有清零的计数器,从0到15输出的。

在其中用到了T触发器和D触发器来实现它的功能。

三、实验步骤1、在modulesim软件中对设计模块和验证模块进行书写和编译;2、对编译好的模块进行仿真。

四、源代码://脉动进位计数器顶层模块module ripple_carry_counter(q,clk,reset);output [3:0]q;input clk,reset;//生成了4个T触发器(T_FF)的实例,每个都有自己的名字T_FF tff0(q[0],clk,reset);T_FF tff1(q[1],q[0],reset);T_FF tff2(q[2],q[1],reset);T_FF tff3(q[3],q[2],reset);endmodule//触发器T_FFmodule T_FF(q,clk,reset);output q;input clk,reset;wire d;D_FF dff0(q,d,clk,reset);not n1(d,q); //非门(not)是Verilog语言的内置原语部件(primitive)endmodule//D触发器(D_FF)//带异步复位的D触发器(D_FF)module D_FF(q,d,clk,reset);output q;input d,clk,reset;reg q;//可以有许多种新结构,不考虑这些结构的功能,只需要注意设计块是如何以自顶向下的方式编写的always @(posedge reset or negedge clk)if (reset)q<= 1'b0;elseq<= d;endmodulemodule stimulus;reg clk;reg reset;wire [3:0]q;//引用已经设计好的模块实例ripple_carry_counter r1(q,clk,reset);//控制驱动设计块的时钟信号,时钟周期为10个时间单位initialclk = 1'b0; //把clk设置为0always#5 clk = ~clk; //每5个时间单位时钟翻转一次//控制驱动设计块的reset信号initialbeginreset = 1'b1;#15 reset = 1'b0;#180 reset = 1'b1;#10 reset = 1'b0;#20 $finish; //终止仿真end//监视输出initial$monitor($time, "Output q = %d",q);endmodule五、仿真结果及分析实验题目 RS锁存器一、实验内容带有延迟的RS锁存器,写出其带有延迟的Verilog门级描述。

verilog模4计数器实验报告

verilog模4计数器实验报告

Lab 5 模4递增计数器王阳IS1102班U2011140661.实验目的学会用Quartus 9.1编译Verilog语言的方法和步骤;设计简单的程序,并能运行;了解触发器,并学会利用触发器制作模4递增计数器。

2.实验内容●在模4递增计数器中,由cp时钟信号控制输入;●由两个D触发器组合而得到模4递增计数器;●简单的模4计数器由cp作为开关控制输入,由Q0和Q1两个LED灯控制输出。

3.代码分析1)首先,定义module的输入输出接口;2)然后,建立程序,分为模4递增计数器主块和D触发器块;3)模4递增计数器的实现分为2个块,如下:模4递增计数器块:module mo4(Q0,Q1,cp);output Q0,Q1;input cp;d_ff f0(Q0,~Q0,cp);//调用D触发器d_ff f1(Q1,~Q1,Q0); //调用D触发器endmoduleD触发器块:module d_ff (Q,D,cp);//D触发器块output Q;input D,cp;reg Q;always @(posedge cp)Q<=D;endmodule4.实验步骤1)连接DE0板:连接DE0板的电源线和数据线或直接将数据线接到电脑主机上,打开开关。

2)创建项目:打开Quartus9.1软件,选择“File—>New Project Wizard”,在弹出的窗口中输入项目的名称和存储位置。

这里笔者将文件储存在桌面的临时文件夹中,并取名为chufaqi\mo4,如下:确定输入完成后,单击Next,出现下图:可以在File name中输入文件名,再次单击Next后,接着选择实验板的型号。

如图,实验时,一般选择Cyclone lll中的EP3C16F484C6型号即可。

继续单击Next,最后,单击Finish完成项目的创建。

3)建立Verilog HDL文件:在“File—>New”的窗口中选择建立Verilog HDL文件。

verilog实验-计数器实验报告

verilog实验-计数器实验报告

v e r i l o g实验-计数器实验报告-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN计数器1、实现目标及介绍实验实现了一个简易的计数器,计数范围可达899(0~899),通过key4按键计数,每按下一次,计数加一,百位数显示在led上,个位与十位显示在数码管上。

为十进制计数,数码管1计数到九后置零。

数码管2获得进位加一,数码管2到9后当再次获得个位进位时再次向百位进一,点亮led1,每百位点亮一个led。

此外key4为清零键,可随时按键清零。

2、效果展示计数99清零计数100视频展示(双击观看)3、代码实现与模块分析1.顶层模块module jishuqi(input wire clk,rst, eg_data_1 (cnt[7:4]), eg_data_2 (cnt[3:0]), eg_led_1 (segment_led_1), eg_led_2 (segment_led_2) lk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule2.数码管显示模块module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2);input [3:0] seg_data_1;键消抖模块eg_data_1 (cnt[7:4]), eg_data_2 (cnt[3:0]), eg_led_1 (segment_led_1), eg_led_2 (segment_led_2) lk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule//按键消抖module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key 的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。

Verilog 实验报告

Verilog 实验报告

Verilog 实验报告一、实验目的本次 Verilog 实验的主要目的是通过实际编写代码和进行仿真,深入理解 Verilog 语言的基本语法、逻辑结构和时序特性,掌握数字电路的设计方法和实现过程,并能够运用Verilog 实现简单的数字逻辑功能。

二、实验环境本次实验使用的软件工具是 Xilinx Vivado 20192,硬件平台是Xilinx Artix-7 开发板。

三、实验内容(一)基本逻辑门的实现1、与门(AND Gate)使用 Verilog 语言实现一个两输入的与门。

代码如下:```verilogmodule and_gate(input a, input b, output out);assign out = a & b;endmodule```通过编写测试激励文件对该模块进行仿真,验证其逻辑功能的正确性。

2、或门(OR Gate)同样实现一个两输入的或门,代码如下:```verilogmodule or_gate(input a, input b, output out);assign out = a | b;endmodule```3、非门(NOT Gate)实现一个单输入的非门:```verilogmodule not_gate(input a, output out);assign out =~a;endmodule```(二)组合逻辑电路的实现1、加法器(Adder)设计一个 4 位的加法器,代码如下:```verilogmodule adder_4bit(input 3:0 a, input 3:0 b, output 4:0 sum);assign sum = a + b;endmodule```2、减法器(Subtractor)实现一个 4 位的减法器:```verilogmodule subtractor_4bit(input 3:0 a, input 3:0 b, output 4:0 diff);assign diff = a b;endmodule```(三)时序逻辑电路的实现1、计数器(Counter)设计一个 4 位的计数器,能够在时钟上升沿进行计数,代码如下:```verilogmodule counter_4bit(input clk, output 3:0 count);reg 3:0 count_reg;always @(posedge clk) begincount_reg <= count_reg + 1;endassign count = count_reg;endmodule```2、移位寄存器(Shift Register)实现一个 4 位的移位寄存器,能够在时钟上升沿进行左移操作:```verilogmodule shift_register_4bit(input clk, input rst, output 3:0 data_out);reg 3:0 data_reg;always @(posedge clk or posedge rst) beginif (rst)data_reg <= 4'b0000;elsedata_reg <={data_reg2:0, 1'b0};endassign data_out = data_reg;endmodule```四、实验结果与分析(一)基本逻辑门的结果通过仿真,与门、或门和非门的输出结果与预期的逻辑功能完全一致,验证了代码的正确性。

verilog八位十进制计数器实验报告附源代码修订版

verilog八位十进制计数器实验报告附源代码修订版

v e r i l o g八位十进制计数器实验报告附源代码修订版IBMT standardization office【IBMT5AB-IBMT08-IBMT2C-ZZT18】8位10进制计数器实验报告一、实验目的学习时序逻辑电路学会用verilog语言设计时序逻辑电路掌握计数器的电路结构掌握数码管动态扫描显示原理二、实验内容实现一个8bit十进制(BCD码)计数器端口设置:用拨动开关实现复位和使能LED灯来表示8位数据用数码管显示16进制的八位数据1.复位时计数值为8‘h02.复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8‘h99后,从0开始继续计数3.使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。

4.每0.5s计数值加15.8位的结果显示在LED灯上,其中LED灯亮表示对应的位为1,LED灯灭表示对应的灯为06.用isim进行仿真,用forever语句模拟时钟信号输入,并给变量赋值仿真initial语句。

7.用7段数码管的后两位显示16进制下8位结果。

三、实验结果烧写结果:拨动reset开关到1时,LED灯显示10010000,7段数码管显示“90”。

之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。

从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。

之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。

拨动复位信号时,无视WE信号,直接复位。

仿真结果:当输入reset信号时波形变化如下当达到一个扫描信号的周期时的波形如下当达到一个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所示:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显示,先考虑LED灯,可以直接由8位输出信号控制,而数码管需要同时显示两个不同的数字,需要时分复用,即快速的交替显示十位和个位,利用人眼的视觉暂留来达到同时显示。

verilog八位十进制计数器实验报告

verilog八位十进制计数器实验报告

8位10进制计数器实验报告一、实验目的●学习时序逻辑电路●学会用verilog语言设计时序逻辑电路●掌握计数器的电路结构●掌握数码管动态扫描显示原理二、实验内容实现一个8bit十进制(BCD码)计数器端口设置:用拨动开关实现复位和使能LED灯来表示8位数据用数码管显示16进制的八位数据1.复位时计数值为8‘h02.复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8‘h99后,从0开始继续计数3.使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。

4.每计数值加15.8位的结果显示在LED灯上,其中LED灯亮表示对应的位为1,LED灯灭表示对应的灯为06.用isim进行仿真,用forever语句模拟时钟信号输入,并给变量赋值仿真initial语句。

7.用7段数码管的后两位显示16进制下8位结果。

三、实验结果烧写结果:拨动reset开关到1时,LED灯显示,7段数码管显示“90”。

之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。

从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。

之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。

拨动复位信号时,无视WE信号,直接复位。

仿真结果:当输入reset信号时波形变化如下当达到一个扫描信号的周期时的波形如下当达到一个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所示:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显示,先考虑LED灯,可以直接由8位输出信号控制,而数码管需要同时显示两个不同的数字,需要时分复用,即快速的交替显示十位和个位,利用人眼的视觉暂留来达到同时显示。

这样就需要两种不同的频率信号。

一种是每一次,作为计数信号,用脉冲生成器生成,另一种是1ms一次的扫描信号,用降频器生成,将计数信号输入计数器来计数,并将计数的值和扫描信号同时输入扫描显示模块。

模8计数器verilog报告

模8计数器verilog报告

模8计数器verilog报告实验名称模8计数器姓名:XXX班级:XXX学号:XXXXX报告日期:XXXXXX1.实验目的练习在modelsim下编写verilog程序,熟悉modelsim运行过程, 并学会用verilog编写一个模八计数器。

2.实验任务编写一个模值为八的计数器的功能模块实现模为八带清零端的(异步清零);并且编写一激励模块来测试该模块。

3.实验内容及步骤3.1实验内容编写模8计数器模块及激励模块3.2本次所实现的功能描述模8计数器有两个输入端,分别为clock(时钟控制输入端)和clear (异步清零端),一个输出端Q用来周期性的显示。

Clock:时钟信号,当上升沿到来时,计数器自动加一。

Clear:异步清零端,低电平到来时计数器自动清零。

Q:输出端,从000-111共八个状态3.3本次实验的设计方案带有异步清零端的模8计数器共有8个状态,所以输出端Q 只需 要三位(从000----111)共八个状态。

还需要一个输入端(clock )来 输入时钟信号,另一个输入端(clear )来输入清零信号。

模8计数器的状态转移图如下:模 8 — Q、计具体方案如下:1.进入 modelsim 后点击 file ----> new ---->project •之后出现一个建clockClear立工程的对话框,键入counter_8工程名后,再在下面路径添加一个自己的文件夹。

确认后会弹出一个对话框,点击creat New File, 在工程conuter_8下建立两个文件分别叫做counter_8的功能模块文件和test_counter_8的测试激励模块文件。

2.双击进入文件后编写程序3.编译,如果程序出错对程序进行修改。

之后再编译,编译成功后点击simulate进行仿真。

・4.观察仿真结果是否符合事先的设计。

不符合继续修改程序。

模8计数器的功能模块如下:module counter_8(clock,clear,q);input clock,clear;output[2:0] q;reg[2:0] q;always @(posedge clock or negedge clear) beginif(!clear)q<=0;elseq <= q +1;endendmodule测试激励如下:module test_counter8;reg clk,clr;wire[2:0] q;counter_8 counter(.clock(clk),.clear(clr),.q(q));initialclk = 0;always#100 clk = ~clk;initialbeginclr = 0;#50 clr = 1;#200 clr = 0;#50 clr = 1;endinitial$monitor($time,"clear= %b,clock= %b,q= %b",clr,clk,q);endmodule3.4本次实验设计的结果测试结果波形如下:!■] Wav®---测试输出结果如下;0clear=0z ciock=ODD50clears l z clock=0,q-000 100clear-1;clock-QQ1 200clear=l,clock=0^*5=001 250cleat=0,clock=0層000 300clear=丄$匚丄ock=丄層400clear=l,clock=001 500clear=lz cloc}£=010 600clear=l z clock=DID700clear-lz clock=1,5*=Qll800clear-l z clock=Oil900clear=丄,clock=丄内=1001000clears Ij. clock=ICC1100clear=1f clock=i/q=1011200clears1f clocks1011300clears1,01001:1101400clear-l^clock-o,q=1101500cleaii=l z clock-l*q=11116DD clear-lz clock=1111700clEai:丄十匚丄ock=丄用0001800clear=丄^clock®0/Q=0001900clear=lz c 丄(JUk-r□tn2000clear=l z clock=0,q=0012100clear-i z C10CJ:s1W oia4.实验总结这是第二次用modelsim编写程序,使用方面还不熟练,总是不知道点哪里。

Verilog机组实验计数器

Verilog机组实验计数器

计数器+ALU实验
实验内容
1、ALU实现及仿真
2、计数器实现及仿真
3、ALU+计数器综合实现及仿真
实验原理
1、A LU实现及仿真
使用Verilog HDL代码编程方式构建ALU181元件符号,生成ALU模块。

主要步骤:
(1)建立工程(注意工程名字和文件夹名字一致)
(2)编辑ALU181.v文件,并生成元件符号
(3)建立原理图文件,调用该元件符号
(4)编译
(5)波形仿真(不需引脚绑定)
2、计数器实现及仿真
(1)设计计数器Counter元件。

通过.v文件构建元件符号Counter,生成计数器。

(2)进行波形仿真
(3)进行引脚绑定,下载到实验箱进行验证。

3、ALU+计数器综合实现及仿真
(1)设计计数器Counter元件。

通过.v文件构建元件符号Counter,生成计数器(2)设计ALU元件。

通过.v文件构建元件符号ALU181
(3)计数器产生的信号S[3..0]作为ALU中S[3..0]的输入信号。

实验中程序运行结果及截图
实验心得
通过这次实验的学习。

我们了解到了ALU和计数器的基本原理,通过自己动手实验,进一步了解了其基本结构在实际实验中是怎样发挥作用的。

在实验的过程中,我和小组成员互相配合,共同摸索,虽然几经失败,但是最后在老师的帮助下发现了错误,并且加以改正,最后成功做出了实验,完成了一个简单的ALU+计数器。

在此过程中,增强了动手能力,加深了理解,增进了友谊,是一次不可多得的宝贵的实验经历。

用verilog HDL输入法设计十进制计数器 实验报告

用verilog HDL输入法设计十进制计数器 实验报告

实验名称:实验四:用verilog HDL输入法设计十进制计数器实验目的:硬件描述语言(HDL)就是可以描述硬件电路的功能、信号连接关系及定时(时序)关系的语言,也是一种用形式化方法来描述数字电路和设计数字系统的。

通过十进制计数器的设计,熟练掌握硬件描述语言的编程方法。

实验原理:module cout(clk,clear,qd,EN);input clk,clear,EN;output[3:0] qd;reg[3:0] cnt;assign qd=cnt;always @(posedge clk )begin if(clear ) cnt<=4'h0;//同步清0,高电平有效else if(EN)begin if(cnt==9) cnt<=4'h0;else cnt<=cnt+1; //加法计数endendEndmodule实验内容:为了能对此计数器进行硬件测试,应将其输入输出信号锁定在芯片确定的引脚上,编译后下载。

(1)选择Tools菜单中的Assignments项,即进入如图2-23所示的Assignment Editor编辑器窗。

在Category栏中选择Pin,或直接单击右上侧的Pin按钮。

(2)双击“TO”栏的《new》,在出现的如图2-24所示的下拉栏中分别选择本工程要锁定的端口信号名;然后双击对应的Location栏的《new》,在出现的下拉栏中选择对应端口信号名的器件引脚号,如对应CQ[3],选择42脚。

在此选择GW48-EDA系统的电路模式No.5,通过查阅附录有关”芯片引脚对照表”,GWAC3板确定引脚分别为:主频时钟clk接Clock0(第93脚,可接在4Hz上);计数使能EN可接电路模式No.5的键1(PIO0对应第1脚);复位clear则接电路模式No.5的键2(PIO1对应第2脚,注意键序与引脚号码并无对应关系);4位输出数据总线CQ[3..0]可由数码1来显示,通过分别接PIO19、PIO18、PIO17、PIO16(它们对应的引脚编号分别为42、41、40、39)。

程序计数器实验报告

程序计数器实验报告

程序计数器实验报告一、实验目的本次实验的目的是通过编写程序计数器(Program Counter,PC)来深入理解计算机系统中指令执行的过程,掌握PC在指令执行中的作用和原理。

二、实验环境本次实验使用Verilog HDL语言进行编写,并使用ModelSim进行仿真。

三、实验原理1. 程序计数器概述程序计数器(Program Counter,PC)是CPU中的一个寄存器,用于存储当前正在执行的指令地址。

在指令执行过程中,PC会自动加上当前指令占用的字节数,以便跳转到下一条指令地址。

2. PC在指令执行中的作用当CPU开始执行程序时,PC会被初始化为程序入口地址。

在每个时钟周期内,CPU会从PC所指向的内存地址中读取下一条指令并执行。

当该条指令完成后,PC会自动加上该条指令占用的字节数,以便跳转到下一条指令地址。

3. PC设计原理为了实现PC功能,在Verilog HDL语言中需要定义一个包含以下内容的模块:- 一个输入端口:时钟信号clk;- 一个输入端口:复位信号rst;- 一个输入端口:跳转信号jump;- 一个输入端口:跳转地址jump_addr;- 一个输出端口:下一条指令地址next_addr。

当rst信号为高电平时,PC会被初始化为程序入口地址。

当clk信号上升沿到来时,PC会自动加上当前指令占用的字节数。

当jump信号为高电平时,PC会跳转到jump_addr所指向的地址。

四、实验步骤1. 编写Verilog HDL代码:首先,我们需要定义一个包含输入输出端口的模块,并在其中实现PC的功能。

2. 进行仿真:使用ModelSim对编写好的代码进行仿真,并观察仿真结果是否符合预期。

3. 下载到FPGA板上进行测试:将编写好的Verilog HDL代码下载到FPGA板上进行测试,并观察测试结果是否符合预期。

五、实验结果通过本次实验,我们成功地编写了程序计数器,并通过ModelSim进行了仿真。

verilog实验 计数器实验报告

verilog实验 计数器实验报告

计数器1、实现目标及介绍实验实现了一个简易的计数器,计数范围可达899(0~899),通过key4按键计数,每按下一次,计数加一,百位数显示在led上,个位与十位显示在数码管上。

为十进制计数,数码管1计数到九后置零。

数码管2获得进位加一,数码管2到9后当再次获得个位进位时再次向百位进一,点亮led1,每百位点亮一个led。

此外key4为清零键,可随时按键清零。

2、效果展示计数99清零计数100视频展示(双击观看)3、代码实现与模块分析1.顶层模块module jishuqi(input wire clk,rst, //时钟和复位输入input wire key1, //拨码计output wire [7:0]led,output wire [8:0] segment_led_1,segment_led_2 //数码管输出);wire key_pulse;reg [7:0] cnt; //计时计数器reg [7:0] hud; //百位计数initial hud[7:0] <= 8'b11111111;always @(posedge clk or negedge rst)begin //数码管显示要按照十进制的方式显示if(!rst)begin cnt <= 8'h00;hud [7:0] <= 8'b11111111;endelse if(key_pulse)beginif(cnt[3:0] == 4'd9) //个位进位判断begincnt[3:0] <= 4'd0;if(cnt[7:4] == 4'd9 ) //十位进位判断begincnt[7:4] <= 4'd0;hud[7:0] <= hud[7:0] - 1'b1;endelsecnt[7:4] <= cnt[7:4] + 1'b1;endelse cnt[3:0] <= cnt[3:0] + 1'b1;endelsecnt <= cnt;endassign led = hud;//例化调用数码管显示模块segment u2(.seg_data_1 (cnt[7:4]), //g_data input.seg_data_2 (cnt[3:0]), //g_data input.seg_led_1 (segment_led_1), //MSB~LSB = SEG,DP,G,F,E,D,C,B,A.seg_led_2 (segment_led_2) //MSB~LSB = SEG,DP,G,F,E,D,C,B,A);//例化调用消抖模块debounce u1 (.clk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule2.数码管显示模块module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2);input [3:0] seg_data_1;//数码管需要显示0~9十个数字,所以最少需要4位输入做译码input [3:0] seg_data_2; //小脚丫上第二个数码管output [8:0] seg_led_1;//在小脚丫上控制一个数码管需要9个信号MSB~LSB=DIG、DP、G、F、E、D、C、B、Aoutput [8:0] seg_led_2;//在小脚丫上第二个数码管的控制信号MSB~LSB=DIG、DP、G、F、E、D、C、B、Areg [8:0] seg [9:0];//定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽initial//在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial //initial和always不同,其中语句只执行一次beginseg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字0seg[1] = 9'h06; //7段显示数字 1seg[2] = 9'h5b; //7段显示数字 2seg[3] = 9'h4f; //7段显示数字 3seg[4] = 9'h66; //7段显示数字 4seg[5] = 9'h6d; //7段显示数字 5seg[6] = 9'h7d; //7段显示数字 6seg[7] = 9'h07; //7段显示数字7seg[8] = 9'h7f; //7段显示数字8seg[9] = 9'h6f; //7段显示数字9endassign seg_led_1 = seg[seg_data_1]; //连续赋值,这样输入不同四位数,就能输出对于译码的9位输出assign seg_led_2 = seg[seg_data_2];endmodule3.按键消抖模块//按键消抖module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。

verilog八位十进制计数器实验报告(附源代码)

verilog八位十进制计数器实验报告(附源代码)

8位10进制计数器实验报告一、实验目的●学习时序逻辑电路●学会用verilog语言设计时序逻辑电路●掌握计数器的电路结构●掌握数码管动态扫描显示原理二、实验内容实现一个8bit十进制(BCD码)计数器端口设置:用拨动开关实现复位和使能LED灯来表示8位数据用数码管显示16进制的八位数据1.复位时计数值为8‘h02.复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8‘h99后,从0开始继续计数3.使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。

4.每0.5s计数值加15.8位的结果显示在LED灯上,其中LED灯亮表示对应的位为1,LED灯灭表示对应的灯为06.用isim进行仿真,用forever语句模拟时钟信号输入,并给变量赋值仿真initial语句。

7.用7段数码管的后两位显示16进制下8位结果。

三、实验结果拨动reset开关到1时,LED灯显示10010000,7段数码管显示“90”。

之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。

从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。

之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。

拨动复位信号时,无视WE信号,直接复位。

仿真结果:当输入reset信号时波形变化如下当达到一个扫描信号的周期时的波形如下当达到一个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所示:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显示,先考虑LED灯,可以直接由8位输出信号控制,而数码管需要同时显示两个不同的数字,需要时分复用,即快速的交替显示十位和个位,利用人眼的视觉暂留来达到同时显示。

这样就需要两种不同的频率信号。

一种是每0.5s一次,作为计数信号,用脉冲生成器生成,另一种是1ms一次的扫描信号,用降频器生成,将计数信号输入计数器来计数,并将计数的值和扫描信号同时输入扫描显示模块。

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

计数器1、实现目标及介绍实验实现了一个简易的计数器,计数范围可达899(0~899),通过key4按键计数,每按下一次,计数加一,百位数显示在led上,个位与十位显示在数码管上。

为十进制计数,数码管1计数到九后置零。

数码管2获得进位加一,数码管2到9后当再次获得个位进位时再次向百位进一,点亮led1,每百位点亮一个led。

此外key4为清零键,可随时按键清零。

2、效果展示计数99清零计数100视频展示(双击观看)3、代码实现与模块分析1.顶层模块module jishuqi(input wire clk,rst, //时钟和复位输入input wire key1, //拨码计output wire [7:0]led,output wire [8:0] segment_led_1,segment_led_2 //数码管输出);wire key_pulse;reg [7:0] cnt; //计时计数器reg [7:0] hud; //百位计数initial hud[7:0] <= 8'b11111111;always @(posedge clk or negedge rst)begin //数码管显示要按照十进制的方式显示if(!rst)begin cnt <= 8'h00;hud [7:0] <= 8'b11111111;endelse if(key_pulse)beginif(cnt[3:0] == 4'd9) //个位进位判断begincnt[3:0] <= 4'd0;if(cnt[7:4] == 4'd9 ) //十位进位判断begincnt[7:4] <= 4'd0;hud[7:0] <= hud[7:0] - 1'b1;endelsecnt[7:4] <= cnt[7:4] + 1'b1;endelse cnt[3:0] <= cnt[3:0] + 1'b1;endelsecnt <= cnt;endassign led = hud;//例化调用数码管显示模块segment u2(.seg_data_1 (cnt[7:4]), //g_data input.seg_data_2 (cnt[3:0]), //g_data input.seg_led_1 (segment_led_1), //MSB~LSB = SEG,DP,G,F,E,D,C,B,A.seg_led_2 (segment_led_2) //MSB~LSB = SEG,DP,G,F,E,D,C,B,A);//例化调用消抖模块debounce u1 (.clk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule2.数码管显示模块module segment(seg_data_1,seg_data_2,seg_led_1,seg_led_2);input [3:0] seg_data_1;//数码管需要显示0~9十个数字,所以最少需要4位输入做译码input [3:0] seg_data_2; //小脚丫上第二个数码管output [8:0] seg_led_1;//在小脚丫上控制一个数码管需要9个信号MSB~LSB=DIG、DP、G、F、E、D、C、B、A output [8:0] seg_led_2;//在小脚丫上第二个数码管的控制信号MSB~LSB=DIG、DP、G、F、E、D、C、B、Areg [8:0] seg [9:0];//定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽initial//在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial//initial和always不同,其中语句只执行一次beginseg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字0seg[1] = 9'h06; //7段显示数字 1seg[2] = 9'h5b; //7段显示数字 2seg[3] = 9'h4f; //7段显示数字 3seg[4] = 9'h66; //7段显示数字 4seg[5] = 9'h6d; //7段显示数字 5seg[6] = 9'h7d; //7段显示数字 6seg[7] = 9'h07; //7段显示数字7seg[8] = 9'h7f; //7段显示数字8seg[9] = 9'h6f; //7段显示数字9endassign seg_led_1 = seg[seg_data_1]; //连续赋值,这样输入不同四位数,就能输出对于译码的9位输出assign seg_led_2 = seg[seg_data_2]; endmodule3.按键消抖模块//按键消抖module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。

相当于经过两个时钟触发,key_rst存储的是当前时刻key的值,key_rst_pre存储的是前一个时钟的key的值endendassign key_edge = key_rst_pre & (~key_rst);//脉冲边沿检测。

当key检测到下降沿时,key_edge产生一个时钟周期的高电平reg [17:0] cnt; //产生延时所用的计数器,系统时钟12MHz,要延时20ms左右时间,至少需要18位计数器//产生20ms延时,当检测到key_edge有效是计数器清零开始计数always @(posedge clk or negedge rst)beginif(!rst)cnt <= 18'h0;else if(key_edge)cnt <= 18'h0;elsecnt <= cnt + 1'h1;endreg [N-1:0] key_sec_pre; //延时后检测电平寄存器变量reg [N-1:0] key_sec;//延时后检测key,如果按键状态变低产生一个时钟的高脉冲。

如果按键状态是高的话说明按键无效always @(posedge clk or negedge rst)beginif (!rst)key_sec <= {N{1'b1}};else if (cnt==18'h3ffff)key_sec <= key;endalways @(posedge clk or negedge rst)beginif (!rst)key_sec_pre <= {N{1'b1}};elsekey_sec_pre <= key_sec;endassign key_pulse = key_sec_pre & (~key_sec); endmodule4、源码与源码图片module jishuqi(input wire clk,rst, //时钟和复位输入input wire key1, //拨码计output wire [7:0]led,output wire [8:0] segment_led_1,segment_led_2 //数码管输出);wire key_pulse;reg [7:0] cnt; //计时计数器reg [7:0] hud; //百位计数initial hud[7:0] <= 8'b11111111;always @(posedge clk or negedge rst)begin //数码管显示要按照十进制的方式显示if(!rst)begin cnt <= 8'h00;hud [7:0] <= 8'b11111111;endelse if(key_pulse)beginif(cnt[3:0] == 4'd9)begincnt[3:0] <= 4'd0;if(cnt[7:4] == 4'd9 )begincnt[7:4] <= 4'd0;hud[7:0] <= hud[7:0] - 1'b1;endelsecnt[7:4] <= cnt[7:4] + 1'b1;endelse cnt[3:0] <= cnt[3:0] + 1'b1;endelsecnt <= cnt;endassign led = hud;segment u2(.seg_data_1 (cnt[7:4]), //g_data input.seg_data_2 (cnt[3:0]), //g_data input.seg_led_1 (segment_led_1), //MSB~LSB = SEG,DP,G,F,E,D,C,B,A.seg_led_2 (segment_led_2) //MSB~LSB = SEG,DP,G,F,E,D,C,B,A);debounce u1 (.clk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule//按键消抖module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。

相关文档
最新文档