【JokerのKintex7325】ROM & RAM。

本文详细介绍了在Vivado环境下如何利用Block Memory Generator进行ROM和RAM的配置。通过实例展示了如何使用COE文件加载ROM数据,并提供了基于自增数的ROM配置方法。此外,还讲解了RAM的设置过程,包括写入地址、数据和读取操作的具体实现。

软件环境:vivado 2017.4        硬件平台:XC7K325


昨天才说了fdatool工具箱结合FIR使用.coe文件加载系数的方法,今天继续说说coe文件的另外用法,基于block memory generator的ROM、RAM的使用。


ROM

先说下ROM吧, 使用的coe文件内容是8 bit的自增数。

block memory generator配置如下。

 设置完毕之后,添加顶层文件。

module top(
    input clk_sys,
    input rst_n
    );
    reg [7:0]  rom_addr;  //rom地址,256个数据
    wire [7:0] rom_data;  //8位数据
    
    always@(posedge clk_sys or negedge rst_n)
    begin
        if(!rst_n)
            rom_addr<=8'd0;
        else
            rom_addr<=rom_addr+1'b1;
     end
     
    blk_mem_gen_0 rom_init (
       .clka(clk_sys),    // input wire clka
       .addra(rom_addr),  // input wire [7 : 0] addra
       .douta(rom_data)  // output wire [7 : 0] douta
     );
   ila_0 ila_init (
         .clk(clk_sys), // input wire clk
         .probe0(rom_addr), // input wire [7:0]  probe0  
         .probe1(rom_data) // input wire [7:0]  probe1
     ); 
endmodule

之后编译,运行,debug时候就能看到输出了。


 RAM

接下来说下基于block memory generator的RAM设置。

配置基本就是这样了,接下来对接口作以简单说明。

 之后添加顶层代码如下。

module top(
    input clk_sys,
    input rst_n
    );
    
    reg  [8:0]   w_addr;
    reg  [15:0]  w_data;
    reg             wea;
    reg  [8:0]   r_addr;
    wire [15:0]  r_data;  
        
    //PORTB 读地址    
    always@(posedge clk_sys)
    begin
        if(!rst_n)
            r_addr<=9'd0;
        else 
        begin
            if(|w_addr)        //A写地址不为0时
                r_addr<=r_addr+1'b1;
            else               //A写地址为0时
                r_addr<=9'd0;
        end    
    end
    
    //PORTA 写使能
    always@(posedge clk_sys) 
    begin
        if(!rst_n)
            wea<=1'b0;
        else
        begin
            if(&w_addr)       //当全为1时,表示已写完,使能拉低
                wea<=1'b0;
            else
                wea<=1'b1;
            end
     end
        
     //PORTA 写入的地址及数据
     always@ (posedge clk_sys)
      begin
        if(!rst_n)
            begin
                w_addr<=9'd0;
                w_data<=16'd0;
            end
        else
        begin
            if(wea)
            begin
                if(&w_addr)     //当w_addr所有位全为1时,即地址写满
                begin
                    w_addr<=w_addr;
                    w_data<=w_data;     
                end
                else
                begin
                    w_addr<=w_addr+1'b1;//否则地址和数据自增
                    w_data<=w_data+1'd1;
                end
              end
           end
        end
     
     
    blk_mem_gen_0 ram_ip_init (
          .clka(clk_sys),    // input wire clka
          .wea(wea),         // input wire [0 : 0] wea
          .addra(w_addr),    // input wire [8 : 0] addra
          .dina(w_data),     // input wire [15 : 0] dina
          .clkb(clk_sys),    // input wire clkb
          .addrb(r_addr),    // input wire [8 : 0] addrb
          .doutb(r_data)     // output wire [15 : 0] doutb
        );
     
      ila_0 ila_init (
            .clk(clk_sys), // input wire clk   
            .probe0(w_addr), // input wire [8:0]  probe0  
            .probe1(w_data), // input wire [15:0]  probe1
            .probe2(wea),
            .probe3(r_addr),
            .probe4(r_data)
        ); 
endmodule

编译,运行,debug看到运行结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值