• ram自己写?用IP?


    前言

    ram这种东西,可以用ip方便,也可以自己写代码描述它。

    以下讨论单口ram;8bit*256

    流程

    1.IP:

    使用IP当然是最方便的事情啦,但可移植性差而且可定制性较差。

    仿真波形:

    2.Verilog描述:

    描述就得自己写自己调试代码了,不过写好就是一劳永逸啦。。。

    开始写了第一版代码:

     1 //************************************************
     2 //  Filename      : ram.v                             
     3 //  Author        : Kingstacker                  
     4 //  Company       : School                       
     5 //  Email         : kingstacker_work@163.com     
     6 //  Device        : Altera cyclone4 ep4ce6f17c8  
     7 //  Description   :  8bit*256 ram                            
     8 //************************************************
     9 module  ram #( parameter DATA_WIDTH = 8,DEPTH = 256,ADDR_WIDTH = 8)(
    10     //input;
    11     input    wire    clk,
    12     input    wire    wren, //write high enable;
    13     input    wire    [ADDR_WIDTH-1:0] address,
    14     input    wire    [DATA_WIDTH-1:0] data,
    15     //output;
    16     output   reg     [DATA_WIDTH-1:0] q     
    17 );
    18 reg [DATA_WIDTH-1:0] memory[0:DEPTH-1];
    19 //read;
    20 always @(posedge clk ) begin
    21     q <= memory[address]; 
    22 end //always
    23 //write;
    24 always @(posedge clk ) begin
    25     if(wren) begin
    26         memory[address] <= data;
    27     end
    28 end //always
    29 endmodule

    综合RTL:

    仿真波形:读写同时的时候会有冲突导致xx。

    第二版代码:地址寄存一拍。

     1 //************************************************
     2 //  Filename      : ram.v                             
     3 //  Author        : Kingstacker                  
     4 //  Company       : School                       
     5 //  Email         : kingstacker_work@163.com     
     6 //  Device        : Altera cyclone4 ep4ce6f17c8  
     7 //  Description   :  8bit*256 ram                            
     8 //************************************************
     9 module  ram #( parameter DATA_WIDTH = 8,DEPTH = 256,ADDR_WIDTH = 8)(
    10     //input;
    11     input    wire    clk,
    12     input    wire    wren, //write high enable;
    13     input    wire    [ADDR_WIDTH-1:0] address,
    14     input    wire    [DATA_WIDTH-1:0] data,
    15     //output;
    16     output   wire     [DATA_WIDTH-1:0] q     
    17 );
    18 reg [DATA_WIDTH-1:0] memory[0:DEPTH-1];
    19 reg [ADDR_WIDTH-1:0] address_reg;
    20 //read;
    21 always @(posedge clk ) begin
    22     address_reg <= address;
    23 end //always
    24 assign q = memory[address_reg];
    25 //write;
    26 always @(posedge clk ) begin
    27     if(wren) begin
    28         memory[address] <= data;
    29     end
    30 end //always
    31 
    32 endmodule

    综合rtl:

    仿真波形:

    以上。

  • 相关阅读:
    CSS+JS实现兼容性很好的无限级下拉菜单
    自动切换的JS菜单
    (2)C#连sqlite
    protobuf编译器
    (67) c# 序列化
    (66) c# async await
    (65)C# 任务
    mbatis 入门
    (64)C# 预处理器指令
    (63)C# 不安全代码unsafe
  • 原文地址:https://www.cnblogs.com/kingstacker/p/7545069.html
Copyright © 2020-2023  润新知