实验二含异步清零和同步使能的加法计数器
- 格式:doc
- 大小:69.50 KB
- 文档页数:5
实验二含异步清零和同步使能的加法计数器
一、实验目的
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];*/