题解 | #非整数倍数据位宽转换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] data_in_cnt; reg [11:0] data_out_temp; always@(posedge clk or negedge rst_n) begin if(!rst_n) data_in_cnt <= 2'b0; else if(valid_in) begin if(data_in_cnt == 2'b10) data_in_cnt <= 2'b0; else data_in_cnt <= data_in_cnt + 1'b1; end else data_in_cnt <= data_in_cnt; end always@(posedge clk or negedge rst_n) begin if(!rst_n) data_out_temp <= 12'b0; else if(valid_in) data_out_temp <= {data_out_temp[3:0] , data_in}; else data_out_temp <= data_out_temp; end always@(posedge clk or negedge rst_n) begin if(!rst_n) begin data_out <= 12'b0; valid_out <= 1'b0; end else if(valid_in) //这里和之前的有区别,必须要加上数据有效,因为其不加上下面的有效位和数据位还是与当前数据进行计算导致输出出错 begin case(data_in_cnt) 2'b00 : begin data_out <= data_out; valid_out <= 1'b0; end 2'b01 : begin data_out <= {data_out_temp[7:0] , data_in[7:4]}; //这里的截取和temp的截取不一致,所以必须加上valid判断 valid_out <= 1'b1; end 2'b10 : begin data_out <= {data_out_temp[3:0] , data_in}; //不加上面的valid判断这里就会还继续运行,就会报错,因为这里和前面的所截取的不一致,以及temp也不一致,所以会导致出错 valid_out <= 1'b1; end default : begin data_out <= data_out; valid_out <= 1'b0; end endcase end else begin data_out <= data_out; valid_out <= 1'b0; end end endmodule