最新日志

发表于:2008-5-15 16:09:43
标签:无标签

0

基于FPGA的多进制振幅键控(MASK)

基于FPGA的多进制振幅键控(MASK

 

ASK--又称幅移键控法。载波幅度是随着调制信号而变化的。其最简单的形式是,载波在二进制调制信号控制下通断, 这种方式还可称作通-断键控或开关键控(OOK)

MASK,又称多进制数字调制法。在二进制数字调制中每个符号只能表示01(+1-1)。但在许多实际的数字传输系统中却往往采用多进制的数字调制方式。与二进制数字调制系统相比,多进制数字调制系统具有如下两个特点: 第一:在相同的信道码源调制中,每个符号可以携带log2M比特信息,因此,当信道频带受限时可以使信息传输率增加,提高了频带利用率。但由此付出的代价是增加信号功率和实现上的复杂性。 第二,在相同的信息速率下,由于多进制方式的信道传输速率可以比二进制的低,因而多进制信号码源的持续时间要比二进制的宽。加宽码元宽度,就会增加信号码元的能量,也能减小由于信道特性引起的码间干扰的影响等。

 

以下是2ASK的调制波形:(点击看大图)

点击看大图 

       由仿真波形可以看到,发送的码元依次为10 11 01 00 01 11 00 10 10 11,从调制后波形看一看到,输出的波形与发送的码元相对应。11时振幅最大,00时振幅最小(为零)。

 

Verilog代码:

 

//顶层模块

module mask_top(clk,rst,en,maskout,rdymask);

input clk;

input rst;

input en;

output[15:0] maskout;

output rdymask;

 

wire coen;//基带信号发送使能,高有效

wire[1:0] codein;//发送2bit基带码元

wire[15:0] sin_out,cos_out;

wire ce;//正余弦发生器使能信号

wire[15:0] pha;//正弦发生器相位

wire clk_80;//主时钟的40分频信号

wire rdy;

 

clkfenpin clkfenpin(clk,rst,clk_80);

codesource          codesource(clk_80,rst,en,codein,coen);

phase    phase(clk,rst,coen,pha,ce);

cos        cos(pha,clk,ce,cos_out,sin_out,rdy); //调用了ISEIP Core生成正弦函数

mask     mask(clk,rst,codein,sin_out,rdy,maskout,rdymask);

 

endmodule

 

 

//时钟80分频模块

module clkfenpin(clk,rst,clk_80);

input clk;

input rst;

output clk_80;

 

reg[5:0] num;

reg clk_80;

 

always @ (posedge clk)

begin

       if(rst) begin num <= 6'd0; clk_80 <= 0; end

       else

       begin

              num <= num+1;

              if(num==6'd39) begin num <= 6'd0; clk_80 <=~clk_80; end

       end

end

 

endmodule

 

 

//基带码元产生模块

module codesource(clk,rst,en,codein,coen);

input clk;

input rst;

input en;

output[1:0] codein;//发送2bit基带码元

output coen;

 

reg coen;

reg[1:0] codein;

reg[15:0] source;//从高到低连续发送该16bit码元信号(两个码元为一组发送)

reg[3:0] num;

 

always @ (posedge clk or posedge rst)

begin

       if(rst)

       begin

              source <= 16'b1011010001110010;

              codein <= 1'bx;

              num <= 4'b1111;

              coen <= 0;

       end

       else if(en)

       begin

              coen <= 1;

              codein <= {source[num],source[num-1]};

              num <= num-2;

       end

       else

       begin

              source <= 16'b1011010001110010;

              codein <= 1'bx;

              num <= 4'b1111;

              coen <= 0;

       end

end

 

endmodule

 

 

//相位变化模块

module phase(clk,rst,coen,pha,ce);

input clk;

input rst;

input coen;

output ce;

output[15:0] pha;

 

reg ce;

reg[15:0] pha;

 

always @ (posedge clk)

begin

       if(rst) begin pha <= 16'h9b80; ce <= 0; end

       else if(coen)

       begin

              ce <= 1;

              pha <= pha+16'h0506;

              if((pha<16'h8000)&&(pha>16'h6087)) begin pha <= 16'h9b80; end

       end

       else begin pha <= 16'h9b80; ce <= 0; end

end

 

endmodule

 

 

//调制模块

module mask(clk,rst,codein,sin_out,rdy,maskout,rdymask);

input clk;

input rst;

input rdy;

input[1:0] codein;

input[15:0] sin_out;

output[15:0] maskout;

output rdymask;

 

reg[1:0] code0,code;

reg rdymask;

reg[15:0] maskout;

 

always @ (posedge clk)

begin

       if(rst) begin maskout <= 16'dx; rdymask <= 0; end

       else if(rdy)

       begin

              rdymask <= 1;

              case(code)

                     2'b00: maskout <= 16'h0000;

                     2'b01: maskout <= {sin_out[15],sin_out[15],sin_out[15:2]};

                     2'b10: maskout <= {sin_out[15],sin_out[15:1]};

                     2'b11: maskout <= {sin_out[15],sin_out[15],sin_out[15:2]}+{sin_out[15],sin_out[15:1]};

                     default maskout <= 16'dx;

                     endcase

       end

       else rdymask <= 0;

 

       code0 <= codein;

       code <= code0;

end

 

endmodule

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 原创

评论(0) | 阅读(24)
发表于:2008-5-12 13:56:27
标签:无标签

1

基于FPGA的FSK调制

基于FPGAFSK调制:

   点击下载

 

       至于FSK调制原理就不多说了,这里做的一个实验是二进制频移键控。发送一组码元,通过响应的键控电路监测是发1还是发0然后选择频率控制正余弦电路波形。

 

       功能仿真波形如下:(点击看大图)

 

点击看大图

 

       可以看到,codein信号是基带码元,它发送的是1010110001,而在输出端分别用正弦和余弦进行调制。cos_outsin_out的波形与原始码元基本一致,不同码元衔接处出现较大的跳变是因为采样的频率不够高造成的。1的调制频率是0的调制频率的两倍。

 

Verilog程序:

 

module fsktop(clk,rst,en,cos_out,sin_out,rdy);

input clk;

input rst;

input en;

output[15:0] cos_out;

output[15:0] sin_out;

output rdy;

 

wire codein;//发送基带码元

wire a_en,b_en;//FSK调制频率选择使能信号

wire ce;//正余弦发生器使能信号

wire[15:0] a_fre,b_fre,fre;

wire clk_40;//主时钟的40分频信号

 

clkfenpin clkfenpin(clk,rst,clk_40);

codesource          codesource(clk_40,rst,en,codein);

coding   coding(clk,rst,codein,a_en,b_en,ce,a_fre,b_fre,fre);

a_frequency a_frequency(clk,rst,a_en,a_fre);

b_frequency        b_frequency(clk,rst,b_en,b_fre);

cos        cos(fre,clk,ce,cos_out,sin_out,rdy);

 

endmodule

 

 

module clkfenpin(clk,rst,clk_40);

input clk;

input rst;

output clk_40;

 

reg[4:0] num;

reg clk_40;

 

always @ (posedge clk)

begin

       if(rst) begin num <= 5'd0; clk_40 <= 0; end

       else

       begin

              num <= num+1;

              if(num==5'd19) begin num <= 5'd0; clk_40 <=~clk_40; end

       end

end

 

endmodule

 

 

module codesource(clk_40,rst,en,codein);

input clk_40;

input rst;

input en;

output codein;//发送基带码元

 

reg codein;

reg[15:0] source;//从高到低连续发送该16bit码元信号

reg[3:0] num;

 

always @ (posedge clk_40)

begin

       if(rst)

       begin

              source <= 16'b1010110001110010;

              codein <= 1'bx;

              num <= 4'b1111;

       end

       else if(en)

       begin

              codein <= source[num];

              num <= num-1;

       end

       else

       begin

              source <= 16'b1010110001110010;

              codein <= 1'bx;

              num <= 4'b1111;

       end

end

 

endmodule

 

 

module coding(clk,rst,codein,a_en,b_en,ce,a_fre,b_fre,fre);

input clk;

input rst;

input codein;

input[15:0]     a_fre,b_fre;

output[15:0] fre;

output a_en,b_en;

output ce;

 

reg a_en,b_en;

reg ce;

reg[15:0] fre;

 

always @ (posedge clk)

begin

       if(rst)

       begin

              a_en <= 0;

              b_en <= 0;

              ce <= 0;

              fre <= 16'd0;

       end

       else if(!codein)      //基带码元为0时,选择a_fre为输出频率

       begin

              fre <= a_fre;

              a_en <= 1;

              b_en <= 0;

              ce <= 1;

       end

       else if(codein)       //基带码元为1时,选择b_fre为输出频率

       begin

              b_en <= 1;

              a_en <= 0;

              ce <= 1;

              fre <= b_fre;

       end

       else

       begin

              a_en <= 0;

              b_en <= 0;

              ce <= 0;

              fre <= 16'd0;

       end

end

 

endmodule

 

 

module a_frequency(clk,rst,a_en,fre);

input clk;

input rst;

input a_en;

output[15:0] fre;

 

reg[15:0] fre;

 

always @ (posedge clk)

begin

       if(rst) begin fre <= 16'h9b82; end      //-pi

       else if(a_en)

       begin

              if((fre<16'h8000)&&(fre>16'h6087)) fre <= 16'h9b82;

              else fre <= fre+16'h0506;

       end

       else begin fre <= 16'h9b82; end

end

 

endmodule

 

 

module b_frequency(clk,rst,b_en,fre);

input clk;

input rst;

input b_en;

output[15:0] fre;

 

reg[15:0] fre;

 

always @ (posedge clk)

begin

       if(rst) begin fre <= 16'h9b82; end        //pi

       else if(b_en)

       begin

              if((fre<16'h8000)&&(fre>16'h6087)) fre <= 16'h9b82;

              else fre <= fre+16'h0a0c;  

       end

       else begin fre <= 16'h9b82; end

end

 

endmodule

 

 

调用了IP Core中的cos_sin生成函数。

 

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 原创

评论(0) | 阅读(112)
发表于:2008-5-11 20:51:23
标签:无标签

1

基于FPGA的高斯滤波器设计

点击下载基于FPGAGMSK调制

之高斯滤波器设计

 

       先生成一个50kbps码率的源(带宽为25KHz),码元1编码成7FFFH+1)发送,码元0编码成80000H-1)发送。利用SystemView制作一个采样频率为500KHz的低通高斯滤波器,把生成的21阶滤波器系数做成.coe文件(如IIR filterdatasheet要求)加载到IP Core中生成所需低通滤波器。

       最后将码元通过高斯滤波器进行滤波。

 

SystemView生成的高斯滤波器时域波形图:

 

 

SystemView生成的高斯滤波器频域波形图:

点击看大图

  

 

功能仿真波形如下。连续发送的码元为1011101001010101,最后通过高斯滤波后得到的平滑的波形如下,与原始码元型号一一对应。

点击看大图

 

 

       布局布线后仿真的波形如下。可以看到有明显的毛刺。

点击看大图 

 

Verilog程序:

 

module gmsktop(CLK,clk_50,RST,RDY,dout);

input CLK;//主时钟信号,500KHz

input clk_50;//50KHz时钟信号

input RST;

//input ND;

output RDY;

output[33:0] dout;

 

wire ND,RFD;

wire[15:0] source;

 

sent_source sent_source(clk_50,RST,ND,RFD,source);

gsfir gsfir(ND,RDY,CLK,RST,RFD,source,dout);

 

endmodule

 

 

module sent_source(clk_50,RST,ND,RFD,source);

input clk_50;//50KHz时钟信号

input RST;//复位信号,高电平有效

input RFD;

output[15:0] source;//1bit基带信号,16bit表示

output ND;

 

reg[15:0] source;

reg[15:0] scode;

reg[3:0] num;

reg ND;

 

always @(posedge clk_50)

begin

       if(RST)

       begin

              ND <= 0;

              source <= 16'd0;

              num <= 4'b1111;

              scode <= 16'b1011101001010101;

       end

       else if(RFD)

       begin

              if(scode[num]) begin source <= 16'h7fff; end

              else begin source <= 16'h8000; end

              ND <= 1;

              num <= num-1;

       end

       else ND <= 0;

end

 

endmodule

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 原创

评论(0) | 阅读(132)
发表于:2008-5-9 14:59:01
标签:无标签

1

利用有限状态机进行复杂时序逻辑的设计

 

利用有限状态机进行复杂时序逻辑的设计:

 

目的:掌握利用有限状态机实现复杂时序逻辑的方法。

在数字电路中我们已经学习过通过建立有限状态机来进行数字逻辑的设计,而在Verilog HDL硬件描述语言中,这种设计方法得到进一步的发展。通过Verilog HDL提供的语句,我们可以直观地设计出适合更为复杂的时序逻辑的电路。关于有限状态机的设计方法在教材中已经作了较为详细的阐述,在此就不赘述了。

下例是一个简单的状态机设计,功能是检测一个5位二进制序列“10010”。考虑到序列重叠的可能,有限状态机共提供8个状态(包括初始状态