verilog数组的定义、转换和加法器的实现

一、verilog中数组

1、一维数组

看了别人的博客有的人也称reg [31:0] add0[0:12]这样的数组为二维数组,其实中二维数组不是真正意义上的数组,而是由多个寄存器组成的ROM或者RAM。我觉得这样理解好记一点:这个是一维数组,一共有0到12共13组数据,每组数据的宽度是0到31一共32个位宽。

reg [31:0] add0[0:12];//前面[31:0]表示位宽,add0代表存储的名字,[0:12]代表0到12共13个组
reg [31:0] add1[0:6];//前面[31:0]表示位宽,add1代表存储的名字,[0:6]代表0到6共7个组
reg [31:0] add2[0:3];
reg [31:0] add3[0:1];

assign data=add0[6][31:24];//调用第7组的高8位数据 

verilog数组的定义、转换和加法器的实现_第1张图片

2、二维数组

reg [23:0] window_mul_result[4:0][4:0];//reg [23:0] window_mul_result[0:4][0:4]效果好像是一样的

二、加法实现的两种方法:

1. 方法一

reg [23:0] window_mul_result[4:0][4:0];
wire [31:0] window_sum;
//=====================方法1 此方法消耗较大的lut===================================================
assign window_sum=window_mul_result[0][0]+window_mul_result[0][1]+window_mul_result[0][2]+window_mul_result[0][3]+window_mul_result[0][4]+
                  window_mul_result[1][0]+window_mul_result[1][1]+window_mul_result[1][2]+window_mul_result[1][3]+window_mul_result[1][4]+
                  window_mul_result[2][0]+window_mul_result[2][1]+window_mul_result[2][2]+window_mul_result[2][3]+window_mul_result[2][4]+
                  window_mul_result[3][0]+window_mul_result[3][1]+window_mul_result[3][2]+window_mul_result[3][3]+window_mul_result[3][4]+
                  window_mul_result[4][0]+window_mul_result[4][1]+window_mul_result[4][2]+window_mul_result[4][3]+window_mul_result[4][4];

优势:简单易于编程

2、方法二

//==============================方法2 采用加法树add tree=========================================
reg [23:0] window_mul_result[4:0][4:0];
wire [31:0] window_sum;
reg [31:0] add0[0:12];
reg [31:0] add1[0:6];
reg [31:0] add2[0:3];
reg [31:0] add3[0:1];
wire [16-1:0] window_mul_result_4tree[0:24];//这个定于的作用是将reg [23:0] window_mul_result[4:0][4:0]二维数组变为一维数组,
											//每一组数据的位宽由24位缩小为16位。二维变为一维数组的好处就是循环的时候好遍历索引

always@(posedge clk)begin
    //============add0================
    for(i=0;i<12;i=i+1)begin
        add0[i]<=window_mul_result_4tree[i*2]+window_mul_result_4tree[i*2+1];
    end
        add0[12]<=window_mul_result_4tree[24]+0;
    //==============add1==================
    for(i=0;i<6;i=i+1)begin
        add1[i]<=add0[i*2]+add0[i*2+1];
    end
        add1[6]<=add0[12]+0;
     //==============add2==================
    for(i=0;i<3;i=i+1)begin
        add2[i]<=add1[i*2]+add1[i*2+1];
    end
        add2[3]<=add1[6]+0;
       //==============add3==================
    for(i=0;i<2;i=i+1)begin
        add3[i]<=add2[i*2]+add2[i*2+1];
    end
end
assign window_sum=add3[0]+add3[1];

优势:节约资源,但是会晚4个时钟出结果
verilog数组的定义、转换和加法器的实现_第2张图片

verilog数组的定义、转换和加法器的实现_第3张图片

你可能感兴趣的:(FPGA学习之路,fpga开发)