重庆邮电大学本科毕业设计(论文)
表3-1 无符号数与有符号数的对应关系
无符号数 0 1 2 … 127 128 129 … 254 255
二进制码 0000 0000 0000 0001 0000 0010 … 0111 1111 1000 0000 1000 0001 … 1111 1110 1111 1111 16进制码 00 01 02 … 7F 80 81 … FE FF 有符号数 0 +1 +2 … +127 -128 -127 … -2 -1 顶层模块源代码
//顶层模块
module top(clk, //系统时钟 rst, //复位 en, //使能信号 data_in, //1bit信号输入 data_out, //16QAM信号输出 DATA_I, //I路对应的量化值 DATA_Q); //Q路对应的量化值 input clk,rst,en; input data_in;
output signed[17:0] data_out;
output signed [3:0] DATA_I,DATA_Q;
wire clk_dds; //DDS块的输入时钟 wire clk_100; //100kbs wire clk_400; //25kbs wire [3:0] data1; wire [3:0] data2; clk clkqam(
.clk_sys(clk), .rst(rst),
.clk_dds(clk_dds), .clk_100(clk_100), .clk_400(clk_400) ); shift shiftqam(
.clk_in(clk_100),
- 11 -
重庆邮电大学本科毕业设计(论文)
.clk_out(clk_dds), .data_in(data_in), .rst(rst), .en(en),
.data_out(data1) ); diff diffqam(
.clk(clk_dds), .rst(rst),
.data_in(data1),
.data_out_i(DATA_I), .data_out_q(DATA_Q), .data(data2) ); add addqam (
.clk_dds(clk_dds), .rst(rst), .en(en), .data(data2),
.dataout(data_out) ); Endmodule
第二节 串/并转换模块
1bit的数据送过来后,通过串并变换,将输入的第一个数据同它后面的三个数据同时输出,形成4bit的并行信号。
串/并转换模块有五个输入端口和一个输出端口。系统首先将输入的第一个数据同它后面的三个数据同时输出,然后形成4bit的并行信号输出。
实际运行中各路信号经串并转换之后,并行输出的每一路码元传输速率降为了原来的四分之一,这也正是实际运应中所要求的。和假设不同的是每一路输出信号前边都多了一个0码元单位,这是由于延迟模块所造成的。当然它们在这里同时被延迟了一个单元,但对后面各种性能的研究是不会造成影响的。
串/并转换模块源代码
//串/并转换模块
module shift (clk_in, //写入信号的时钟
- 12 -
重庆邮电大学本科毕业设计(论文)
clk_out, //输出信号的时钟 data_in, //输入信号 data_out, // 输出信号 rst, en);
input clk_in,clk_out,rst,en; input data_in;
output reg [3:0] data_out; reg [3:0] dout;
always @(posedge clk_in or posedge rst) begin if(rst) begin
dout<=0; end else begin
if(en) begin
dout<={dout[2:0],data_in}; end else
dout<=dout; end end
always @ (posedge clk_out or posedge rst) begin
if(rst)
data_out<=0; else
data_out<=dout; end
endmodule
第三节 DDS载波和线性加法器模块
首先制作正弦发生器内存数据,即LPM_ROM宏模块所需的用于存放正弦波的波形数据表。Quartus II软件能利用的ROM宏单元初始化文件格式为*.mif,mif文件有两种生成方式,第一种是在Quartus II主界面下选择File-New-Other Files-Memory Initialization file,弹出ROM数据编辑对话框,然后编辑对话框中ROM地址对应的数据值来生成mif文件,第二种方法是由程序自动生成。这里用
- 13 -
重庆邮电大学本科毕业设计(论文)
C语言编写了一个生成具有256个数据,数据宽度为8的程序。将C程序编译后,在DOS环境下进入C工程所在文件夹,键入如下命令:工程1>sine.mif 即可生成sine.mif的数据文件,再参照*.mif文件的头尾格式,添加图3.2所示的头和尾。
图 3.2 mif数据文件头尾格式
DDS是现代信号处理中一项关键的的数字化技术,DDS是直接数字频率合成的缩写,相比传统的频率合成器DDS具有低成本,低功耗,高分辨率和转换时间快等特点,广泛应用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。
一块DDS一般包括频率控制寄存器,高速相位累加器和正弦计算器三个部分,频率控制寄存器可以串行或并行的方式装载并寄存用户输入的频率控制码;而相位累加器根据dds频率控制码在每个时钟周期内进行相位累加,得到一个相位值;正弦计算器则对该相位值计算数字化正弦波幅度(芯片一般通过查表得到)。DDS芯片输出的一般是数字化的正弦波,因此还需经过高速D/A转换器和低通滤波器才能得到一个可用的模拟频率信号。
DDS有如下优点:
1、频率分辨率高,输出频点多,可达2的N次方个频点(N为相位累加器位数);
2、频率切换速度快,可达us量级; 3、频率切换时相位连续; 4、可以输出宽带正交信号;
5、输出相位噪声低,对参考频率源的相位噪声有改善作用; 6、可以产生任意波形;
7、全数字化实现,便于集成,体积小,重量轻。
- 14 -
重庆邮电大学本科毕业设计(论文)
在各行各业的测试应用中,信号源扮演着极为重要的作用。但信号源具有许多不同的类型,不同类型的信号源在功能和特性上各不相同,分别适用于许多不同的应用。目前,最常见的信号源类型包括任意波形发生器,函数发生器,RF信号源,以及基本的模拟输出模块。信号源中采用DDS技术在当前的测试测量行业已经逐渐称为一种主流的做法。
典型的DDS函数发生器:一个完整周期的函数波形被存储在上面所示的存储器查找表中。相位累加器跟踪输出函数的电流相位。为了输出一个非常低的频率,采样样本之间的差相位(Δ)将非常小。例如,一个很慢的正弦波可能将有1度的Δ相位。则波形的0号采样样本采得0度时刻的正弦波的幅度,而波形的1号采样将采得1度时刻的正弦波的幅度,依次类推。经过360次采样后,将输出正弦曲线的全部360度,或者确切地说是一个周期。一个较快的正弦波可能会有10度的Δ相位。于是,36次采样就会输出正弦波的一个周期。如果采样率保持恒定,上述较慢的正弦波的频率将比较快的正弦波慢10倍。进一步说,一个恒定的Δ相位必将导致一个恒定正弦波频率的输出。但是,DDS技术允许通过一个频率表迅速地改变信号的Δ相位。函数发生器能够指定一个频率表,该表包括由波形频率和持续时间信息组成的各个段。函数发生器按顺序产生每个定义的频率段。通过生成一个频率表,可以构建复杂的频率扫描信号和频率跳变信号。DDS允许函数发生器的相位从一级到另一级连续变化。矢量信号发生器提供高灵活度和强大的解决方案,可用于科学研究,通信,消费电子,宇航/国防,半导体测试以及一些新兴领域,如软件无线电,无线电频率识别( RFID),以及无线传感网络等。有些公司还提供许多其他利用DAC来产生模拟信号的模拟输出产品。模拟输出板的基本架构是,将一个小型的FIFO存储器连接到一个DAC上。绝大部分的模拟输出板被用来产生静态电压,而且许多可以被用来产生低频波形。
根据FPGA实际情况和DDS原理,我们决定不用额外的芯片来产生载波,而直接利用FPGA本身的资源来实现,从FPGA芯片资料上可以看到,芯片内部有165888bit的ram存储器,如果我们利用这些存储器将dds的数据存到芯片中,在设置好地址,那将可以实现专门dds芯片的功能,同时还能节约成本,而且数据在内部生成,也便于我们对其进行处理,同时FPGA本身有其独特的优势,使得我们产生载波有了比利用芯片更大的自由度和灵活度,这给设计人员带来了极大的方便。由于我们所需要的载波为1M,系统的时钟频率为50M,rom中的数据最多为64位,为了产生1M的载波分析如下:
如果将dds的64个数据完全取出使用,则一个周期需要取64此数据,而时钟频率为50M所以这样产生的载波频率为50/60M,不足我们所需要的,这时我们可以通过一些处理如锁相环等等让其变成1M的频率,但是这样无疑是增加了
- 15 -