题解 | #非整数倍数据位宽转换8to12#
非整数倍数据位宽转换8to12
https://www.nowcoder.com/practice/11dfedff55fd4c24b7f696bed86190b1
`timescale 1ns/1ns
//串转并的方式有很多种:
//(1)单比特转多比特。这个比较容易,只需使用移位寄存器寄存,然后计数,在相同同的计数值输出结果即可。
//(2)多比特转多比特有两种可能,一种可能输出是输入的倍数,另一种可能是输出不是输入的倍数。
//(3)输出是输入的倍数,只需使用移位寄存器寄存,然后计数,在相同的计数值输出结果。
//(4)输出不是输入的倍数,使用移位寄存器寄存,找到输入和输出的最小公倍数,然后计数,在不同的计数值输出结果。
module width_8to12(
input clk ,
input rst_n ,
input valid_in ,
input [7:0] data_in ,
output reg valid_out,
output reg [11:0] data_out
);
// 8bit to 12bit ; 8*3==12*2
reg[1:0 ] cnt;
reg[11:0] data_reg;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt<=0;
else if(valid_in)
if(cnt==2)
cnt<=0;
else
cnt <=cnt+1;
else
cnt<=cnt;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
data_reg <=0;
else if(valid_in)
data_reg <= {data_reg[11:8],data_in};
else
data_reg <= data_reg;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
valid_out <=0;
else if(valid_in&&(cnt==1||cnt==2))
valid_out <=1;
else
valid_out <=0;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
data_out <=0;
else if(valid_in&&(cnt==1))
data_out <={data_reg[7:0],data_in[7:4]};
else if(valid_in&&(cnt==2))
data_out <={data_reg[3:0],data_in[7:0]};
else
data_out <=data_out;
end
endmodule
