RAMB36SDP原语分析

RAMB36SDP是一个大小为36Kb的简单双口Block RAM(SDP=Simple Dual-Port),它其实是Virtex-5系列FPGA的一个原语,Vivado里面并没有RAMB36SDP的语法模板,ISE中才有它的语法模板,如下图所示 RAMB36SDP原语的完整代码如下所示 //

RAMB36SDP是一个大小为36Kb的简单双口Block RAM(SDP=Simple Dual-Port),它其实是Virtex-5系列FPGA的一个原语,Vivado里面并没有RAMB36SDP的语法模板,ISE中才有它的语法模板,如下图所示

RAMB36SDP原语的完整代码如下所示

复制代码

// RAMB36SDP : In order to incorporate this function into the design,

// Verilog : the forllowing instance declaration needs to be placed

// instance : in the body of the design code. The instance name

// declaration : (RAMB36SDP_inst) and/or the port declarations within the

// code : parenthesis may be changed to properly reference and

// : connect this function to the design. All inputs

// : and outputs must be connected.

// <-----Cut code below this line---->

// RAMB36SDP: 72x512 Simple Dual-Port BlockRAM w/ ECC

// Virtex-5

// Xilinx HDL Language Template, version 14.7

RAMB36SDP #(

.SIM_MODE("SAFE"), // Simulation: "SAFE" vs. "FAST", see "Synthesis and Simulation Design Guide" for details

.DO_REG(0), // Optional output register (0 or 1)

.EN_ECC_READ("FALSE"), // Enable ECC decoder, "TRUE" or "FALSE"

.EN_ECC_WRITE("FALSE"), // Enable ECC encoder, "TRUE" or "FALSE"

.INIT(72'h000000000000000000), // Initial values on output port

.SIM_COLLISION_CHECK("ALL"), // Collision check enable "ALL", "WARNING_ONLY",

// "GENERATE_X_ONLY" or "NONE"

.SRVAL(72'h000000000000000000), // Set/Reset value for port output

// The forllowing INIT_xx declarations specify the initial contents of the RAM

.INIT_00(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_01(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_02(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_03(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_04(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_05(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_06(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_07(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_08(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_09(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_0A(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_0B(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_0C(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_0D(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_0E(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_0F(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_10(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_11(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_12(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_13(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_14(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_15(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_16(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_17(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_18(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_19(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_1A(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_1B(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_1C(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_1D(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_1E(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_1F(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_20(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_21(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_22(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_23(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_24(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_25(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_26(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_27(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_28(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_29(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_2A(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_2B(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_2C(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_2D(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_2E(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_2F(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_30(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_31(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_32(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_33(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_34(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_35(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_36(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_37(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_38(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_39(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_3A(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_3B(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_3C(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_3D(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_3E(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_3F(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_40(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_41(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_42(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_43(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_44(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_45(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_46(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_47(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_48(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_49(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_4A(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_4B(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_4C(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_4D(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_4E(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_4F(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_50(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_51(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_52(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_53(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_54(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_55(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_56(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_57(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_58(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_59(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_5A(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_5B(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_5C(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_5D(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_5E(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_5F(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_60(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_61(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_62(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_63(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_64(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_65(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_66(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_67(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_68(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_69(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_6A(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_6B(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_6C(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_6D(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_6E(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_6F(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_70(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_71(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_72(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_73(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_74(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_75(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_76(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_77(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_78(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_79(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_7A(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_7B(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_7C(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_7D(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_7E(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

.INIT_7F(256'h0000000000000000_0000000000000000_0000000000000000_0000000000000000),

// The next set of INITP_xx are for the parity bits

.INITP_00(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_01(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_02(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_03(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_04(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_05(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_06(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_07(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_08(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_09(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_0A(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_0B(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_0C(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_0D(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_0E(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INITP_0F(256'h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00)

) RAMB36SDP_inst (

.DBITERR(DBITERR), // 1-bit double bit error status output

.SBITERR(SBITERR), // 1-bit single bit error status output

.DO(DO), // 64-bit data output

.DOP(DOP), // 8-bit parity data output

.ECCPARITY(ECCPARITY), // 8-bit generated error correction parity

.RDCLK(RDCLK), // 1-bit read port clock

.RDEN(RDEN), // 1-bit read port enable

.REGCE(REGCE), // 1-bit register enable input

.SSR(SSR), // 1-bit synchronous output set/reset input

.WRCLK(WRCLK), // 1-bit write port clock

.WREN(WREN), // 1-bit write port enable

.WRADDR(WRADDR), // 9-bit write port address input

.RDADDR(RDADDR), // 9-bit read port address input

.DI(DI), // 64-bit data input

.DIP(DIP), // 8-bit parity data input

.WE(WE) // 8-bit write enable input

);

// End of RAMB36SDP_inst instantiation

复制代码

       每个36Kb简单双口块RAM(Simple dual-port block RAM)都能被配置为512x64(32Kb)大小的RAM和一个内置的汉明纠错编码(Hamming Error Correction)块,由于要用到汉明纠错编码,所以数据位宽需要多用到8-bit,这样数据位宽就被扩展到72-bit,当数据位宽为72-bit,深度为512时,RAM的大小刚好为36Kb(512 * 72 / 1024 = 36),其中汉明纠错编码操作对用户是不可见的。每次写操作都会产生8-bit的保护位(原语中的ECCPARITY信号),这个8-bit的保护位在每次读操作的过程中可以用来纠正任何单比特的错误,或者检测(但不能纠正)任何双比特的错误。ECCPARITY输出信号没有可选的输出寄存器。原语中两个状态输出信号(SBITERR和DBITERR)的组合指示了三种可能的读操作结果:无错误(No Error),纠正了单比特错误(Signal Error Corrected)和检测到了双比特错误(Double Error Detected)。在读写操作的ECC(Error Correcting Code)模式均开启时(EN_ECC_READ = TRUE 并且 EN_ECC_WRITE = TRUE,EN_ECC_READ和EN_ECC_WRITE为原语的两个参数),读操作不能再存储器阵列中直接纠正错误,而只能把已经纠正完毕的数据输出给原语中的DO信号。ECC配置选项只有RAMB36SDP原语或FIFO36原语才支持。(此部分内容参考ug190的107页到155页)

       Block RAM的ECC(Error Correcting Code)结构如下图所示

       RAMB36SDP各个端口的定义如下表所示

端口名

方向

信号描述

DI[63:0]

Input

数据输入总线

DIP[7:0]

Input

数据输入奇偶校验总线

WRADDR[8:0]

Input

写地址总线

RDADDR[8:0]

Input

读地址总线

WREN

Input

写使能。当WREN=1时,数据将被写入存储器,当WREN=0,写操作不使能。

RDEN

Input

读使能。当RDEN=1时,数据将被从存储器读出,当RDEN=0,读操作不使能。

SSR

Input

同步设置/复位(Synchronous Set/Reset),这个信号用来复位输出寄存器的值为SRVAL,SRVAL是RAMB36SDP原语的一个参数。这个信号不会影响存储器存储单元的内容。

REGCE

Input

寄存器使能(Register Enable),端口输出寄存器使能信号。

WE[7:0]

Input

8位的字节写使能输入,由于输出数据总线为64-bit,一共为8个字节,所以字节写使能输入为8位,详细解释见表后的内容。

WRCLK

Input

写操作的时钟

RDCLK

Input

读操作的时钟

DO[63:0]

Output

数据输出总线

DOP[7:0]

Output

数据输出奇偶校验总线

SBITERR

Output

单比特错误(Signal Bit Error)状态

DBITERR

Output

双比特错误(Double Bit Error)状态

ECCPARITY

Output

ECC编码器输出数据总线

  字节写使能(Byte-Writes):(此部分内容参考pg058的第50页到51页)

  当字节写使能功能打开时,WE总线的宽度为输入数据总线DI中包含的字节个数。例如,输入数据总线DI为64位,包含8个字节,所以WE总线的宽度为8。其中WE总线的最高位对于输入数据总线DI的最高位的字节,WE总线的最低位对于输入数据总线DI的最低位的字节,在写操作过程中,只有WE总线中为1的位对应的字节才能被写入存储器中,为0的位保持原来的值不变。

  假设输入数据总线的宽度为24位,它包含3个字节,所以WE的宽度为3,下图是一个字节写使能开启时往RAM的0地址写入数据的时序图(假设RAM的初始值全部为0)

       由上图可知,当WEA(也就是上文的WE)为3’b011时,DINA数据24’hFF EE DD的后两个字节会写入存储器的0地址,而存储器0地址的最高字节保持00不变,所以第一次写操作完毕以后存储器0地址的数据为24’h00 EE DD;当WEA(也就是上文的WE)为3’b010时,DINA数据24’hCC BB AA的中间那个字节BB会写入存储器的0地址,而存储器0地址的最高字节和最低字节则保持前一次的00和DD值不变,所以第二次写操作完毕以后存储器0地址的数据为24’h00 BB DD。后面几次操作依次类推即可。

知秋君
上一篇 2024-08-30 07:36
下一篇 2024-08-30 07:02

相关推荐