【verilog】含异步清零和同步使能的加/减法计数器

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
  • 实验目的
    1. 掌握二进制计数器的工作原理。
    2. 能使用verilog设计计数器。

3、进一步熟悉QUARTUSII软件的使用方法和verilog输入方式

  • 实验原理与内容
  1. 实验原理

二进制计数器中应用最多、功能最全的计数器之一是含异步清零和同步使能的具有并行载入功能的加/减法计数器。其具体工作过程如下

复位信号有效低电平有效时计数值清零。并行载入控制信号有效时并行数据输入端的数据存入计数器中。使能信号有效时根据加减法控制信号来进行加法或者减法计数。具有并行载入数据功能的4位加法计数器原理图如图所示。请参考该图设计具有异步复位和加/减法功能的计数器。

2.实验内容

本实验要求完成的任务是使用verilog和Quartus II设计一个4位2进制计数器并在可编程逻辑器件中实现。在时钟信号的作用下通过加减控制信号、使能端、并行载入控制信号和复位信号来控制完成加/减法计数和并行载入数据的功能。实验中时钟信号使用数字时钟源模块的1HZ信号用一位拨动开关K1表示使能端信号用一位拨动开关K2表示加减控制信号用一位拨动开关K3表示并行载入数据控制信号用拨动开关K4~K7表示4位并行载入数据用复位开关S1表示复位信号用LED模块的LED1LED4来表示4位计数器的二进制计数值用LED12表示加/减法计数时的进位/借位信号。实验LED亮表示对应的位为‘1’LED灭表示对应的位为‘0’。通过输入不同的值实现计数器的工作时序观察计数的结果。

数字时钟信号模块的电路原理如图所示

下表是其时钟输出与FPGA的管脚连接表。

信号名称

对应FPGA管脚名

说明

DIGITAL-CLK

K7

数字时钟信号送至FPGA的K7

按键开关模块的电路原理如下图所示下表是按键开关的输出与FPGA的管脚连接表。

信号名称

FPGA I/O名称

核心板接口管脚号

功能说明

S[0]

Pin_B12

JP1_79

‘S1’ Switch

S[1]

Pin_B11

JP1_77

‘S2’ Switch

S[2]

Pin_V4

JP3_56

‘S3’ Switch

S[3]

Pin_T4

JP3_52

‘S4’ Switch

S[4]

Pin_P3

JP3_48

‘S5’ Switch

S[5]

Pin_AB11

JP3_40

‘S6’ Switch

S[6]

Pin_A12

JP3_78

‘S7’ Switch

S[7]

Pin_A11

JP3_76

‘S8’ Switch

S[8]

Pin_V5

JP1_55

‘S9’ Switch

S[9]

Pin_T3

JP1_51

‘S10’ Switch

S[10]

Pin_AA12

JP3_43

‘S11’ Switch

S[11]

Pin_T1

JP3_11

‘S12’ Switch

三实验过程

1.打开QUARTUSII软件新建一个名为exp2的工程

2.建完工程之后再新建一个verilog文件打开verilog编辑器对话框编写verilog程序如下

module exp2(R,Resetn,Clk,Load,En,up_down,Count,Q);
    /*
    * 说明
    * R         输入向量    提供并行数据
    * Resetn    复位输入
    * Clock     时钟信号 
    * Load      Load==0计数模式     Load==1加载模式
    * En        使能输入端
    * up_down   用于识别计数器执行加/减运算
    * Q         输出向量 
    * Count     进位/借位信号
    */
    input [3:0]R;
    input Resetn,Clk,Load,En,up_down;
    output reg [3:0]Q;
    output reg Count;

    reg Clock_1hz;          //1Hz分频新信号
    reg [26:0]Counter;      //计数器用于分频时计数


    //实现50MHz到1Hz分频操作产生频率为1Hz的时钟信号
    always @(posedge Clk)
    begin
        if(Counter == 'd25000000)
        begin
            Clock_1hz <= ~Clock_1hz;
            Counter <= 0;
        end
        else
            Counter <= Counter + 1;
    end
  //主程序部分实现键控加法减法计数、并行载入数据、进位/借位输出
    always @(negedge Resetn,posedge Clock_1hz)
    begin
        if(Resetn == 0)
		  begin
            Q <= 0;
				Count<=0;
			end
        else if(Load)
            Q <= R;
        else if(En)
        begin
            Q <= Q + (up_down ? 1 : -1);
            if(up_down)
                Count = (Q[3]&Q[2]&Q[1]&Q[0]);
            else
                Count = (!(Q[3]|Q[2]|Q[1]|Q[0]));
        end
	end
endmodule

3.对编写的verilog程序进行编译并仿真对程序的错误进行修改。

波形图如下

4.编译仿真无误后依照拨动开关、LED与FPGA的管脚连接表或参照实验箱用户手册进行管脚分配分配完成后再进行全编译一次以使管脚分配生效管脚分配图如下

实验结果

不拨动开关即K7 K6 K5 K4表示D3 D2 D1 D0为0000

拨动开关K4即K7 K6 K5 K4表示D3 D2 D1 D0为0001

拨动开关K5即K7 K6 K5 K4表示D3 D2 D1 D0为0010

拨动开关K5K4即K7 K6 K5 K4表示D3 D2 D1 D0为0011

拨动开关K6即K7 K6 K5 K4表示D3 D2 D1 D0为0100

拨动开关K6K4即K7 K6 K5 K4表示D3 D2 D1 D0为0101

拨动开关K6K5即K7 K6 K5 K4表示D3 D2 D1 D0为0110

拨动开关K6K5K4即K7 K6 K5 K4表示D3 D2 D1 D0为0111

拨动开关K7即K7 K6 K5 K4表示D3 D2 D1 D0为1000

拨动开关K1使得CLK信号为1计数器开始工作前四个LED灯通过8421码计数000000010010001101000101011001111000并通过显示屏显示出数字可以通过开关K2设置递增计数与递减计数通过LOAD端表示存入一个数并从此数开始计数通过Reset端进行复位清零达到所需功能。

四、实验总结

本实验最重要的是设计到复位清零端进行复位清零对于递增计数与递减计数的设置需要清除verilog代码编写上的问题设置Load端控制存入所需数字时高位低位互相对应否则会产生一些不必要的问题造成一些麻烦在进行管脚分配的时候也要一一对应。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6