曼彻斯特编码
曼彻斯特编码也称为相位编码,是一种同步时钟编码技术。通过电平的高低转换来表示“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