分享

Manchester Decoder曼切斯特解码

 小小锐DarkRose 2014-07-29
首先,什么是曼切斯特码?


本文所示代码所解曼切斯特编码定义如下图所示:
其中所用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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多