Verilog HDL中实现简单的并串转换

来源:百度知道 编辑:UC知道 时间:2024/06/25 01:35:38
module hanming_encode(clk,m_out,hanming_out,hanming_encode);
input clk;

reg [7:0] counter_224;
reg [6:0] counter_128;
reg clk_224;
reg clk_128;
reg clk_896;
reg [3:0] m;
reg temp;
reg [1:0] counter_896;
reg [3:0] input_temp;
reg [3:0] hanming_input;
output reg [6:0] hanming_encode;
reg [6:0] output_temp;
output reg hanming_out;
output reg m_out;
reg [2:0] cnt;

always@(posedge clk)
begin
if (counter_224==8'd223) // 224分频的计数器,64k
begin
clk_224<=1'b1;
counter_224<=8'b0;
end
else
begin
clk_224<=1'b0;
counter_224<=counter_224+8'b1;
end
end

always@(posedge clk)
begin
if (counter_128==7'd127) // 128分频的计数器,112k
begin
clk_128<=1'b1;
counter_128<=7'b0;
end
else
begin
clk_128<=1'b0;

我给你该了两处,一是你的分频部分,由于你采用的不是50%的占空比,而又要把得到的频率用做时钟,很可能造成后面数据无法满足建立和保持时间导致错误,该后的代码如下:
always@(posedge clk)
begin
if (counter_224=='d112) // 224分频的计数器,64k
begin
clk_224<=~clk_224;
counter_224<=8'b0;
end
else
counter_224<=counter_224+8'b1;

end

always@(posedge clk)
begin
if (counter_128=='d64) // 128分频的计数器,112k
begin
clk_128<=~clk_128;
counter_128<=0;
end
else
counter_128<=counter_128+7'b1;

end
还有就是你的并转串的部分,我没有用移位寄存器的方式而是采用状态机来实现的,你的代码的一个错误就是hanming_encode是7位的不是6位,还有个人比较喜欢状态机,可能看上去它很繁琐,其实这中思想应用广泛,移位寄存器虽然不繁但是老容易出错(我指在一些复杂的代码里),状态机从视觉上来说比较繁琐,可是很容易理解。代码如下:
reg [7:0] state;
always@(posedge clk_128) //并行输入,串行输出
begin
case(state)

state1:begin hanming_out<=output_temp[0]; state<=state2; end
state2:begin hanming_out<=output_temp[1]; state<=state3; end
state3:be