Verilog 学习第十节(使用ram/rom IP核写入数据并测试)

ram初始配置

首先点击侧边栏的IP Catalog并在搜索框中搜索ram,有两种ram形式,块状ram更有利于处于数据量比较大的数据,这里我们选择第二种
在这里插入图片描述
在这里插入图片描述

之后根据需要选择单端口的只读存储器,并设置使能为总使能~设置好端口宽度与深度并加入初始化数据后开始编写代码
在这里插入图片描述

rom测试代码编写

`timescale 1ns / 1ps


module tbPossRam();
   reg clka;
   reg ena;  
   reg wea;  
   reg[14:0] addra;
   reg[15:0] dina; 
   wire[15:0] douta; 
   //wire[15:0] douta2;
    
    possRam possRam(
      clka,
      ena,
      wea,
      addra,
      dina,
      douta
    );
    initial clka=0;
    always#10 clka=!clka;
    initial begin
    ena=0;
    wea=0;
    addra=0;
    dina=0;
    #201
    repeat(20000)begin
        ena=1;
        wea=1;
        #20;
        dina=dina+1;
        addra=addra+1;
    end
    ena=0;
    wea=0;
    #20000;
    addra=19999;
    #200;
    repeat(20000)begin
        ena=1;
        #20;
        addra=addra-1;
        end
    #2000
    $stop;
    end
    

endmodule

在这里插入图片描述
这里在配置寄存器的时候选择没有原始的寄存器输出~
在这里插入图片描述

rom实现

rom_control.v文件

`timescale 1ns / 1ps

module rom_control(Clk,Reset,addrA,addrB,addrY,addrPI);
       input Clk;
       input Reset;
       output reg [13:0]addrA;
       output reg [14:0]addrB;
       output reg [7:0]addrY;
       output reg [6:0]addrPI;
       
       always@(posedge Clk or negedge Reset)begin
       if(!Reset)
       addrA<=0;
       else if(addrA>=10000-1)
       addrA<=0;
       else
       addrA<=addrA+1;
       end
       
       always@(posedge Clk or negedge Reset)begin
       if(!Reset)
       addrB<=0;
       else if(addrB>=20000-1)
       addrB<=0;
       else
       addrB<=addrB+1;
       end
       
       always@(posedge Clk or negedge Reset)begin
       if(!Reset)
       addrY<=0;
       else if(addrY>=200-1)
       addrY<=0;
       else
       addrY<=addrY+1;
       end
       
       always@(posedge Clk or negedge Reset)begin
       if(!Reset)
       addrPI<=0;
       else if(addrPI>=100-1)
       addrPI<=0;
       else
       addrPI<=addrPI+1;
       end
       
       
       
endmodule

read_rom.v文件

`timescale 1ns / 1ps

module read_rom(Clk,Reset,A,B,Y,PI);
     input Clk;
     input Reset;
     output [15:0]A;
     output [15:0]B;
     output [15:0]Y;
     output [15:0]PI;
     wire [13:0]addrA;
     wire [14:0]addrB;
     wire [7:0]addrY;
     wire [6:0]addrPI;
     rom_control rom_control
     (.Clk(Clk),.Reset(Reset),.addrA(addrA),.addrB(addrB),.addrY(addrY),.addrPI(addrPI));
     
     romA romA (
       .clka(Clk),
       .addra(addrA),
       .douta(A)
     );
     
    romB romB (
       .clka(Clk),
       .addra(addrB),
       .douta(B)
     ); 
    
    romY romY ( 
       .clka(Clk), 
       .addra(addrY), 
       .douta(Y) 
     ); 
     
     romPI romPI (
       .clka(Clk),
       .addra(addrPI),
       .douta(PI)
     );
     
endmodule

测试文件rom_tb.v

`timescale 1ns / 1ps

module rom_tb();
     reg Clk;
     reg Reset;
     wire[15:0]A;
     wire[15:0]B;
     wire[15:0]Y;
     wire[15:0]PI;
     read_rom read_rom(Clk,Reset,A,B,Y,PI);
     initial Clk=0;
     always#10 Clk=!Clk;
     initial begin
     Reset=0;
     #201
     Reset=1;
     #1000000
     $stop;
     end
endmodule

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值