重庆邮电大学本科毕业设计(论文)
ADD_A<=0; else if(we)
ADD_A<=data; end
always@(posedge clk or negedge reset) begin if(~reset) ADD_B<=0; else if(ce)
ADD_B=ADD_B+ADD_A; end
always@(posedge clk or negedge reset) begin if(~reset) cose_DR<=0; else if(ce)
cose_DR<=cose_D-255/2; end
always@(posedge clk or negedge reset) begin if(~reset) sine_DR<=0; else if(ce)
sine_DR<=sine_D-255/2; end
rom_cose cose1( .address(ROM_A), .clock(clk), .q(cose_D));
rom_sine sine1(
- 36 -
重庆邮电大学本科毕业设计(论文)
.address(ROM_A), .clock(clk), .q(sine_D));
Endmodule
// 模块名称:no(反相模块)
// 功能描述:将-sin载波所携带的基带信号反相为正 module no(i,o); output [1:0]o; input [1:0]i; assign o=~i; endmodule
// 模块名称:fwordrom(频率字存储模块) // 功能描述:存储频率字值 module fwordrom(fword); output [15:0]fword;
assign fword=16'b0001100110011001; endmodule
第四节 乘法器模块设计
传统二进制乘法器的设计一般采用串行的设计结构和流水线设计结构,对于一个计算两个N位二进制数x、y乘积的串行乘法器,其设计思路为:
P?xy??xk2kykk?0N?1 (4.4)
输入量随k位置的连续变化对xk2kyk进行累加,实现二进制乘法。对流水线乘法器而言,通常采用逐位并行的迭代阵列结构将每个输入数据的N位都并行地提交给乘法器。但对于FPGA来讲,一般来说进位的速度快于加法的速度,因此这种并行阵列结构并不是最优的。如果采用多级流水线的形式,将相邻的两个部分乘积结果再加到最终的输出乘积上,即排成一个二叉树形式的结构,对于N位乘法器,就只需要log2(N)级来实现。一个8位乘法器结构图如图4.2所示。
- 37 -
重庆邮电大学本科毕业设计(论文)
图4.2 流水线乘法器结构
而在实际实现过程中,verilog语言编程实现乘法器模块不仅工作量大,而且在处理高速数据时往往效果不够好。而使用Altera Quartus II 的IP核中的乘法器模块就能达到事半功倍的效果。本文中乘法器设计采用的是Quartus II软件自带参数化模块库里的LPM_MULT 模块。LPM_MULT IP core可以完成有符号数及无符号数的乘法,还能完成输出数据的位宽截取,支持流水线操作,支持片内DSP单元的使用,功能强大。而且乘法器IP core对其自身的速率和所占资源都有一定的优化,因此采用IP core设计对减少工作量和减少系统资源占用都有很大的帮助。
由于接收到的16QAM信号经混频之后的信号为基带信号和2倍载波频率的高频分量之和,因此混频后的信号需经过低通滤波,采样判决和电平转换把基带信号还原出来。因此解调模块分为三个子模块:低通滤波器、采样判决器和电平转换器。
第四节 低通滤波器模块设计
由于系统只要求将高频分量滤除,这里采用相对简单而易实现的FIR低通滤波器。FIR滤波器由有限个采样值组成,在每个采样时刻完成有限个卷积运算,可以将其幅度特性设计成多种多样,同时还可以保证精确、严格的相位特性。在高阶滤波器中,还可以通过FFT来计算卷积,从而极大提高运算效率。这些优点使得FIR滤波器得到广泛应用[9]。
FIR滤波器只存在N个抽头h(n),N也被称为滤波器的阶数,则滤波器的输出可以通过卷积的形式表示为:
? x y (n ) ( n )* h ( n ) ? h ( k ) x (n ? k ) (4.5) ?i?0N?1FIR滤波器实现的基本方法是用一个有限级数的傅里叶变换去逼近所要求的
- 38 -
重庆邮电大学本科毕业设计(论文)
滤波器响应,基本设计方法可以分为窗口法和频率采样法两种。本次设计选用窗口法设计FIR滤波器,其设计步骤如下:
①确定数字滤波器的性能要求:截止频率Fc,滤波器单位脉冲响应长度N。 ②根据性能要求,合理选择单位脉冲响应h(n)的奇偶对称性,从而确定理想频率响应Hd(ej?)的幅频特性和相频特性。
③得到单位脉冲响应Hd(ej?)后,在实际计算中,可对Hd(ej?)按M(M远大于N)点等距离采样,并对其求IDFT得hm(n),用hm(n)代替hd(n)。
④选择适当的窗函数w(n),根据h(n)?hm(n)w(n)求所需设计的FIR滤波器单位脉冲响应。
⑤求H(ej?),分析其幅频特性,若不满足要求,可适当改变窗函数形式或长度N,重复上述设计过程,以得到满意结果。
其中,选取的窗函数为布莱克曼窗:
2?n4?nw(n)?[0.42?0.5cos()?0.08cos() (4.6) )] R N (n
N?1N?1
由于整个设计中,基带信号频率不超过200Hz,载波频率5MHz,因此设置滤波器截止频率Fc?300Hz,阶数N?32,采样频率为FPGA时钟频率50M,采用Quartus II软件的IP core进行设计。
第五节 采样判决模块设计
采样判决模块采用的是门限的思路设计,即当输入电平的二进制数值处于某门限范围之内时,将此电平值判断为此门限范围内的某一特定值。由于16QAM的I、Q两路中任意一路都载有4种电平值,因此设计三个电平门限值,将8位总线数值区间分成4等份,然后将时钟信号进行分频,每间隔特定时间段就对输入信号进行采样和判决。流程图如图4.3。
- 39 -
重庆邮电大学本科毕业设计(论文)
采样取值 N Y 门限区间1 N Y 门限区间2 N 门限区间3 N 电平值4
电平值1 电平值2 Y 电平值3 图4.3 采样判决设计流程图
电平值转化模块源代码
// 模块名称:decision(采样判决模块)
// 功能描述:将滤波器输出电平值转化为译码所需电平值 module decision(clk,b,l); input clk;
input unsigned[7:0]l; output [2:0]b; reg [2:0]r; reg [1:0]r0; reg [1:0]count; assign b=r;
always@(posedge clk) begin
count=count+1; r0=l/64; case(count) 3'b10: case(r0)
- 40 -