endcase end
// 下面实现载波产生
always@(posedge clk) begin
if(reset) begin cnt<=2'b00; carriers<=0; end else if(en) cnt<=cnt+1; carriers<=~cnt[1]; end
assign modata=sig_S&carriers;
endmodule
程序的前面一部分是产生01信号,后面的是产生载波,然后是使01信号和载波相乘,实现了调制。
1.3.3 2ASK解调部分代码设计
module ASK_two(clk,en,reset,Kmode,carriers,pll_carriers,modata,demodata);
input clk,reset,en; input modata,carriers; input [2:0]Kmode;
output demodata,pll_carriers;
reg demodata;
Dpll u1(.fout(pll_carriers), .se(), .clk(clk), .reset(reset), .enable(en),
.Kmode(Kmode), .fin(carriers) );
always@(negedge pll_carriers) begin if(reset)
11
demodata<=0; else begin
if(!modata)
demodata<=0; else demodata<=1; end end endmodule
为了使提高解调采样数据的准确性,这里用数字锁相环Dpll对载波相位锁定后,用pll_carriers下降沿正好是在modata数据比特的中心采样,能够减少解调的误码率。(DPLL的Verilog代码作为附件放在最后面)。
1.3.4功能仿真
1)调制部分代码的功能仿真
图1-9 调制部分功能仿真
如图3-4所示,sig_S为01信号,modata为调制后的信号,观察波形,很容易可以验证仿真结果正确
2)整体的功能仿真
整体的功能仿真是通过顶层模块调用调制模块和解调模块,实现整体的仿真。
顶层模块代码如下:
module
ASK_ding(clk,reset,en,sig_S,Kmode,mo_rdy,carriers,pll_carriers,modata,demodata);
input clk,reset,en; input [2:0]Kmode; output sig_S;
12
output carriers,pll_carriers; output modata; output mo_rdy; output demodata;
two_ASK U_mo ( .clk(clk), .reset(reset), .en(en),
.sig_S(sig_S), .out_rdy(mo_rdy), .carriers(carriers), .modata(modata) );
ASK_two U_demo ( .clk(clk), .en(en),
.Kmode(Kmode), .reset(reset),
.carriers(carriers), .modata(modata),
.pll_carriers(pll_carriers), .demodata(demodata) );
Endmodule
对顶层模块进行仿真,结果如图3-5
图1-10 整体功能仿真
其中cnt为时钟计数器,k为调制信号计数器,sig_S为01信号,modata为已调信号,demodata为解调后信号,观察上图,可知道代码仿真正确,实现了2ASK的调制解调。
13
1.3.5 板上调试
板上调试代码如下:
module
ASK_ding_chipscope(clk,sig_S,mo_rdy,carriers,pll_carriers,modata,demodata
); input clk; output sig_S;
output carriers,pll_carriers; output modata; output mo_rdy; output demodata;
wire reset,en; wire[2:0]Kmode;
//for chipscope
wire [35:0] control0; wire [35:0] control1; wire [4:0] async_out; wire [4:0] mydata;
assign reset=async_out[0]; assign en=async_out[1];
assign Kmode[2:0]=async_out[4:2];
assign mydata[0]=sig_S; assign mydata[1]=carriers; assign mydata[2]=pll_carriers; assign mydata[3]=modata; assign mydata[4]=demodata;
ASK_ding ask(.clk(clk), .reset(reset), .en(en), .sig_S(sig_S), .Kmode(Kmode), .mo_rdy(mo_rdy), .carriers(carriers), .pll_carriers(pll_carriers), .modata(modata), .demodata(demodata) );
14
my_icon icon(.CONTROL0(control0), .CONTROL1(control1) );
my_ila ila(.CONTROL(control0), .CLK(clk), .DATA(mydata), .TRIG0(carriers) );
my_vio vio(.CONTROL(control1),
.ASYNC_OUT(async_out) ); Endmodule
板上调试需要添加三个核,icon,vio和ila,需要添加clk的引脚约束,如图1-11
图1-11 clk引脚约束
添加完约束后可以通过ise进行实现和产生bit流文件,下载到V-2板上便可进行chipscope在线调试。调试结果如下
Vio核波形
图1-12 vio核波形
这里使用vio核主要是想看各个使能端口信号的作用和做开关模拟操作。经检验,结果符合要求。
Ila核波形
图1-13 ila核波形
15