一、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位数据
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个时钟出结果
文章来源:https://www.toymoban.com/news/detail-507562.html
文章来源地址https://www.toymoban.com/news/detail-507562.html
到了这里,关于verilog数组的定义、转换和加法器的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!