zoukankan      html  css  js  c++  java
  • DUAL PORT RAM应用实例

    作者:桂。

    时间:2018-05-14  12:11:00

    链接:http://www.cnblogs.com/xingshansi/p/9035522.html 


    前言

    主要是Xilinx 常用模块汇总(verilog)【03】中双端口RAM的细节补充,限于篇幅,单独列出。

    一、双端口RAM简述

    具体细节参考ug473_7Series_Memory_Resources.pdf.

    这里直接调用IP核。

    二、IP核参数简述

         A-Page1

    • Common Clock:同源时钟
    • Generate adderss..:默认32bit地址,否则根据深度自动调节
    • ECC:纠错
    其他略.
         B-Page2
    • Read First Operating Mode is supported when the Common Clock option is selected.

    • no change mode

    这里使用,通常选择no change mode。

         C-Page3

    Port-A is used for write, and Port-B is used for read.(原语调用需要注意)
    (PORT A/B同理):

    在输出添加一个锁存器,即多延1拍,保证时序良好

         D-Page4

     
    其他略。
         E-Page5
    略。

    三、仿真验证

    任务要求【简化】

    两路周期为64clocks【对应最大延迟数】的数据链,相差delay clocks,现在需要用DUAL PORT RAM进行对齐处理。

    思路分析

    1)选1路为参考,一路进入DUAL PORT RAM修正;

    2)修正思路:对于脉冲信号,信号高为有效->判断延拍数—>根据延拍数进行地址偏移->输出对齐的数据。

    Testbench:

    `timescale 1ns / 1ps
    /*
    Function: DPRAM for data aligned
    Author: Gui.
    Data: 2018年5月14日12:49:07
    */
    module dpram_tb;
    //parameter
    //parameter datwidth = 18;
    parameter delay = 16;
    parameter start = 2;
    //port
    logic clk,rst;
    logic [17:0] datin1;
    logic [17:0] datin2;
    logic [17:0] datout;
    logic [5:0] addra, addrb, counter, delayest;
    logic [1:0] flag;//FSM
    //initial
    initial begin
    clk = 0;
    rst = 1;
    #8
    rst = 0;
    #2000
    $stop;
    end
    
    always #2 clk = ~clk;
    
    always @(posedge clk)
    begin
        if(rst) begin
            datin1 <= 0;
            datin2 <= 0;
            counter <= 0;
        end
        else begin
            counter <= counter+1;
            if(counter == start)
            begin
                datin1 <= {1'b1,17'b0};
            end 
            else begin
                datin1 <= 0;
            end 
            if (counter == (start + delay ))
            begin
                datin2 <= {1'b1,17'b0};
            end 
            else begin 
                datin2 <= 0;
            end 
        end 
    end
    
    //flag control
    always @(posedge clk) 
    begin 
        if(rst)
        begin
            delayest <= 0;
            addra <= 1; //for primitive output register
            addrb <= 0;
            flag <= 0;
        end 
        else begin 
            if (flag == 2'b00)
            begin
            if(datout[17])
            begin 
                delayest <= 0;
                flag <= 2'b01;
            end 
            end 
            if (flag == 2'b01)
            begin 
                delayest <= delayest + 1;
            end
            if ((flag == 2'b01) & datin2[17])
            begin 
                flag <= 2'b10;
            end 
            if (flag == 2'b10)
            begin
                addra <= addra + delayest + 1;
                flag <= 2'b11;//next flag state
            end 
            else begin 
                addra <= addra + 1;
            end 
            addrb <= addrb + 1;
        end 
    end 
    //IP 
    blk_mem_gen_0 uut(
        .clka(clk),
        .wea(1'b1),
        .addra(addra),
        .dina(datin1),
        .clkb(clk),
        .addrb(addrb),
        .doutb(datout)
    );
    
    endmodule 

    datout是datin1的修正,可见datin1修正后的结果—>datout 已经与datin2对齐。

  • 相关阅读:
    Python基础-16生成器-迭代器
    Python基础-15模块-包-库
    Python基础-14异常处理
    Python基础-13面向对象
    Python基础-12解析式
    Python 入门日记(十)—— 文件和异常
    Python 入门日记(九)—— 类
    Python 入门日记(八)—— 函数
    Python 入门日记(七)—— 用户输入和 while 循环
    Python 入门日记(六)—— 字典
  • 原文地址:https://www.cnblogs.com/xingshansi/p/9035522.html
Copyright © 2011-2022 走看看