verilog 实现曼彻斯特编码

曼彻斯特编码

曼彻斯特编码也称为相位编码,是一种同步时钟编码技术。通过电平的高低转换来表示“0”或“1”,每一位的中间有一个跳变的动作,这个动作既作时钟信号,又作数据信号,但因为每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2,其编码效率为50%。

曼彻斯特编码规则

第一种规则是:0-----10,1----01;
第二种规则是:0-----01,1----10;
常用的是第一种

曼彻斯特编码的实现

`timescale 1ns / 1ps
//
module manchester_encoding (
  input wire sys_clk,
  input wire dou_sys_clk, //系统时钟的2倍频的时钟
  input wire sys_rst_n,
  input wire data_in,
  input wire en,
  output wire data_out
//  output reg encoded_data_out
);
  reg [195:0] encoded_data_reg;//存储编码后的数据
  reg location;  // 判别前后位置 0表示在高位 1表示在低位
  reg [1:0] data_fifo;    //存储将一位信号变为两位信号

  always @(posedge dou_sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
      location <= 1'b1; //等到倍频时钟信号到来时,取反就为0,也就是取到了两位数的高位
      data_fifo <= 2'b00;
    end 
    else if(location == 1'b0&&en == 1'b1)begin
          if(data_in == 1'b0)
          data_fifo <= 2'b10;
          else if(data_in == 1'b1)
          data_fifo <= 2'b01;
          else
          data_fifo <= data_fifo;
    end
  end

  always @(posedge dou_sys_clk) begin
    location <= ~location ;
  end

always@(posedge dou_sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)
        encoded_data_reg <= 'd0;
    else if(en == 1'b1)       
         encoded_data_reg <= {encoded_data_reg[193:0], data_fifo};
    else
        encoded_data_reg <= encoded_data_reg;
end


assign data_out =  (location == 1'b0)?data_fifo[1]:data_fifo[0] ;

endmodule


tb

`timescale 1ns / 1ps
//
module manchester_encoding_tb();
reg sys_clk;
reg dou_sys_clk;
reg sys_rst_n;
reg data_in;
reg en;
wire data_out;

initial begin
     dou_sys_clk <= 1'b0;
     sys_clk <= 1'b0;
     sys_rst_n <= 1'b0;
     data_in <= 1'b0;
     en = 0;
     #20 sys_rst_n <= 1'b1;
     #10 en =1;
     #10000
     en = 0;
end

always#10 sys_clk = !sys_clk;
always#5 dou_sys_clk = !dou_sys_clk;
always#20 data_in = $random;

manchester_encoding manchester_encoding_top
(
    .en(en),
     .sys_clk(sys_clk),
     .dou_sys_clk(dou_sys_clk),
     .sys_rst_n(sys_rst_n),
     .data_in(data_in),
     .data_out(data_out)
);
endmodule

运行结果

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值