zoukankan      html  css  js  c++  java
  • 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:

    仿真波形:

    以上。

  • 相关阅读:
    动态增加数据库表字段
    Centos7 + Python3.6 + Django + virtualenv + gunicorn + supervisor 环境配置详解
    typeof关键字简介 -rtti
    c++ typeid获取类型名-rtti
    C++ 中dynamic_cast&lt;&gt;的使用方法小结 -判断类型-rtti
    Java 8 Lambda表达式探险
    Lambda表达式详解
    android:ToolBar详解(手把手教程)(转)
    linux numfmt 命令--转换数字
    android mk odex问题 push apk 不生效
  • 原文地址:https://www.cnblogs.com/kingstacker/p/7545069.html
Copyright © 2011-2022 走看看