微信公众号获取更多FPGA相关源码:
4.寄存器数组
4.1 寄存器数组声明
在Verilog中可以声明一个寄存器数组。
integer NUMS [7: 0]; // 包含8个整数数组变量
time t_vals [3: 0]; // 4个时间数组变量
reg类型的数组通常用于描述存储器,其语法为:
reg [MSB:LSB] <memory_name> [first_addr:last_addr];
[MSB:LSB]定义存储器字的位数
[first_addr:last_addr]定义存储器的深度
例如:
reg [15: 0] MEM [0:1023]; // 1K x 16存储器
reg [7: 0] PREP [‘hFFFE: ’hFFFF]; // 2 x 8存储器
描述存储器时可以使用参数或任何合法表达式
parameter wordsize = 16;
parameter memsize = 1024;
reg [wordsize-1: 0] MEM3 [memsize-1: 0];
4.2 寄存器数组使用举例
以文章长短训练序列存储训练序列数剧为例:
OFDM802.11a的FPGA实现(十五)短训练序列:STS(含Matlab和verilog代码)
OFDM 802.11a的FPGA实现(十六)长训练序列:LTS(含Matlab和verilog代码)
STS一个周期的16个时域样值被存入片内ROM中,该ROM共有16个地址空间,每个地址对应16位的字长,其中高8位存储STS样值的虚部,低8位存储STS样值的实部(与IFFT输出保持一致)。ROM的地址信号由一个模161的计数器生成。STS_din_rdy作为ROM的读使能信号,代表后面的模块准备好接收数据。当STS_din_rdy为高时,计数器以模161形式开始计数161个时钟,生成的地址信号为计数器的低4位,即cnt[3:0]控制ROM将其中存储的16个STS样值重复读取10个周期,形成标准所规定的短训练序列。 代码如下:
assign En_cnt = STS_din_rdy & ~cnt_last;
counter #(.CNT_NUM('d161),
.ADD(1'b1))
u_counter(
.clk (clk ),
.rst_n (rst_n ),
.En_cnt (En_cnt ),
.cnt (cnt ),
.cnt_last (cnt_last )
);
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
STS_dout_last <= 1'b0;
STS_dout_Index <= 'd0;
end
else begin
STS_dout_last <= cnt_last;
STS_dout_Index <= cnt;
end
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin //时域样值Im Re
Short_Mem[0] <= {8'b00011000,8'b00011000};
Short_Mem[1] <= {8'b00000001,8'b10111100};
Short_Mem[2] <= {8'b11011000,8'b11111001};
Short_Mem[3] <= {8'b11111010,8'b01001001};
Short_Mem[4] <= {8'b00000000,8'b00101111};
Short_Mem[5] <= {8'b11111010,8'b01001001};
Short_Mem[6] <= {8'b11011000,8'b11111001};
Short_Mem[7] <= {8'b00000001,8'b10111100};
Short_Mem[8] <= {8'b00011000,8'b00011000};
Short_Mem[9] <= {8'b10111100,8'b00000001};
Short_Mem[10] <= {8'b11111001,8'b11011000};
Short_Mem[11] <= {8'b01001001,8'b11111010};
Short_Mem[12] <= {8'b00101111,8'b00000000};
Short_Mem[13] <= {8'b01001001,8'b11111010};
Short_Mem[14] <= {8'b11111001,8'b11011000};
Short_Mem[15] <= {8'b10111100,8'b00000001};
STS_dout <= 'd0;
STS_dout_vld <= 1'b0;
end
else if(STS_din_rdy & STS_dout_last)
STS_dout_vld <= 1'b0;
else if(cnt == 'd0 | cnt_last)begin
STS_dout <= {Short_Mem[0][15:8]>>1,Short_Mem[0][7:0]>>1};
STS_dout_vld <= 1'b1;
end
else begin
STS_dout <= Short_Mem[cnt[3:0]];
STS_dout_vld <= 1'b1;
end
end
微信公众号获取更多FPGA相关源码: