📄 coder.v
字号:
module Coder(clr,clk,codein,outp,outn);
input clr,clk,codein;
output outp,outn;
reg [3:0] temp_data; //暂存输入的codein
reg [3:0] temp_p; //调整占空比之前的outp
reg [3:0] temp_n; //调整占空比之前的outn
reg pole_b,pole_v; //前者记录B的极性,后者是B的奇偶性
wire outp=temp_p[0] & ~clk;
wire outn=temp_n[0] & ~clk;
always @(posedge clk or posedge clr )
begin
if(clr)
begin
temp_data=0; temp_p=0; temp_n=0; //赋予初值
pole_b=1; pole_v=1;
end
else
begin
temp_data={codein,temp_data[3:1]}; //存入数据
if (codein) //如果是1
begin
if (pole_b) //之前是负极性
begin
temp_p={1'b1,temp_p[3:1]}; //现在是正的
temp_n={1'b0,temp_n[3:1]};
end
else //之前是正的
begin
temp_p={1'b0,temp_p[3:1]};
temp_n={1'b1,temp_n[3:1]}; //现在记成负的
end
pole_b=~pole_b; //B的极性要翻转
end
else
if (temp_data==4'b0000) //碰到了四个零
begin
if (pole_b==pole_v) //如果有偶数个B
begin
temp_data=4'b1000; //最后一位变成V
if (pole_v) //决定是V正还是V负
begin
temp_p=4'b1001; //有必要的话要追溯前调整
temp_n={1'b0,temp_n[3:1]};
end
else
begin
temp_n=4'b1001; //同上
temp_p={1'b0,temp_p[3:1]};
end
pole_b=~pole_b; //极性要翻转
pole_v=~pole_v;
end
else
begin
temp_data=4'b1000; //如果只有偶数个B
if (pole_v) temp_p={1'b1,temp_p[3:1]};
else temp_n={1'b1,temp_n[3:1]};
pole_v=~pole_v; //B的奇偶记录要变化
end
end
else //零不够多
begin
temp_p={1'b0,temp_p[3:1]}; //继续加零
temp_n={1'b0,temp_n[3:1]};
end
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -