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
页: 1 [2] 3 4 5
查看完整版本: FPGA初级课程第十五讲 RAM