用ila核来看信号波形,从图中可以看出,实现了2ASK信号的调制与解调。解调信号虽然有一定的延时,但结果正确。这个延时是因为判别模块的判别时刻较信号开始时刻延时5个时钟周期,所以解调信号就如图中那样。
1.4总结
在本文设计中遇到的主要问题的2ASK解调部分的实现,开始是用计数法实现解调,虽然可以正确的解调,但其有很大的局限性:如果一个系统设计好了只限于特定的信号的解调(即每个信号的长度是一个特定数字)。为了克服这一弊端,之后想到用同步采样解调法,实现的时候要考虑到载波时钟的同步(文中使用的DPLL数字锁相环来实现的)。
完成本文设计需要对通信原理调制解调特别是2ASK的原理及相关知识点要非常熟练,同时本文是建立在对FPGA熟练使用基础上,这就需要大家对数字电路和FPGA设计很熟悉。
2ASK分析方法是最基本的,也是其他数字调制的理论基础。此次重在学习2ASK调制解调的原理方法的基础上实现简单的数字载波的2ASK的调制解调。结合本文所做的工作,后续还需要完善的地方是:
1. 模拟高频载波:调制信号用正弦信号,对整个ASK原理理解是非常好的,也便于对整个数字调制解调系统的理解。
2.本次ASK调制解调只涉及到二进制的方案,当然还有多进制振幅键控(MASK)调制解调需要后续完成(提高信息传输速率),特别是典型的四进制振幅键控(QASK)。
16
1.5 思考题
1. 除了文中提到的以及实现方式,还有没有其他的实现方式? 2. 结合文中解调方案中,是否可以把计数器法解调不限制与信号的固定长度?
3. 本文只是2ASK的一个功能实现,如果应用的实际的调制解调电路中还有哪些需要考虑?
4. 2ASK性能指标主要有哪些,如何在实际电路中提高这些性能? 5. 2ASK调制解调与其他数字调制解调的思想共同点有哪些?
17
1.6 参考文献
[1] EDA先锋工作室.薛小刚,葛毅敏.Xilinx ISE 9.x FPGA/CPLD设计指南
[M] .北京:人民邮电出版社,2007.
[2] 樊昌信,徐炳祥,吴成柯等.通信原理(第5版)[M]. 北京:国防工
业出版社,2001.
[3] 常红霞.基于FPGA的QDPSK调制解调技术的研究及实现.中国期刊网,
2007.
[4] Samir Palnitkar,夏宇闻,胡燕祥等.Verilog HDL数字设计与综合(第
二版)[M].北京:电子工业出版社,2004. [5] FPGA.xst.pdf .www.xilinx.com.2007.
[6] Xilinx.Virtex-2 User Guide.www.xilinx.com,2007.
18
附录:DPLL的verilog代码
1.顶层模块
module Dpll(fin,fout,se,clk,reset,enable,Kmode); input fin,clk;
input reset,enable; //reset高电平复位,enable高电平有效 input [2:0]Kmode; //滤波计数器的计数模值设定 output fout; //fout是锁频锁相输出 output se; wire idout,ca,bo; wire [14:0]N;
xor_pd u1(.a(fin),.b(fout),.y(se));
kcounter u2(.Kclock(clk),.reset(reset),.dnup(se),.enable(enable), .Kmode(Kmode),.carry(ca),.borrow(bo));
idcounter u3(.IDclock(clk),.reset(reset),.inc(ca),.dec(bo), .IDout(idout));
counter_N u4(.clk(clk), .fin(fin), .reset(reset), .count_N(N)); div_N u5(.clkin(idout),.n(N),.reset(reset),.clkout(fout)); endmodule
2.异或鉴相器
module xor_pd(a,b,y);//异或门鉴相器 input a,b; output y; reg y;
always @(a or b) begin y=a^b; end endmodule
19
3.加减脉冲计数器
module kcounter(Kclock,reset,dnup,enable,Kmode,carry,borrow); input Kclock; //系统时钟信号
input reset; //全局复位信号,高电平复位 input dnup; //鉴相器输出的加减控制信号 input enable; //可逆计数器计数允许信号,高电平有效 input [2:0]Kmode; //计数器模值设置信号 output carry; //进位脉冲输出信号 output borrow; //借位脉冲输出信号 wire carry,borrow; reg [8:0]Count; //可逆计数器 reg [8:0]Ktop; //预设模值寄存器
//根据计数器模值设置信号Kmode来设置预设模值寄存器的值 always @(Kmode) begin
case(Kmode) 3'b001:Ktop<=7; 3'b010:Ktop<=15; 3'b011:Ktop<=31; 3'b100:Ktop<=13; 3'b101:Ktop<=127; 3'b110:Ktop<=255; 3'b111:Ktop<=511; default:Ktop<=15; endcase end
//根据鉴相器输出的加减控制信号dnup进行可逆计数器的加减运算 always @(posedge Kclock or posedge reset) begin if(reset)
20