实际下载到开发板之后,译码时钟的下降沿随着时间的变化与接受数据的位置随机,一段时间后造成误差,导致译码错误,然后一段时间后误差归零。
//该代码主要负责接受曼彻斯特编码 并进行解码 解码后的数据在28pin 展示
module top_fpga(
//global signal
input clk,
input rst_n,
//STM32 port
input rxd,
output txd,
output data_dis,
output data_clk,
output reg flag2,
output reg data_code
);
//编码数据定义
reg [1:0] temp; //存储1-01 0-10
reg flag1=0;
//reg flag2=0;
reg fail=0;
wire clk_bps_en;//编码时钟
//编码时钟配置clk_bps_en
precise_divider//分频模块
#(
//DEVIDE_CNT = 85.89934592 * fo @50M
//DEVIDE_CNT = 42.94967296 * fo @100M
.DEVIDE_CNT(32'd1649267) //9600Hz * 2
)u_precise_divider_0
(
//global clock
.clk(clk),
.rst_n(rst_n),
//user interface
//.divide_clk()
.divide_clken(clk_bps_en)
);
//解码
always @ (posedge clk_bps_en)
begin
temp <= {rxd,temp[1]};
if(temp == 2'b00 || temp == 2'b11)
begin
flag1 <= 1;//开始译码标志
end
end
always @ (negedge clk_bps_en)
begin
if(flag1 == 1)
begin
flag2 <= ~flag2;
end
end
always @ (posedge flag2)
begin
if(temp == 2'b10)
begin
data_code <= 0;
fail <= 0;
end
else if(temp == 2'b01)
begin
data_code <= 1;
fail <= 0;
end
else if(temp == 2'b00 || temp ==2'b11)
begin
data_code <= 0;
fail <= 1;
end
end
endmodule