实验三 可控脉冲发生器的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档