题解 | #非整数倍数据位宽转换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,即第三个数据+第二个数据低四位。完成一次输出