前言
本次是一次作业内容,本意是要用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<=

最低0.47元/天 解锁文章
3681

被折叠的 条评论
为什么被折叠?



