题解 | #非整数倍数据位宽转换24to128#

非整数倍数据位宽转换24to128

http://www.nowcoder.com/practice/6312169e30a645bba5d832c7313c64cc

24和128的最小公倍数为384,16组data_in可以输出3个128比特数,可以用状态机的思想解决问题。

  1. S0: 已输入5组data_in,共120bit,需要加上下一个data_in的高8位组成一个128bit数,剩余16位,可进入S1态,此时计数值为5(从0开始);
  2. S1:已输入16bit+4组data_in,共112bit,需要加上下一个data_in的高16位组成一个128bit数,剩余8位,可进入S2态,此时计数值为5+4+1=10;
  3. S2:已输入8bit+4组data_in,共104bit,需要加上下一个data_in的全部数组成一个128bit数,剩余0,可进入S0态,此时计数值为10+4+1=15; 另外根据波形,valid_out的似乎只持续一个周期。
`timescale 1ns/1ns

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
);
    
    reg [3:0] cnt;
    reg [119:0] tmp_data_o;
    
    always @(posedge clk, negedge rst_n) begin
        if (!rst_n)
            cnt <= 4'd0;
        else if(cnt==4'd15)
            cnt <= 4'd0;
        else if (valid_in)
            cnt <= cnt + 1'b1;
        else
            cnt <= cnt;
    end
    always @(posedge clk, negedge rst_n) begin
        if (!rst_n)
            tmp_data_o  <= 119'd0;
        else if(valid_in) begin
            tmp_data_o <= {tmp_data_o[95:0],data_in};
        end
        else
             tmp_data_o <= tmp_data_o;
    end
    always @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            valid_out <= 1'b0;
            data_out <= 128'b0;
        end
        else if(cnt==4'd5) begin
            valid_out <= valid_out?1'b0:1'b1;
            data_out <= {tmp_data_o[119:0],data_in[23:16]};
        end
        else if(cnt==4'd10) begin
            valid_out <= valid_out?1'b0:1'b1;
            data_out <= {tmp_data_o[111:0],data_in[23:8]};
        end
        else if(cnt==4'd15) begin
            valid_out <= valid_out?1'b0:1'b1;
            data_out <= {tmp_data_o[103:0],data_in};
        end
        else begin
            valid_out <= 1'b0;
            data_out <= data_out;
        end
    end
    
endmodule
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务