题解 | 非整数倍数据位宽转换24to128
非整数倍数据位宽转换24to128
https://www.nowcoder.com/practice/6312169e30a645bba5d832c7313c64cc
`timescale 1ns/1ns `define D_FILIP_FLOP(clk, rst_n, data_d, data_q, enable) \ always @(posedge clk or negedge rst_n) begin \ if (~rst_n) \ data_q <= 0; \ else if (enable) \ data_q <= data_d; \ end module width_24to128( input clk , input rst_n , input valid_in , input [23:0] data_in , output reg valid_out , output reg [127:0] data_out ); wire [119:0] Container_d; reg [119:0] Container_q; wire [3:0] Cnt_d; reg [3:0] Cnt_q; wire valid_allow; assign valid_allow = valid_in && (Cnt_q == 4'd5 | Cnt_q == 4'd10 | Cnt_q == 4'd15 ); //Cnt_Conuter `D_FILIP_FLOP(clk,rst_n,Cnt_d,Cnt_q,valid_in) //Shitfer Logic `D_FILIP_FLOP(clk,rst_n,Container_d,Container_q,valid_in) assign Cnt_d = Cnt_q + 1'b1; assign Container_d = valid_in ? {Container_q[103:0],data_in}:Container_q; //output logic reg [127:0] data_out_d; always@(*) begin case(Cnt_q) 4'd5 : data_out_d = {Container_q[119:0],data_in[23:16]}; 4'd10 : data_out_d = {Container_q[111:0],data_in[23:8]}; 4'd15 : data_out_d = {Container_q[103:0],data_in[23:0]}; default: data_out_d = data_out; endcase end `D_FILIP_FLOP(clk,rst_n,data_out_d,data_out,valid_in) `D_FILIP_FLOP(clk,rst_n,valid_allow,valid_out,1'b1) endmodule
常规思路,找一个和128最近的成倍数的寄存器一直移位,在不同的情况下进行判断,第一次移入5个,120位移满了,加新来的数据额外8位,第二次再移入五个,注意这个时候最高位的8位是上一次输出的了,就不再需要。第三次依次类推,注意他的valid和结果都是寄存器输出