差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
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,可观察到波形频率的改变。