资源描述
实验二、多波形发生器实验
DE2-70版
一.实验内容:
本实验要求设计一个波形发生器,生成正弦波,三角波,经过ASK调制的正弦波和经过BPSK调制的正弦波,通过开关可以选择波形,改变输出频率.各开关的控制功能见下表:
表1 波形选择控制
输入端口
SW1
SW2
波形
wave_selc
0
0
三角波
0
1
正弦波
1
0
ASK调制的正弦波
1
1
BPSK调制的正弦波
表2频率选择控制
输入端口
SW3
SW4
频率
fre
0
1
每周期采样128点
0
0
每周期采样64点
1
0
每周期采样32点
1
1
每周期采样16点
二.实验原理
用查找表的方法实验信号发生器.查找表法由相位累加器和存储器构成,如下图所示.相位累加器的功能是产生正弦波和三角波的相位值.每隔一个时钟周期,累加器的相位值自动增加一定数值,并将当前的相位值作为查找表的输入值进行查表.通过改变每次增加的相位值可以控制输出信号的频率.例如,每个时钟周期累加器的相位值增加90度,则四个时钟周期产生一个完整的正弦波.输出信号的周期为时钟周期的1/4.
查找表用RAM来构造.例如,如果把相位值作为RAM的地址,只要在该地址中存储相应的正余弦幅度值,就可以通过相位值寻址RAM,输出正弦函数.
任意波形发生器原理图
三 实验设计
3.1程序构架
程序的总体构架如图3-1所示,程序的顶层模块为ask_bpsk.bdf.其中有四个模块wave_sine, wave_askmod,wave_bpsk和wave_tri,分别生成正弦波,ASK正弦波,BPSK正弦波和三角波.通过一个多路选择器选择需要输出的波形,由输入信号wave_selc来控制.
顶层模块的输入输出接口如下:
input clk;
input rst_n;
input []wave_selc;
input []fre;
output []wave;
output clk_out;
程序中的四个模块发生器的结构非常类似,在此以正弦波为例介绍设计思路.
3.2 wave_sine模块
sin_wave产生频率可调的正弦波,输入输出接口如下:
input clk;
input clr;
input []fre;
output []wave_si;
本实验要生成的正弦波形图,.在实验原理中已经指出,本实验采用查找表法生成所需的波形,查询表中存储了正弦波的相位和幅度之间的对应关系,查询表存储在FPGA的内部存储器中,使用Quartus II的Mega Winzard来制定需要的ROM.mif文件的大小为
每个周期的正弦波有128个采样点,原则上要在ROM中存储这128个采样点的幅度值,在生成ROM前,先用Matlab计算正弦波的幅度值:
x = round((sin(linspace(0,pi,49))+1)*5200);
for i=1:1:49
y=x(i);
end
y=
5200 5457 5714 5969 6222 6473 6721 6965
7205 7440 7669 7892 8109 8319 8521 8714
8900 9076 9243 9399 9546 9682 9807 9920
10022 10113 10191 10257 10311 10352 10381 10396
10400 10390 10368 10333 10285 10226 10153 10069
9973 9865 9746 9615 9474 9322 9160 8989
8808 8619 8421 8215 8001 7781 7555 7323
7086 6844 6598 6348 6096 5842 5586 5329
5071 4814 4558 4304 4052 3802 3556 3314
3077 2845 2619 2399 2185 1979 1781 1592
1411 1240 1078 926 785 654 535 427
331 247 174 115 67 32 10 0
4 19 48 89 143 209 287 378
480 593 718 854 1001 1157 1324 1500
1686 1879 2081 2291 2508 2731 2960 3195
3435 3679 3927 4178 4431 4686 4943 5200
在Quartus II中新建一个.mif文件,用于存储正弦函数的幅度值,这些值将初始到内部存储器中.在Quartus II中新建.mif文件的过程为:依次执行[File]->[New OtherFiles]->[ Memory Initialization File ]命令.将上述数据复制到.mif文件的表格中,保存上述.mif文件为data_sine.mif.
用Quartus II中的Mega Winzard定制一个单端口的RAM,具体流程如下:
(1) 单击Tools菜单栏的Megawizard Plug-in Wizard选项,新建一个 “megafunction variation”,如图:
(2) 选择ROM:1-PORT,设置器件类型为Cyclone II,输出文件类型为Verilog HDL输入文件名 “sin_rom”,单击 [下一步] 按钮.
(3) 定义存储深度为128个字(word),存储器的深度为14bit.使用M4K存储器,单击[下一步]按钮,
(4) 将新建的data_sine.mif文件导入至ROM中
(5) 然后单击[finish]按钮完成1-PORT ROM的定制.
(6) 新建——Verilog文件,命名为wave_sine.v 将提供的wave_sine.v内的程序复制进来,并保存。
(7) 在文件树中的wave_sine.v上右键——>Creat Symbol Files For Current File
3.3 wave_tri模块
Wave_tri模块是产生三角波的模块,波形产生的原理和wave_sine模块相同,都是用读取rom内值的方式完成。
(1) 新建——>mif文件,这个mif文件中我们将存储三角波波形的数据。Mif文件word size为14,num为128
(2) 在mif文件中右键——>Custom Fill Cells.
Starting address:0 Ending address: 31
Custom values选择Incrementing/decrementing;
Starting value:5200 Increment by 128.
点击OK。
这样配置就是说从地址0到地址31,每个地址中的数据以128为等差递增。
(3) 由于我们要配置成三角波,所以还需要配置递减的数据,再次在mif文件上右键——>custom fill cells.
(4) 最后,32个的地址配置为:
保存后我们便生成好了三角波的trang.mif文件。
(5) Tools——>MegaWizard Plug-in Manager新建megafuncion variation。相关配置
ROM:1-PORT,
CycloneII
Verilog
文件名trang
(6) Next后,配置为14bits 128words
Memory block type选择M4K,
(7) Next,Next后载入三角波的mif文件,注意上面的mif文件要保存在工程文件夹中,“./”表示相对路径。Finish,Finish
(8) 新建——>Verilog File,保存为wave_tri.v,内容在提供的wave_tri.v中,保存。并在目录树中文件上右键——>Creat Symbol File For Current File。
3.4 wave_askmod模块
这个模块是显示出经ask调制的波形。
“幅移键控”又称为“振幅键控”,记为ASK。也有称为“开关键控”(通断键控)的,所以又记作OOK信号。ASK是一种相对简单的调制方式。幅移键控(ASK)相当于模拟信号中的调幅,只不过与载频信号相乘的是二进制数码而已。幅移就是把频率、相位作为常量,而把振幅作为变量,信息比特是通过载波的幅度来传递的。二进制振幅键控(2ASK), 由于调制信号只有0或1两个电平,相乘的结果相当于将载频或者关断,或者接通,它的实际意义是当调制的数字信号为“1”时,传输载波;当调制的数字信号为“0”时,不传输载波。其中s(t)为基带矩形脉冲。一般载波信号用余弦信号,而调制信号是把数字序列转换成单极性的基带矩形脉冲序列,而这个通断键控的作用就是把这个输出与载波相乘,就可以把频谱搬移到载波频率附近。
新建verilog文件Wave_askmod.v,或者也可以按照实验一中添加文件的方法,把所提供的wave_askmod.v文件添加到工程中。
方法如下:
(1) 先将提供的wave_askmod.v到工程目录中
(2) 在文件树如图位置右键——>add Files..
注意!这里把文件复制到工程目录中是为了省去绝对路径的麻烦。使用相对路径可以使工程整体复制到其他目录或其他机器时仍能正常编译。
选中后点击add
这样就可以把已有的文件添加到系统的工程中了。
(3) wave_askmod.v上右键——>Creat symbol file for current file.
3.5 Wave_bpsk模块
BPSK - Binary Phase Shift Keying(二相相移键控)是利用偏离相位的复数波浪组合来表现信息键控移相方式的一种。是把模拟信号转换成数据值的转换方式之一。
BPSK使用了基准的正弦波和相位反转的波浪,使一方为0,另一方为1,从而可以同时传送接受2值(1比特)的信息。由于最单纯的键控移相方式虽抗噪音较强但传送效率差,所以常常使用利用4个相位的QPSK和利用8个相位的8PSK。
这里建立模块的步骤和上面的相同,大家参考3.4节,添加进wave_bpsk模块,并生成相应的symbol模块
3.6构建顶层文件
(1) 新建——>Design Files——>Block Diagram/Schematic File,保存命名为ask_bpsk.bdf
(2) 添加进上述各模块,并添加相应的input,output管脚。编译后,在Assignment Editor中分配Pin管脚(请把下图放大对照)。最终模块结构如图:
(3) 其中的lpm_mux0是多路数据选择器,它的生成办法如下:
1. 在ask_bpsk.bdf文件的空白处双击,弹出模块添加对话框。找到/libraries下面的megafunction/gates/lpm_mux
2. 点击OK后,会出现相关的配置界面,next
3. 设置input个数为4,数据宽度为14bit
4. 在finish,finish就ok了。这样我们就定制好了一个所需要的多路数据选择器;再次在bdf文件中双击打开添加文件模块,可以在Projects中找到新生成的lpm_mux0模块,如图:
(4) 设置ask_bpsk.bdf为顶层模块,如图
(5) 综合编译。
3.7 观察输出波形
(1) 新建——>Signal TapII文件,保存。
(2) 在setup页中设置时钟,和采样深度:
(3) 在上图左侧圆圈处,双击,添加欲观测的管脚,这里我们添加如下所示的管脚:
(4) 保存后,完整编译
(5) 下载到板子中,Autorun Analysis 运行可观察到signaltapII采集到的波形。如果显示的格式不是波形,请在输出波形的管脚上右键,如下图所示设置显示波形
四、总结
在这个实验中,我们设计一个多波形多频率的波形发生器。这里波形的产生还是通过读取ROM中波形数值的方式产生,通过switch开关控制读取rom数据间隔,从而实现频率的变化。
我们用四个模块分别产生三角波,正弦波,ASK调制的正弦波,BPSK调制的正弦波,顶层模块通过多路数据选择器选择输出的波形。
展开阅读全文