差分曼彻斯特码解码的verilog代码
我的代码:
module m_decode(clk,clk2,rst,mdi,machester);//实际的数据mdi为2046bit
input clk,clk2,rst;//时钟clk的频率是mdi的频率
input mdi;//差分曼彻斯特码的数据
output machester;
parameter size=1023;
parameter dsize=2046;
reg[dsize-1:0] temp;//存储mdi确定是正确的data位后,再进行解码
reg[size-1:0] even_data,odd_data;
reg[10:0] i;
reg[9:0] n,bit,x;
reg true,machester;
reg en_n,stop;//stop为全部数据异或完之后,或者是中间发现异或值为0停止
always @(posedge clk )//接收mdi,并存储
begin
if(rst)
begin
temp<=0;
i<=0;
en_n<=0;
end
else
begin
if(i==dsize)
begin
i<=dsize;
en_n<=1;
end
else
begin
temp<=mdi;
i<=i+1;
end
end
end
always @(posedge clk ) //把temp的奇偶位上的数据分别存储,以便下一步操作
begin
if(!en_n)
begin
n<=0;
even_data<=0;
odd_data<=0;
end
else
begin
if(n==size-1)
n<=size-1;
else
begin
n<=n+1;
even_data[n]<=temp[2*n];
odd_data[n]<=temp[2*n+1];
end
end
end
always @(posedge clk2 ) //先进行异或判断取奇数的数组,还是偶数的数组 ;由于解码后输出的数据频率应该是差分曼码的2倍,故用了个2倍的时钟
begin
if(n==size-1)
begin
if(stop==0)
begin
if(true==1)
begin
if(bit==size-1)
begin
stop<=1;
bit<=size-1;
if(x==size-1)
x<=size-1;
else
begin
machester<=even_data[x]~^even_data[x+1];//同或,就是最后的解码电平
x<=x+1;
end
end
else
begin
x<=0;
true<=even_data[bit]^odd_data[bit];
bit<=bit+1;
end
end
else
begin
if(x==size-1)
x<=size-1;
else
begin
machester<=odd_data[x]~^odd_data[x+1];//同或
x<=x+1;
end
end
end
end
else
begin
bit<=0;
machester<=1'bz;
stop<=0;
true<=1;
end
end
endmodule |