差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
book_excise_waveform_generator [2021/08/18 15:59] zili |
book_excise_waveform_generator [2021/08/18 16:30] (当前版本) zili |
||
---|---|---|---|
行 2: | 行 2: | ||
### 1. 实验内容 | ### 1. 实验内容 | ||
- | 本程序要求设计一个波形发生器,生成正弦波、三角波、经过ASK调制的正弦波和经过BSPK调制的正弦波,通过开关可以选择波形,改变输出频率。各开关的控制功能如表 9 1和表 9 2所示。 | + | 本程序要求设计一个波形发生器,生成正弦波、三角波、经过ASK调制的正弦波和经过BSPK调制的正弦波,通过开关可以选择波形,改变输出频率。各开关的控制功能如表 9-1和表 9-2所示。 |
<WRAP centeralign> | <WRAP centeralign> | ||
- | **表 9 1 波形选择控制** | + | **表 9-1 波形选择控制** |
</WRAP> | </WRAP> | ||
|输入端口|SW1 SW2|波形| | |输入端口|SW1 SW2|波形| | ||
行 14: | 行 14: | ||
<WRAP centeralign> | <WRAP centeralign> | ||
- | **表 9 2 频率选择控制** | + | **表 9-2 频率选择控制** |
</WRAP> | </WRAP> | ||
|输入端口|SW3 SW4|频率| | |输入端口|SW3 SW4|频率| | ||
行 25: | 行 25: | ||
\\ | \\ | ||
### 2. 实验原理 | ### 2. 实验原理 | ||
- | {{ :图9-1.png |图9 1 任意波形发生器原理图}} | + | {{ :图9-1.png |图9-1 任意波形发生器原理图}} |
<WRAP centeralign> | <WRAP centeralign> | ||
- | **图9 1 任意波形发生器原理图** | + | **图9-1 任意波形发生器原理图** |
</WRAP> | </WRAP> | ||
行 43: | 行 43: | ||
#### 3.1 程序架构 | #### 3.1 程序架构 | ||
程序的总体架构如图9 2所示,程序的顶层模块为arbty_wave。其中有四个模块Sine_wave、ASK_squwave、BPSK_squwave和tri_wave,分别生成正弦波、ASK正弦波、BPSK正弦波和三角波。通过一个多路选择器选择需要输出的波形,由输入信号wave_selc来控制。 | 程序的总体架构如图9 2所示,程序的顶层模块为arbty_wave。其中有四个模块Sine_wave、ASK_squwave、BPSK_squwave和tri_wave,分别生成正弦波、ASK正弦波、BPSK正弦波和三角波。通过一个多路选择器选择需要输出的波形,由输入信号wave_selc来控制。 | ||
- | {{ :图9-2.png |图9 2 程序架构}} | + | {{ :图9-2.png |图9-2 程序架构}} |
<WRAP centeralign> | <WRAP centeralign> | ||
- | **图9 2 程序架构** | + | **图9-2 程序架构** |
</WRAP> | </WRAP> | ||
行 59: | 行 59: | ||
</code> | </code> | ||
- | 程序中的四个模块发生器的结构非常类似,在此以正弦波为例介绍设计思路。 | + | 程序中的四个模块发生器的结构非常类似,在此以正弦波为例介绍设计思路。\\ |
#### 3.2 sine_wave模块 | #### 3.2 sine_wave模块 | ||
行 75: | 行 75: | ||
每一个周期的正弦波有100个采样点,原则上要在RAM中存储这100个采样点的幅度值,但是由于正弦波的前半个时钟周期和后半个时钟周期是对称的,因此只需要存储前面50个采样点的幅度值即可。后半个时钟周期采样点N的幅度值等于2000H-采样点(N-50)的幅度值。 | 每一个周期的正弦波有100个采样点,原则上要在RAM中存储这100个采样点的幅度值,但是由于正弦波的前半个时钟周期和后半个时钟周期是对称的,因此只需要存储前面50个采样点的幅度值即可。后半个时钟周期采样点N的幅度值等于2000H-采样点(N-50)的幅度值。 | ||
+ | {{ :图9-3.png |图9-3 正弦波形图}} | ||
+ | <WRAP centeralign> | ||
+ | **图9-3 正弦波形图** | ||
+ | </WRAP> | ||
+ | 在生成RAM前,先用matlab计算正弦波的幅度值: | ||
+ | <code verilog> | ||
+ | x=round(sin(linspace(0,pi,49))*5200); | ||
+ | for i=1:1:49 | ||
+ | y=x(i) | ||
+ | end | ||
+ | y= | ||
+ | 0 340 679 1014 1346 1671 1990 2300 | ||
+ | 2600 2889 3166 3429 3677 3910 4125 4324 | ||
+ | 4503 4664 4804 4924 5023 5100 5156 5189 | ||
+ | 5200 5189 5156 5100 5023 4924 4804 4664 | ||
+ | 4503 4324 4125 3910 3677 3429 3166 2889 | ||
+ | 2600 2300 1990 1671 1346 1014 679 340 | ||
- | \\ | + | </code> |
- | \\ | + | 在Quartus II中新建一个.mif文件,用于存储正弦函数的幅度值,这些值将初始到内部存储器中。在QuartusⅡ中新建.mif文件的过程为:File-〉New-〉Other Files-〉Memory Initialization File。将上述数据复制到.mif文件的表格中(图9 4),保存上述.mif文件为data_sine.mif。 |
- | ### 4. 仿真结果 | + | {{ :图9-4.png |图9-4 mif文件内容}} |
+ | <WRAP centeralign> | ||
+ | **图9-4 mif文件内容** | ||
+ | </WRAP> | ||
+ | 用Quartus II中的Mega Winzard定制一个单端口ROM,具体流程如下:\\ | ||
+ | 1) 点击Tools菜单栏下的“Megawizard Plug-in Wizard”选项,新建一个megafunction variation(图 9-5)。 | ||
+ | {{ :图9-5.png |图 9-5 新建megafunction variation}} | ||
+ | <WRAP centeralign> | ||
+ | **图 9-5 新建megafunction variation** | ||
+ | </WRAP> | ||
+ | 2) 选择ROM:1-PORT,设置器件类型为CycloneⅡ,输出文件类型为Verilog HDL,输入文件名sine,点击下一步(图9-6)。 | ||
+ | {{ :图9-6.png |图9-6 选择RAM类型}} | ||
+ | <WRAP centeralign> | ||
+ | **图9-6 选择RAM类型** | ||
+ | </WRAP> | ||
+ | 3) 定义存储器深度为50个字(word),存储器的深度为14bit。使用M4K存储器。点击下一步(图9-7)。 | ||
+ | {{ :图9-7.png |图9-7 设置RAM参数}} | ||
+ | <WRAP centeralign> | ||
+ | **图9-7 设置RAM参数** | ||
+ | </WRAP> | ||
+ | 4) 将新建的data_sine.mif文件导入至RAM中(图9-8)。 | ||
+ | {{ :图9-8.png |图9-8 导入mif文件}} | ||
+ | <WRAP centeralign> | ||
+ | **图9-8 导入mif文件** | ||
+ | </WRAP> | ||
+ | 5) 然后按finish完成了1-PORT ROM的定制。 | ||
+ | 在sine_wave模块中,计数器counter作为相位控制器来根据频率的来决定相位的变化。 | ||
+ | <code verilog> | ||
+ | module BPSK_sqwave(clk, clr, fre, bpsk_sq); | ||
+ | input clk; //时钟信号,50MHZ | ||
+ | input clr; //复位信号 | ||
+ | input [1:0]fre; //频率控制信号 | ||
+ | |||
+ | output [13:0]wave_si; //正弦波形输出 | ||
+ | reg [13:0]wave_si; | ||
+ | reg [5:0]index; //RAM地址 | ||
+ | //counter控制正弦波的相位,根据频率的不同控制相位的变化。 | ||
+ | reg [6:0]counter; | ||
+ | wire [13:0]q; | ||
+ | //正弦波幅度存储器,index和clk是输入,q为幅度输出。 | ||
+ | sine sine (index, clk ,q); | ||
+ | |||
+ | //phase_controller确定正弦波的相位counter。 | ||
+ | always @(posedge clk or negedge clr) begin : phase_controller | ||
+ | if(!clr) | ||
+ | counter<=7'b0; | ||
+ | else begin | ||
+ | case(fre) | ||
+ | 2'b00: begin //频率500KHz,每信号周期采样100个点。 | ||
+ | if(counter>=7'b110_0011) | ||
+ | counter<=7'b0; | ||
+ | else | ||
+ | counter<=counter+7'b1; //每时钟周期加1。 | ||
+ | end | ||
+ | 2'b01: begin //频率1MHz,每信号周期采样50个点。 | ||
+ | if(counter>=7'b110_0010) | ||
+ | counter<=7'b0; | ||
+ | else | ||
+ | counter<=counter+7'd2; //每时钟周期加2。 | ||
+ | end | ||
+ | 2'b10: begin //频率2MHz,每个信号周期采样25个点。 | ||
+ | if(counter>=7'b110_0000) | ||
+ | counter<=7'b0; | ||
+ | else | ||
+ | counter<=counter+7'd4; //每时钟周期加4。 | ||
+ | end | ||
+ | 2'b11: begin //频率5MHz,每信号周期采样10个点。 | ||
+ | if(counter>=7'b101_1010) | ||
+ | counter<=7'b0; | ||
+ | else | ||
+ | counter<=counter+7'd10; //每时钟周期加10。 | ||
+ | end | ||
+ | endcase | ||
+ | end | ||
+ | end | ||
+ | //index_controller控制RAM访问地址index,由于sine的对称性, | ||
+ | //当相位小于50时,index等于相位;当相位超过50时,相位减去50得到index。 | ||
+ | always @ (counter ) begin : index_controller | ||
+ | if(counter<=7'b011_0001) | ||
+ | index<=counter; | ||
+ | else | ||
+ | index<=counter-8'd50; | ||
+ | end | ||
+ | |||
+ | //由于对RAM的访问需要两个时钟周期,因此对相位counter延时2个时钟周期,得到 | ||
+ | //counter2,counter2和RAM的输出q同步。 | ||
+ | reg [6:0] counter1; | ||
+ | reg [6:0] counter2; | ||
+ | always @(posedge clk or negedge clr) begin | ||
+ | if(!clr) begin | ||
+ | counter1 <= 0; | ||
+ | counter2 <= 0; | ||
+ | end | ||
+ | else begin | ||
+ | counter1 <= counter; | ||
+ | counter2 <= counter1; | ||
+ | end | ||
+ | end | ||
+ | |||
+ | //wave_si_out产生正弦波波形输出。 | ||
+ | always @(posedge clk or negedge clr) begin : wave_si_out | ||
+ | if(!clr) begin | ||
+ | wave_si<=14'b0; | ||
+ | end | ||
+ | else begin | ||
+ | if( counter2<=7'd50 ) | ||
+ | wave_si<={1'b1,q}; //相位小于50时,将q信号加上2000h输出。加2000h的目的是2000h为正弦波的过零位置。 | ||
+ | else | ||
+ | wave_si<=14'h2000-q //相位大于50时,取的q值是counter2-50的幅度值,需要由过零值2000h减去q,得到对应的值。 | ||
+ | end | ||
+ | end | ||
+ | endmodule | ||
+ | |||
+ | </code> | ||
\\ | \\ | ||
\\ | \\ | ||
- | ### 5. 演示程序文件说明 | + | ### 4. 运行结果 |
+ | 图9-9到图9-12为通过SignalTap看到的运行结果,分别是正弦波、三角波、ASK调制波形和BPSK调制波形。 | ||
+ | {{ :图9-9.png |图9-9 SignalTap波形——正弦波}} | ||
+ | <WRAP centeralign> | ||
+ | **图9-9 SignalTap波形——正弦波** | ||
+ | </WRAP> | ||
+ | {{ :图9-10.png |图9-10 SignalTap波形——三角波}} | ||
+ | <WRAP centeralign> | ||
+ | **图9-10 SignalTap波形——三角波** | ||
+ | </WRAP> | ||
+ | {{ :图9-11.png |图9-11 SignalTap波形——ASK调制正弦波}} | ||
+ | <WRAP centeralign> | ||
+ | **图9-11 SignalTap波形——ASK调制正弦波** | ||
+ | </WRAP> | ||
+ | {{ :图9-12.png |图9-12 SignalTap波形——BPSK调制正弦波}} | ||
+ | <WRAP centeralign> | ||
+ | **图9-12 SignalTap波形——BPSK调制正弦波** | ||
+ | </WRAP> | ||
+ | 用逻辑分析仪观测波形时要注意,在Data栏右键点击wave信号,选择Bus Display Format→Unsigned Line Chart,这样可以更形象地考到波形输出。 | ||
+ | |||
+ | 此外,从SignalTap看到的波形是未经过D/A转换的数字波形图,用示波器连接到D/A芯片的输出管脚可以看到经过D/A转换后的模拟波形。 | ||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | ### 5. 程序文件说明 | ||
+ | |文件名|功能| | ||
+ | |arbty_wave.v|主程序| | ||
+ | |sin_wave.v|频率可调正弦波发生程序| | ||
+ | |tri_wave.v|频率可调三角波发生程序| | ||
+ | |Pwmtest.mpf|ModelSim仿真工程| | ||
+ | |ASK_sq.v|频率可调ASK调制正弦波发生程序| | ||
+ | |BPSK_sq.v|频率可调BPSK调制正弦波发生程序| | ||
\\ | \\ | ||
\\ | \\ | ||
### 6. 演示程序使用 | ### 6. 演示程序使用 | ||
+ | 演示设备要求:核心板,扩展板。 | ||
+ | |||
+ | 演示步骤:把程序下载到开发板上之后,配置好逻辑分析仪,通过逻辑分析仪观察输出结果。通过扩展板上的按键可观察到波形的变化,通过拨动SW1、SW2,可观察到波形的改变;通过波动SW3、SW4,可观察到波形频率的改变。 | ||