lcytms
发表于 2016-11-18 11:51:01
IP核管理界面p4。
取消选择’q’ output port,不使用该输出寄存器。点击Next。
lcytms
发表于 2016-11-18 11:52:44
IP核管理界面p5。
点击Next。
lcytms
发表于 2016-11-18 11:57:47
IP核管理界面p6。
点击Next。
lcytms
发表于 2016-11-18 12:26:48
IP核管理界面p7。
点击Next。
lcytms
发表于 2016-11-18 12:28:11
IP核管理界面p8。
选中最后两行my_ram_inst.v和my_ram_bb.v。
点击Finish,完成IP核管理界面的设置,总计8个设置页面。
lcytms
发表于 2016-11-18 12:29:16
这时检查工程导航一栏,发现Files一项中已经自动生成对应的IP核文件my_ram.qip。
打开下一级的my_ram.v,可以看到其封装代码。
lcytms
发表于 2016-11-18 12:30:25
打开已经生成的my_ram_inst.v文件。
my_ram my_ram_inst (
.address ( address_sig ),
.clock ( clock_sig ),
.data ( data_sig ),
.wren ( wren_sig ),
.q ( q_sig )
);
lcytms
发表于 2016-11-18 12:32:43
将my_ram_inst.v代码拷贝粘贴到ram.v模块中,修改实例化的信号名。
新建ram_controller模块,编写框架代码。
在ram.v模块中放入ram_controller模块,对其进行实例化操作。
编写ram.v模块如下。
module ram (clk, rst_n, q);
input clk, rst_n;
output q;
wire wren;
wire addr;
wire data;
ram_controller ram_controller_inst (
.clk(clk),
.rst_n(rst_n),
.wren(wren),
.addr(addr),
.data(data)
);
my_ram my_ram_inst (
.address ( addr ),
.clock ( clk ),
.data ( data ),
.wren ( wren ),
.q ( q )
);
endmodule
lcytms
发表于 2016-11-18 12:38:53
继续完成ram_controller模块。
编写ram_controller模块代码如下。
module ram_controller (clk, rst_n, wren, addr, data);
input clk, rst_n;
output reg wren;
output reg addr;
output reg data;
reg state;
reg start_num;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
start_num <= 0;
wren <= 0;
addr <= 0;
data <= 0;
state <= 0;
end
else
begin
case (state)
0 : begin // intialize for wren=1
start_num <= 0;
wren <= 1;
addr <= 0;
data <= 0;
state <= 1;
end
1 : begin // write 256 digits
if (addr < 255)
begin
wren <= 1;
addr <= addr + 8'd1;
data <= data + 8'd1;
end
else
begin
wren <= 0;
addr <= 0;
data <= data + 8'd1;
state <= 2;
end
end
2 : begin // read 256 digits
if (addr < 255)
begin
wren <= 0;
addr <= addr + 8'd1;
end
else
begin
start_num <= start_num + 8'd128;
wren <= 1;
addr <= 0;
data <= start_num + 8'd128;
state <= 1;
end
end
default : state <= 0;
endcase
end
end
endmodule
lcytms
发表于 2016-11-18 12:40:58
新建仿真模块Testbench。
新建ram_tb.v模块,编写代码如下。
`timescale 1ns/1ps
module ram_tb;
reg clk, rst_n;
wire q;
ram dut (.clk(clk), .rst_n(rst_n), .q(q));
initial
begin
clk = 1;
rst_n = 0;
#200.1
rst_n = 1;
#50_000 $stop;
end
always #10 clk = ~clk;
endmodule