请选择 进入手机版 | 继续访问电脑版

集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

FPGA初级课程第十五讲 RAM

[复制链接]
 楼主| lcytms 发表于 2016-11-18 11:51:01 | 显示全部楼层
IP核管理界面p4。
取消选择’q’ output port,不使用该输出寄存器。点击Next。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-18 11:52:44 | 显示全部楼层
IP核管理界面p5。
点击Next。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-18 11:57:47 | 显示全部楼层
IP核管理界面p6。
点击Next。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-18 12:26:48 | 显示全部楼层
IP核管理界面p7。
点击Next。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-18 12:28:11 | 显示全部楼层
IP核管理界面p8。
选中最后两行my_ram_inst.v和my_ram_bb.v。
点击Finish,完成IP核管理界面的设置,总计8个设置页面。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-18 12:29:16 | 显示全部楼层
这时检查工程导航一栏,发现Files一项中已经自动生成对应的IP核文件my_ram.qip。
打开下一级的my_ram.v,可以看到其封装代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 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 )
        );

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 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 [7:0] q;
       
        wire wren;
        wire [7:0] addr;
        wire [7:0] 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 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 [7:0] addr;
        output reg [7:0] data;

        reg [1:0] state;
        reg [7:0] 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-11-18 12:40:58 | 显示全部楼层
新建仿真模块Testbench。
新建ram_tb.v模块,编写代码如下。
`timescale 1ns/1ps

module ram_tb;

        reg clk, rst_n;
       
        wire [7:0] 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-3-29 20:16 , Processed in 0.105725 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表