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

原文地址:https://www.cnblogs.com/lanlingshan/p/2782898.html