自学内容网 自学内容网

verilog把长位宽数据剪切成短位宽,把短位宽数据拼接成长位宽

将一段长数据分配给几个短数据;

例如:将16bit的数据,分成4bit一组,且最先取出最高四位,然后从左至右

因为直接使用i进行坐标选择时会报出错误

Error:Range must be bounded by constant expressions.

考虑使用移位,每次移四次,每次取最高四位,但是这样会消耗多余的资源

 //reg [15:0] din ; // 16 位输入数据 (测试时,设为输入,不然下面的*没有敏感信号)
        reg [3:0] split_data [0:3]; // 存储拆分的 4 位数据,总共 4 个 4 位数据

        integer i;

    
        always @(*) begin
            for (i = 0; i < 4; i = i + 1) begin
                //split_data[i] = din[i * 4 +: 4]; // 使用位切片  从低位开始切
                split_data[i] = din[16 - (i * 4) - 1 -: 4];// 使用位切片  从高位开始切
                //split_data[i] = xbit[W0 - (i * W1): W0 - ((i+1) * W1)];  //直接赋值有i这个变量,编译不通过,原因是两边都有i,导致位宽不确定
            end
        end

相当于直接对应连线

而把短位宽拼接成长位宽也是一样,调换一下位置就可以了

 reg [15:0] split_data1;
        always @(*) begin
            for (i = 0; i < 4; i = i + 1) begin
                //split_data1[i * 4 +: 4]            = split_data[i]; 
                 split_data1[16 - (i * 4) - 1 -: 4]  = split_data[i];

            end
        end


原文地址:https://blog.csdn.net/qq_43811597/article/details/142961048

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!