⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coder.v

📁 这是一个HDB3编码器
💻 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 + -