• PCI9054学习


    一、首先谈谈Dual-Port RAM和FIFO

        1、相关的概念:PGA设计中,常用到的数据缓存IP有FIFO和RAM,其中RAM又分单口RAM、伪双口RAM、双口RAM。
       单口与双口的区别在于,单口只有一组数据线与地址线,因此读写不能同时进行。而双口有两组数据线与地址线,读写可同时进行。FIFO读写可同时进行,可以看作是双口。
       双口RAM分伪双口RAM(Xilinx称为Simple two-dual RAM)与双口RAM(Xilinx称为true two-dual RAM)。伪双口RAM,一个端口只读,另一个端口只写;而双口RAM两个端口都可以读写。
       FIFO也是一个端口只读,另一个端口只写。FIFO与伪双口RAM的区别在于,FIFO为先入先出,没有地址线,不能对存储单元寻址;而伪双口RAM两个端口都有地址线,可以对存储单元寻址。
      异步时钟域的缓存只要是双口器件都可以完成。但FIFO不需对地址进行控制,是最方便的。

      Altera提供的有:single-port RAM,dual-port RAM,bidirectional dual-port RAM,FIFO,ROM。

        2、串转并的用法

                        

    端口说明:wr_aclr:写清零,wrclock:写时钟,wren:写使能,data[0..0]:写数据总线(位宽为1bit),wraddress[13..0]:写地址总线;

                  rd_aclr:读清零,rdclock:读时钟,                    q[31..0]:读数据总线(位宽为32bits),rdaddress[8..0],读地址总线;

    该模块的RAM的大小为16384bits,写数据总线为1为,寻址总线为14bits,在该工程中模拟的数据包为7136bits;在读RAM的时候,因为读总线是32bits,寻址总线相应应该设为9bits,

    Write Address
     1 /*the addtion of write address*/                                                   
     2 always @ (posedge clk or negedge rst)
     3 if(!rst)
     4         r_ram_wab_reg <= 13'b0;
     5 else if(STATE == 'd32) begin
     6     if(r_ram_wab_reg=='d7135)
     7         r_ram_wab_reg <= 13'b0;
     8     else
     9     r_ram_wab_reg <= r_ram_wab_reg + 1'b1;
    10     end
    11 else
    12     r_ram_wab_reg <= 13'b0;
    13 
    14 /*the high bit of the write address*/
    15 reg    r_ram_wab_hbit;
    16 always @ (posedge clk or negedge rst)
    17 if(!rst)
    18     r_ram_wab_hbit <= 1'b0;
    19 else if(STATE == 'd33)
    20     r_ram_wab_hbit <= ~r_ram_wab_hbit;
    21 else
    22     r_ram_wab_hbit <= r_ram_wab_hbit;    
    23     
    24 /*write address*/
    25 wire    [13:0]    r_ram_wab = {r_ram_wab_hbit,r_ram_wab_reg};    //RAM的大小为2^14=16384bits   
    Read Address
     1 always @ (posedge clk or negedge rst)
     2 if(!rst)
     3     r_ram_rab_reg <= 8'b0;
     4 else if(r_ram_rab_reg == 8'd223)
     5     r_ram_rab_reg <= 8'b0;
     6 else if(r_req | wrreq)//一个包读完后,wrreq才拉低
     7     r_ram_rab_reg <= r_ram_rab_reg + 1'b1;
     8 else
     9     r_ram_rab_reg <= 8'b0;
    10 
    11 always @ (posedge clk or negedge rst)
    12 if(!rst)
    13     r_ram_rab_hbit <= 1'b0;
    14 else if(r_ram_rab_reg == 8'd223)
    15     r_ram_rab_hbit <= ~r_ram_rab_hbit;
    16             
    17 wire    [8:0]    r_ram_rab = {r_ram_rab_hbit,r_ram_rab_reg};

    二、一个比较有意思的序列生成方法

    Array Generate
     1  /*****Generate the number ********/   
     2  /*******3 2 1 0 7 6 5 4 11 10 9 8 15 14 13 12......31 30 29 28********/
     3 always @ (posedge clk or negedge rst)
     4 if(!rst)
     5     count <= 2'd3;
     6 else if(blankout)
     7     count <= count - 1'b1;
     8 else
     9     count <= 2'd3;
    10     
    11 reg    [2:0]    cnt;
    12 always @ (posedge clk or negedge rst)
    13 if(!rst)
    14     cnt <= 3'b0;
    15 else if(blankout) begin
    16     if(count == 'd0)
    17         cnt <= cnt + 1'b1;
    18     end
    19 else
    20     cnt <= 3'b0;
    21         
    22 wire   [4:0]   number = count + (cnt<<2);//此处cnt为3 bits,count 为2 bits。number 为5 bits

  • 相关阅读:
    [转]TeeChart经验总结 5.Axis
    查询
    [转]VS2010安装说明及所有安装出错的解决办法
    [转]游标
    [转]在C#中实现串口通信
    delphi日期的使用
    Http(1)
    表的操作
    存储过程
    CKeditor
  • 原文地址:https://www.cnblogs.com/lanlingshan/p/2782898.html
Copyright © 2020-2023  润新知