题解 | #非整数倍数据位宽转换8to12#
非整数倍数据位宽转换8to12
https://www.nowcoder.com/practice/11dfedff55fd4c24b7f696bed86190b1
`timescale 1ns/1ns
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
);
reg [1:0]cnt;
reg [11:0]temp;
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)
temp<=0;
else if(valid_in)
temp<={temp[3:0],data_in};
else
temp<=temp;
end
always@(posedge clk or negedge rst_n)begin
if(~rst_n)
data_out<=0;
else if(valid_in)
if(cnt==1)
data_out<={temp[7:0],data_in[7:4]};
else if(cnt==2)
data_out<={temp[3:0],data_in};
else
data_out<=data_out;
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
endmodule
与前一题较为类似,首先计算一下数据的吞吐率,8*3=12*2,因此每进来3个数据,可以输出2次。构造一个temp数组,每次移入8bit,计数·为·1的时候,temp里放的是4个0加第一个数据,计数为2是第一个数据低四位+第二个数据。因此在计数为1的时候,输出为temp低八位(完整的第一个数据)+data_in高四位(第二个数据高四位),cnt为2时因为第二个数据的高四位刚才已经输出了所以移走,此时temp低4位(完整的第一个数据)+data_in,即第三个数据+第二个数据低四位。完成一次输出
