首先,什么是曼切斯特码? 本文所示代码所解曼切斯特编码定义如下图所示: 其中所用FPGA时钟周期为10ns,即clk为10ns。其次,须了解:(1)同步信号为单个码元‘1’(即4个脉冲进行同步), (2)结束信号:脉冲全无。再次,原理(原理基于脉冲检测法): 1、同步:检测四个脉冲上升沿之后开始同步,若下一个到来的码为‘1’,则同步头中4个脉冲后的下一个脉冲到来的所需时间在(118*4,118*6)个时钟周期范围内(这个范围其实可以更大),若下一个到来的码为‘0’,则同步头中4个脉冲后的下一个脉冲到来的所需时间在(118*(4+4),118*(6+4))个时钟周期范围内(这个范围也可以更大); 2、结束:计时检测脉冲,若在计时的某118*8个时钟周期内没有2个以上脉冲,则无信息,中断通信。 3、解码:若前一个码元为“1”,则若下一个到来的码为‘1’,则前一个码元的4个脉冲后的下一个脉冲到来的所需时间在(118*4,118*6)个时钟周期范围内(这个范围其实可以更大),若下一个到来的码为‘0’,则前一个码元的4个脉冲后的下一个脉冲到来的所需时间在(118*(4+4),118*(6+4))个时钟周期范围内(这个范围也可以更大)。 若前一个码元为“0”,则若下一个到来的码为‘0’,则前一个码元的4个脉冲后的下一个脉冲到来的所需时间在(118*4,118*6)个时钟周期范围内(这个范围其实可以更大),若下一个到来的码为‘1’,则前一个码元的4个脉冲后的下一个脉冲到来的所需时间在(54,125)个时钟周期范围内(这个范围也可以更大)。 代码如下: module Manchster_Decoder_png( clk, rst, signal_rv, demo_db, decoder_64fc_ena, wr_en, start_1, end_all ); input clk; input rst; input signal_rv; input decoder_64fc_ena; output[8:0] demo_db; output wr_en; output start_1; output end_all; //--- //--------------------------------------------- reg [8:0] demo_db=0; //-----------------------posedge check-------------- //cnt_pos reg rv_1; reg rv_2; always @(posedge clk or negedge rst) if(!rst) begin rv_1<=0; rv_2<=0; end else if(end_1==3'd3) begin rv_1<=0; rv_2<=0; end else begin rv_1<=signal_rv; rv_2<=rv_1; end wire rv_pos = rv_1&(~rv_2); //------------------------------------------------- reg[3:0] restart_state=4'b0001; reg[2:0] cnt_pos_1=0; reg[8:0] cnt_for_restart=0; always@(posedge clk or negedge rst) if(!rst) begin restart_state<=4'b0001; cnt_pos_1<=0; cnt_for_restart<=0; end else if(end_1==3'd3) begin restart_state<=4'b0001; cnt_pos_1<=0; cnt_for_restart<=0; end else if(start_1) begin if(rv_pos) begin cnt_pos_1<=cnt_pos_1+1; end else begin if(cnt_pos_1==4) begin cnt_pos_1<=0; end end cnt_for_restart<=0; restart_state<=4'b0001; end else begin case(restart_state) 4'b0001:begin if(rv_pos) begin cnt_pos_1<=3'd1; cnt_for_restart<=1; restart_state<=4'b0010; end else begin end end 4'b0010:begin cnt_for_restart<=cnt_for_restart+1; if(rv_pos) begin cnt_pos_1<=3'd2; restart_state<=4'b0100; end end 4'b0100:begin if((cnt_for_restart>=177)||(cnt_for_restart<=50)) begin restart_state<=4'b0001; end else begin restart_state<=4'b1000; end end 4'b1000:begin if(rv_pos) begin cnt_pos_1<=cnt_pos_1+3'd1; end else begin if(cnt_pos_1==3'd4) begin cnt_pos_1<=0; end end end endcase end //-------------------------------------------------- reg start_1 = 0; always @(posedge clk or negedge rst) if(!rst) begin start_1<=1'b0; end else if(end_1==3'd3) begin start_1<=1'b0; end else begin if(cnt_pos_1==3'd4) begin start_1<=1'b1; end else begin end end //--------------------Decoder part---------------------------------------- reg pre_bit=1; reg after_bit=0; reg[10:0] cnt_decoder=0; reg[4:0] state_demo=5'b00001; reg[2:0] end_1 = 0; reg[3:0] cnt_demo =0; reg wr_en=0; always@(posedge clk or negedge rst or negedge start_1) if(!rst) begin pre_bit<=1; after_bit<=0; cnt_decoder<=0; state_demo<=5'b00001; cnt_demo <=0; wr_en<=0; demo_db<=0; end_1<=0; end else if(!start_1) begin pre_bit<=1; after_bit<=0; cnt_decoder<=0; state_demo<=5'b00001; cnt_demo <=0; wr_en<=0; demo_db<=0; end_1<=0; end else if(!decoder_64fc_ena) begin end_1<=3'd3; end else begin case(state_demo) 5'b00001:begin if(cnt_decoder==11'd4) begin cnt_decoder<=11'd5; state_demo<=5'b00010; end else begin cnt_decoder<=cnt_decoder+1'b1; end end 5'b00010:begin if(cnt_pos_1==3'd4) begin cnt_decoder<=cnt_decoder; state_demo<=5'b00100; end else if(cnt_decoder>=11'd1600) begin end_1<=3'd3; cnt_decoder<=11'd1601; end else begin cnt_decoder<=cnt_decoder+1'b1; end end 5'b00100:begin if(cnt_demo==4'd9) begin cnt_demo<=4'd1; end else begin wr_en<=0; cnt_demo<=cnt_demo+4'd1; end if(pre_bit==1'b1) begin if(cnt_decoder>=11'd1050) begin after_bit<=0; state_demo<=5'b01000; end else begin after_bit<=1; state_demo<=5'b01000; end end else if(pre_bit==1'b0) begin if(cnt_decoder<=11'd600) begin after_bit<=1; state_demo<=5'b01000; end else begin after_bit<=0; state_demo<=5'b01000; end end end 5'd01000:begin cnt_decoder<=0; case(cnt_demo) 4'd1:demo_db[0]<=after_bit; 4'd2:demo_db[1]<=after_bit; 4'd3:demo_db[2]<=after_bit; 4'd4:demo_db[3]<=after_bit; 4'd5:demo_db[4]<=after_bit; 4'd6:demo_db[5]<=after_bit; 4'd7:demo_db[6]<=after_bit; 4'd8:demo_db[7]<=after_bit; 4'd9:begin demo_db[8]<=after_bit;//tiaojian cunru wr_en<=1; end default:begin end endcase state_demo<=5'b10000; end 5'b10000:begin wr_en<=0; pre_bit<=after_bit; cnt_decoder<=cnt_decoder+1'b1; state_demo<=5'b00010; end default:begin end endcase end //---------------------------qu maoci-------------------------------------- reg disable_pos=0; assign end_all=end_1==3'd3; //------------------------------------------------------------------------ endmodule |
|
来自: 小小锐DarkRose > 《verilog》