您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 数字costas环verilog设计代码
//数字costas环,设计使用在GPS信号的跟踪部分//环路噪声带宽Bl=160Hz//修改时间:2016/6/6//modelsim仿真通过//diff_data有正有负,修正pre_uct为有符号数modulecostas(inputclk,rst,inputtrack_block,//阻塞环路变化,避免初始uct过大inputsink_valid,inputsigned[7:0]sink_data,input[21:0]phi_inc,//捕获输入的精细频率outputregcostas_lock,//costas环的锁定信号outputregsigned[7:0]sine_value,//输出同步正弦载波output[9:0]mt//输出解调后的信息);//-------------------------------------------wireout_valid;wire[15:0]fsin_o,fcos_o;regsigned[17:0]uct;//-------------------------------------------NCO部分//-------------------------------------------8位数据宽度,16位频率调制宽度costas_ncocostas_nco0(.phi_inc_i(phi_inc),//f0=1557kHz.clk(clk),.reset_n(rst),.clken(1'b1),.freq_mod_i(uct),//频率控制字.fsin_o(fsin_o),.fcos_o(fcos_o),.out_valid(out_valid));//-------------------------------------------NCO的输出仅在out_valid有效时有效//-------------------------------------------做一级缓存,将不平滑的数据平滑regsigned[7:0]cosine_value;//-------------------------------------------将16位的数据截断为8位always@(posedgeclkornegedgerst)if(!rst)beginsine_value=0;cosine_value=0;endelseif(out_valid)begincosine_value=fcos_o[15:8];sine_value=fsin_o[15:8];end//-------------------------------------------wiresigned[15:0]mul_if,mul_qf;//-------------------------------------------计算两个乘法assignmul_if=sink_data*sine_value;assignmul_qf=sink_data*cosine_value;//-------------------------------------------regmul_valid;regsigned[7:0]mul_i,mul_q;//-------------------------------------------always@(posedgeclkornegedgerst)if(!rst)beginmul_valid=0;mul_i=0;mul_q=0;endelseif(sink_valid)beginmul_valid=1;mul_i=mul_if[14:7];mul_q=mul_qf[14:7];endelsemul_valid=0;//-------------------------------------------wirelpf_valid;wiresigned[7:0]lpf_i,lpf_q;//-------------------------------------------低通滤波器滤除2倍频分量costas_lpfcostas_lpf_i//I路(.clk(clk),.reset_n(rst),.ast_sink_data(mul_i),.ast_sink_valid(mul_valid),.ast_source_ready(1'b1),.ast_sink_error(2'b00),.ast_source_data(lpf_i),.ast_sink_ready(),//NC.ast_source_valid(lpf_valid),.ast_source_error()//NC);//-------------------------------------------costas_lpfcostas_lpf_q//Q路(.clk(clk),.reset_n(rst),.ast_sink_data(mul_q),.ast_sink_valid(mul_valid),.ast_source_ready(1'b1),.ast_sink_error(2'b00),.ast_source_data(lpf_q),.ast_sink_ready(),//NC.ast_source_valid(),//NC.ast_source_error()//NC);//-------------------------------------------定义积分清洗器//-------------------------------------------起到滤波和降低采样率的作用//-------------------------------------------Dr=200reg[7:0]yt_cnt;regsigned[15:0]yit_full,yqt_full;//-------------------------------------------always@(posedgeclkornegedgerst)if(!rst)beginyt_cnt=0;yit_full=0;yqt_full=0;endelseif(lpf_valid)beginif(yt_cnt==200-1)//积分清零beginyt_cnt=0;yit_full=0;yqt_full=0;endelsebeginyt_cnt=yt_cnt+1'b1;yit_full=yit_full+lpf_i;yqt_full=yqt_full+lpf_q;endend//-------------------------------------------regyt_valid;regsigned[9:0]yit,yqt;//-------------------------------------------产生积分清洗器的输出有效信号always@(posedgeclkornegedgerst)if(!rst)beginyt_valid=0;yit=0;yqt=0;endelseif((lpf_valid)&&(yt_cnt==200-2))beginyt_valid=1;yit=yit_full[15:6];//截断积分清洗器得到10位的输出yqt=yqt_full[15:6];endelseyt_valid=0;//-------------------------------------------输出的数据即为同向支路输出assignmt=yit;//-------------------------------------------wiresigned[19:0]udt_full;//-------------------------------------------使用标准乘法器作为鉴相器assignudt_full=yit*yqt;//-------------------------------------------regudt_valid;reg[17:0]udt;//-------------------------------------------always@(posedgeclkornegedgerst)if(!rst)beginudt_valid=0;udt=0;endelseif(yt_valid)beginudt_valid=1;udt=udt_full[18:1];endelseudt_valid=0;//---------------------------------------------------------定义环路滤波器//-------------------------------------------K=0.3068//-------------------------------------------C1=2^-4-2^-7//-------------------------------------------C2=2^-11//-------------------------------------------C1,C2根据需求可以适当向右移位regcxudt_valid;regsigned[17:0]c1xudt,c2xudt;//-------------------------------------------always@(posedgeclkornegedgerst)//LF的第一级if(!rst)begincxudt_valid=0;c1xudt=0;c2xudt=0;endelseif(udt_valid)begincxudt_valid=1;c1xudt={{5{udt[17]}},udt[17:5]}-{{8{udt[17]}},udt[17:8]};c2xudt={{12{udt[17]}},udt[17:12]};endelsecxudt_valid=0;//-------------------------------------------regsum_cnt;//计数每4个valid更新一次uctreguct_valid;regsigned[17:0]loop_sum;//-------------------------------------------always@(posedgeclkornegedgerst)//LF的第二级if(!rst)beginuct_valid=0;sum_cnt=0;loop_sum=0;uct=0;endelseif(cxudt_valid)beginsum_cnt=sum_cnt+1'b1;if(track_block)//参数载入装填阻塞环路变化beginloop_sum=0;uct=0;endelse//正常的捕获跟踪beginloop_sum=loop_sum+c2xudt;//loop_sum每次都更新if(sum_cnt==1)//每2个clks更新一次uctbeginuct_valid=1;uct=c1xudt+loop_sum;endendendelseuct_valid=0;//--------------------------------------------------------------END//--------------------------------------------------------------BEGIN//--------------------------------------------------------------以下为costas环锁定的判断//--------------------------------------------------------------通过判
本文标题:数字costas环verilog设计代码
链接地址:https://www.777doc.com/doc-7261984 .html