实验三 可控脉冲发生器的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三 可控脉冲发生器的设计
一、
实验目的
1、 了解可控脉冲发生器的实现机理。
2、 学会用示波器观察FPGA 产生的信号。
3、 学习用VHDL 编写复杂功能的代码。
二、 实验原理
脉冲发生器就是要产生一个脉冲波形,而可控脉冲发生器则是要产生一个周期和占
空比可变的脉冲波形。可控脉冲发生器的实现原理比较简单,可以简单的理解为一个计数器对输入的时钟信号进行分频的过程。通过改变计数器的上限值来达到改变周期的目的,通过改变电平翻转的阈值来达到改变占空比的目的。下面举个简单的例子来说明其工作原理。
假如有一个计数器T 对时钟分频,其计数的范围是从0~N ,另取一个
M (0≤M ≤N ),若输出为Q ,那么Q 只要满足条件
时,通过改变N 值,即可改变输出的脉冲波的周期;改变M 值,即可改变脉冲波的占空比。这样输出的脉冲波的周期和占空比分别为:
三、
实验内容
本实验的任务就是要设计一个可控的脉冲发生器,要求输出的脉冲波的周期和占空比
都可变。具体的实验过程中,时钟信号选用时钟模块中的1MHz 时钟,然后再用按键模块的S1和S7来控制脉冲波的周期,每按下S1,N 会在慢速时钟作用下不断地递增1,按下S7,N 会在慢速时钟作用下不断地递减1;用S2和S8来控制脉冲波的占空比,每按下S2,M 会在慢速时钟作用下不断地递增1,每按下S8,M 会在慢速时钟作用下不断地递减1,S12用作复位信号,当按下S12时,复位FPGA 内部的脉冲发生器模块。脉冲波的输出直接输出到实验箱观测模块的探针,以便用示波器观察输出波形的改变。
四、 实验步骤
1、 打开QUARTUSII 软件,新建一个工程。
⎩⎨
⎧≤≤<≤=N T M M T Q 001
%
1001
)1(⨯+=+=N M
T N CLOCK 占空比周期
2、建完工程之后,再新建一个VHDL File,打开VHDL编辑器对话框。
3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,用户可参照光盘
中提供的示例程序。
4、编写完VHDL程序后,保存起来。方法同实验一。
5、对自己编写的VHDL程序进行编译并仿真,对程序的错误进行修改。
6、编译仿真无误后,依照拨动开关、LED与FPGA的管脚连接表(表1-1、表1-2)或
参照附录进行管脚分配。表10-1是示例程序的管脚分配表。分配完成后,再进行全编译一次,以使管脚分配生效。
表10-1 端口管脚分配表
7、用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。观察实验结果是否与
自己的编程思想一致。
五、实验结果与现象
以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源模块的时钟选择为1MHZ,按下按键开关模块的S12按键,在输出观测模块通过示波器可能观测到一个频率约为1KHZ、占空比为50%的矩形波。按下S1键或者S7键,这个矩形波的频率会发生相应的增加或者减少。按下S2键或者S8键,这个矩形波的占空比会相应的增加或减少。
六、实验报告
1、绘出仿真波形,并作说明。
2、在这个实验的基础上重新设计,使程序改变频率的时候不会影响占空比的改变。
3、将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。
实验代码:
module pluse (Clk, Nu, Nd, Mu, Md, Rst_n, Out);
input Clk; //系统时钟1Hz
input Nu; //频率变快
input Nd; //频率变慢
input Mu; //占空比增加
input Md; //占空比减少
input Rst_n; //复位信号
output Out; //观测信号
reg[10:0] M,N;
reg[10:0] N_Count;
reg Clk_f,Out;
reg[9:0] Clk_Count; //用于按键判断
always @(posedge Clk) //计数器累加
begin
if(N_Count == 1000)
N_Count <= 0;
else
N_Count <= N_Count+1;
end
always @(posedge Clk) //输出观测
begin
if(N_Count < M)
Out <= 1'b1;
else
if(N_Count>M && N_Count Out = 1'b0; end always @(posedge Clk) //频率及占空比的改变1 begin Clk_Count <= Clk_Count+1; Clk_f <= Clk_Count[1]; end always @(negedge Clk_f or negedge Rst_n) if(Rst_n == 1'b0) begin M <= 500; N <= 1000; end else begin if(Nu == 0) N <= N+1; if(Nd == 0) N <= N-1; if(Mu == 0) M <= M+1; if(Md == 0) M <= M-1; end endmodule