软件环境:vivado 2017.4 硬件平台:XC7K325
昨天才说了fdatool工具箱结合FIR使用.coe文件加载系数的方法,今天继续说说coe文件的另外用法,基于block memory generator的ROM、RAM的使用。

ROM
先说下ROM吧, 使用的coe文件内容是8 bit的自增数。

block memory generator配置如下。


设置完毕之后,添加顶层文件。
module top(
input clk_sys,
input rst_n
);
reg [7:0] rom_addr; //rom地址,256个数据
wire [7:0] rom_data; //8位数据
always@(posedge clk_sys or negedge rst_n)
begin
if(!rst_n)
rom_addr<=8'd0;
else
rom_addr<=rom_addr+1'b1;
end
blk_mem_gen_0 rom_init (
.clka(clk_sys), // input wire clka
.addra(rom_addr), // input wire [7 : 0] addra
.douta(rom_data) // output wire [7 : 0] douta
);
ila_0 ila_init (
.clk(clk_sys), // input wire clk
.probe0(rom_addr), // input wire [7:0] probe0
.probe1(rom_data) // input wire [7:0] probe1
);
endmodule
之后编译,运行,debug时候就能看到输出了。

RAM
接下来说下基于block memory generator的RAM设置。



配置基本就是这样了,接下来对接口作以简单说明。

之后添加顶层代码如下。
module top(
input clk_sys,
input rst_n
);
reg [8:0] w_addr;
reg [15:0] w_data;
reg wea;
reg [8:0] r_addr;
wire [15:0] r_data;
//PORTB 读地址
always@(posedge clk_sys)
begin
if(!rst_n)
r_addr<=9'd0;
else
begin
if(|w_addr) //A写地址不为0时
r_addr<=r_addr+1'b1;
else //A写地址为0时
r_addr<=9'd0;
end
end
//PORTA 写使能
always@(posedge clk_sys)
begin
if(!rst_n)
wea<=1'b0;
else
begin
if(&w_addr) //当全为1时,表示已写完,使能拉低
wea<=1'b0;
else
wea<=1'b1;
end
end
//PORTA 写入的地址及数据
always@ (posedge clk_sys)
begin
if(!rst_n)
begin
w_addr<=9'd0;
w_data<=16'd0;
end
else
begin
if(wea)
begin
if(&w_addr) //当w_addr所有位全为1时,即地址写满
begin
w_addr<=w_addr;
w_data<=w_data;
end
else
begin
w_addr<=w_addr+1'b1;//否则地址和数据自增
w_data<=w_data+1'd1;
end
end
end
end
blk_mem_gen_0 ram_ip_init (
.clka(clk_sys), // input wire clka
.wea(wea), // input wire [0 : 0] wea
.addra(w_addr), // input wire [8 : 0] addra
.dina(w_data), // input wire [15 : 0] dina
.clkb(clk_sys), // input wire clkb
.addrb(r_addr), // input wire [8 : 0] addrb
.doutb(r_data) // output wire [15 : 0] doutb
);
ila_0 ila_init (
.clk(clk_sys), // input wire clk
.probe0(w_addr), // input wire [8:0] probe0
.probe1(w_data), // input wire [15:0] probe1
.probe2(wea),
.probe3(r_addr),
.probe4(r_data)
);
endmodule
编译,运行,debug看到运行结果。

本文详细介绍了在Vivado环境下如何利用Block Memory Generator进行ROM和RAM的配置。通过实例展示了如何使用COE文件加载ROM数据,并提供了基于自增数的ROM配置方法。此外,还讲解了RAM的设置过程,包括写入地址、数据和读取操作的具体实现。

251

被折叠的 条评论
为什么被折叠?



