实验二含异步清零和同步使能的加法计数器

  • 格式:doc
  • 大小:69.50 KB
  • 文档页数:5

下载文档原格式

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

实验二含异步清零和同步使能的加法计数器

一、实验目的

1、了解二进制计数器的工作原理。

2、进一步熟悉QUARTUSII软件的使用方法和VHDL输入。

3、时钟在编程过程中的作用。

二、实验原理

二进制计数器中应用最多、功能最全的计数器之一,含异步清零和同步使能的加法计数器的具体工作过程如下:

在时钟上升沿的情况下,检测使能端是否允许计数,如果允许计数(定义使能端高电平有效)则开始计数,否则一直检测使能端信号。在计数过程中再检测复位信号是否有效(低电平有效),当复位信号起作用时,使计数值清零,继续进行检测和计数。

其工作时序如图3-1所示:

图3-1 计数器的工作时序

三、实验内容

本实验要求完成的任务是在时钟信号的作用下,通过使能端和复位信号来完成加法计数器的计数。实验中时钟信号使用数字时钟源模块的1HZ信号,用一位拨动开关K1表示使能端信号,用复位开关S1表示复位信号,用LED模块的LED1~LED11来表示计数的二进制结果。实验LED亮表示对应的位为‘1’,LED灭表示对应的位为‘0’。通过输入不同的值模拟计数器的工作时序,观察计数的结果。实验箱中的拨动开关、与FPGA的接口电路,LED灯与FPGA的接口电路以及拨动开关、LED与FPGA的管脚连接在实验一中都做了详细说明,这里不在赘述。

数字时钟信号模块的电路原理如图3-2所示,表3-1是其时钟输出与FPGA的管脚连接表。

图3-2 数字时钟信号模块电路原理

信号名称对应FPGA管脚名说明

DIGITAL-CLK A14数字时钟信号送至FPGA的A14

表3-1 数字时钟输出与FPGA的管脚连接表

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

图3-3 按键开关模块电路原理

信号名称FPGA I/O名称核心板接口管脚号功能说明S[0]PIN_AF5JP1_91‘S1’ Switch

S[1]PIN_AH6JP1_93‘S2’ Switch

S[2]PIN_AH7JP1_95‘S3’ Switch

S[3]PIN_AH8JP1_97‘S4’ Switch

S[4]PIN_AG10JP1_99‘S5’ Switch

S[5]PIN_AG11JP1_101‘S6’ Switch

S[6]PIN_AH14JP1_90‘S7’ Switch

S[7]PIN_AG7JP1_92‘S8’ Switch

表3-2 按键开关与FPGA的管脚连接表

四、实验步骤

1、打开QUARTUSII软件,新建一个工程。

2、建完工程之后,再新建一个VHDL File,打开VHDL编辑器对话框。

3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,用户可参照光盘中

提供的示例程序。

4、编写完VHDL程序后,保存起来。方法同实验一。

5、对自己编写的VHDL程序进行编译并仿真,对程序的错误进行修改。

6、编译仿真无误后,依照拨动开关、LED与FPGA的管脚连接表(表1-1、表1-2)或

参照附录进行管脚分配。表3-3是示例程序的管脚分配表。分配完成后,再进行全编译一次,以使管脚分配生效。

表3-3 端口管脚分配表

7、用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。观察实验结果是否与自

己的编程思想一致。

五、实验现象与结果

以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源的时钟选择为1HZ,使拨动开关K1置为高电平(使拨动开关向上),四位LED会按照实验原理中依次被点亮,当加法器加到9时,LED12(进位信号)被点亮。当复位键(按键开关的S1键)按下后,计数被清零。如果拨动开关K1置为低电平(拨动开关向下)则加法器不工作。

六、实验报告

1、绘出仿真波形,并作说明。

2、写出在VHDL编程过程中需要说明的规则。

3、将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。

4、改变时钟频率,看实验现象会有什么改变,试解释这一现象。

实验代码:

//二进制计数器,时间间隔是1s

module counter (Clk, Rst_n, En_n, Cout, led) ;

input Clk; //系统时钟1Hz

input Rst_n; //全局复位,低电平有效

input En_n; //使能信号,高电平有效

output Cout; //进位信号

output [3:0] led;

reg [3:0] led;

reg Cout;

//同步使能,异步清零

always @ (posedge Clk, negedge Rst_n)

begin

if(Rst_n == 1'b0)

begin

led <= 4'd0;

Cout <= 1'b0;

end

else if(En_n == 1'b1)

begin

if(led == 4'b1001)

begin

Cout <= 1'b1;

led <= 4'd0;

end

else

led <= led +1'b1;

if(led == 4'b0000)

Cout <= 1'b0;

end

end

endmodule

/*另一种解决进位信号的方法,

就是为9(1001)的时候进位信号为1,

其他时候进位信号为0。

Cout<= led[0] & ~led[1] & ~led[2] & led[3];*/