通用方法:最小公倍数法 | 非整数倍数据位宽转换24to128

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

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

`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;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 0;
        end else if (valid_in) begin
            cnt <= cnt + 1;
        end
    end
    reg [119:0] data_in_reg;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            data_in_reg <= 0;
        end else if (valid_in) begin
            data_in_reg <= {data_in_reg[95:0], data_in};
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            valid_out <= 0;
        end else if (valid_in && (cnt == 'd5 || cnt == 'd10 || cnt == 'd15)) begin
            valid_out <= 1;
        end else begin
            valid_out <= 0;
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            data_out <= 0;
        end else if (valid_in) begin
            case (cnt)
                'd5: data_out <= {data_in_reg[119:0], data_in[23:16]};
                'd10: data_out <= {data_in_reg[111:0], data_in[23:8]};
                'd15: data_out <= {data_in_reg[103:0], data_in[23:0]};
                default: data_out <= data_out;
            endcase
        end
    end
endmodule

注意到128和24的最小公倍数384=128*3=24*16

读端寄存器128位,写端寄存器24位,要想达到384需要写16次,因此计数器上限16,读3次,因此有3种不同读法

小于128的24的最大倍数为120,因此设计数据缓存寄存器为120位,写5次后和data_in共同读取

计数器范围内发生读取事件的cnt值分别为5 10 15,分别设置对应的脉冲

根据cnt值调整data_in_reg和data_in的比重,读取到data_out中

全部评论

相关推荐

StephenZ_:我9月份找的第一段实习也是遇到这种骗子公司了,问他后端有多少人和我说7个正职,进去一看只有一个后端剩下的都是产品前端算法(没错甚至还有算法)。还是某制造业中大厂,我离职的时候还阴阳怪气我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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