存储器IP核生成 非对齐读写 vivado

存储器制作(含非对齐读写)

1. 创建ROM 和 RAM IP核

参考马德老师lab0PPT

1.新建一个项目ROM,选择芯片,创建。

image-20220419220043759

2.搜索memory generator.

image-20220419220228201

3.双击

4.设置好后点击OK

width写32 另一个写1024

5.编写ROM.coe

memory_initialization_radix=16;
memory_initialization_vector=
0000000, 11111111, 22222222, 33333333, 44444444, 55555555, 66666666, 77777777, 88888888, 99999999, aaaaaaaa, bbbbbbbb, cccccccc, dddddddd, eeeeeeee, ffffffff, 557EF7E0, D7BDFBD9, D7DBFDB9, DFCFFCFB, DFCFBFFF, F7F3DFFFF, FFFFDF3D, FFFF9DB9, FFFFBCFB, DFCFFCFB, DFCFBFFF, D7DB9FFF, D7DBFDB9, D7BDFBD9, FFFF07E0, 007E0FFF, 03bdf020, 03def820, 08002300;

用记事本编写然后保存设置后缀(全部文件)。

6.双击xci

image-20220419220406392

7.点击RST & initialization,导入ROM.coe

8.点击IP Sources,查看调用模式

RAM基本相同,在memory generator处选择上一个有时钟输入的即可。

2. TOP文件编写

要求是在指定的地址写入32’h12345678

    assign wired=32'h12345678;

    always @(posedge clk)begin
        //读数的低16
        //给寄存器赋值
        if(flag==3'b000)begin
            adr<=add[0]?add+2'b10:add;
            flag<=3'b001;
        end
        //第一次赋值成功后 赋值第二次
        else if(flag==3'b001)begin
            adr<=add;
            flag<=3'b010;
        end
        //RAM读出第一次adr的值 给低16位输出
        else if(flag==3'b010)begin
            //result[31:16]<=add[0]?result1[15:0]:result1[31:16];
            store_result[63:32]<=result1;
            result[15:0]<=add[0]?result1[31:16]:result1[15:0];
            flag<=3'b011;
        end
        else if(flag==3'b011)begin
            store_result[31:0]<=result1;
            result[31:16]<=add[0]?result1[15:0]:result1[31:16];
            flag<={LES,2'b00};
        end
        else if(flag==3'b100)begin
            //wr<=add[0]?{store_result[31:16],wired[15:0]}:wired;
            wr<=add[0]?{result1[31:16],wired[31:16]}:wired;
            myLES<=1;
            flag<=3'b101;
        end
        else if(flag<=3'b101)begin
            wr<=add[0]?{wired[15:0],store_result[47:32]}:wired;
            myLES<=add[0]?1'b1:1'b0;
            adr<=add+2'b10;
            flag<=3'b110;
        end
        else if(flag<=3'b110)begin
            myLES<=1'b0;
            flag<=3'b000;
        end
    end

简单实现一个状态机。

  • 寄存器每次要在下一个时钟周期才能更新值。
  • RAM在寄存器更新之后需要一个时钟周期才能读出地址的值(write first RAM)
  • 通过myLES信号实现只给特定时钟周期的写使能。

进行引脚约束下板即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值