Verilog实现HDB3编码译码


前言

本次是一次作业内容,本意是要用Simulink中的门电路和寄存器来进行搭建电路完成HDB3编码和译码,但是既然可以用门电路实现,那么就可以用Verilog代码编程然后进行综合自动生成门电路,下面进行介绍。


一、使用的软件

Verilog编程用的Quartus II,仿真用Modelsim。有关Verilog语法问题,仿真步骤和HDB3编译码相关的问题很多博客都写的很详细了,这里就不再叙述。

二、具体实现

1.模块介绍

顶层模块(top.bdf):
在这里插入图片描述
解释:
clk:时钟信号
rst_n:复位信号
start:数据有效信号
code_in:输入待编码数据
code:HDB3编码输出信号
binary:HDB3译码后的数据
out_flag:输出译码信号有效位

v_coder:用来对输入数据进行处理,只在需要加V和-V的地方进行处理。
b_coder1:用来对输入的数据进行加B00V和-B00V处理。
b_coder2:由于加B00V和-B00V处理之后,原有的1的符号也要进行该改变,总之使为了纠正加B00V之后1的符号没有进行改变的情况。
decoder:译码模块。

2.模块的.V文件

v_coder.v

module v_coder(
	input clk,
	input rst_n,
	input start,      //高电平有效,须维持 
	input code_in,

	output reg[2:0] codeout_v   //000->0  001->1  010->-1  011->+V前面+B  100->+V  101->-V前面加—B  110->-V  111->无效
);

reg count1;
reg start_flag;

always @ ( posedge clk or negedge rst_n )
begin
if(!rst_n)
	begin
		count1 <= 1'b0;
	end
else if(start)
	begin
		if(code_in == 1'b1)      //如果有1了,则把0清零
			 count1 <= count1 + 1'b1;
		else 
			count1 <= count1;
	end
else
	begin
		count1<=count1;
	end

end

always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
	codeout_v<=3'b111;
else if(start)
	begin
	if(code_in == 1'b1)
		begin
			if(count1 == 1'b0)      //之前没有1,
				codeout_v<=3'b001;      
			else 
				codeout_v<= 3'b010;    //之前有1了
		end
	else
		codeout_v<=1'b0;
	end
else
	codeout_v <= 3'b111;
end

endmodule

b_coder.v

module b_coder(
input clk,
input rst_n,
input [2:0] input_data,
input start,  //输入有效数据开始   0无效,1有效
output reg [2:0] b_coder
);


reg [2:0]start_reg;
reg [2:0]out_reg;
reg start_state;
reg[2:0] count0;    
reg[15:0] count1; 
reg[11:0] temp_code;
reg count1_flag;
reg one_sign;
reg[2:0] input_reg;
reg break_flag;
reg [7:0]boov_count;

always @(posedge clk or negedge rst_n)     //计算0的个数
begin
	if(!rst_n)
		count0<=3'b0;
	else if(start_state)
		begin
			if(count0 == 3'b011)
				count0 <= 3'b0;
			else if(input_reg==3'b0)
				count0 <= count0 + 1'b1;
			else
				count0 <= 3'b0;
		end
	else
		count0<=3'b0;
end

always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		start_reg<=3'b0;
	else
		start_reg<=(start_reg<<1)|start;
end


always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		start_state<=1'b0;
	else if( (start_reg&3'b111)!=0 )
		start_state<=1'b1;
	else
		start_state<=1'b0;
end

always @(posedge clk or negedge rst_n)       //先移位到寄存器
begin
	if(!rst_n)
		input_reg<=3'b111;
	else if(start_state)
		input_reg <= input_data;
	else
		input_reg <= 3'b111;
end

always @(posedge clk or negedge rst_n)       //先移位到寄存器
begin
	if(!rst_n)
		begin
			temp_code<=12'b111111111111;
		end
	else if(start_state)
		begin
			if(count0 == 3'b011)
				begin
					temp_code <= (12'b111111111000 | input_data);
				end
			else
				temp_code <= (temp_code<<3) | input_data;
		end
	else
		temp_code <= 12'b111111111111;
end



always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		begin
			count1_flag<=1'b0;
			break_flag<=1'b0;
		end
	else if(start_state)
		begin
			if(temp_code[11:0]==11'b0)
				begin
					count1_flag<=1'b1;
					break_flag<=1'b1;
				end
			else
				begin
					count1_flag<=
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值