找回密码
 注册
关于网站域名变更的通知
查看: 388|回复: 1
打印 上一主题 下一主题

linux学习之路_基于or1200最小sopc系统搭建(四)--(sram,ssram)

[复制链接]
  • TA的每日心情

    2019-11-20 15:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2021-2-22 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x

    5 g% J/ K8 r) I1 q3 z7 k* a* ^) lØ  DE2-115和DE2-70的存储器配置8 r$ a3 L* H5 _) w' _8 Z

    3 m2 K8 _& q1 ODE2-115相对于DE2-70在存储器方面有两处不同的地方就是:其一,SDRAM容量加倍了,但是DE2-115中的两片SDRAM(32Mx16),在硬件上直接连在一块了(像ADDR,WE,CAS,RAS这些信号两块SDRAM都是共用的),若用就只能把两块32Mx16的SDRAM连在一起当做128M的SDRAM来用;而DE2-70上两块SDRAM(好像各是16Mx16)则是分别控制的,既可以连起来用,也可以分别当做两个独立的SDRAM来用。之所以这样是为了节省信号线吧,但却给DE2-115板上的资源利用带来了很大的不便,比方说,我现在要用友晶的D5M视频采集模块来采集数据,搭建SOC系统,来验证我写的H.264视频编码器。D5M中的DE2-115的参考设计是把整块SDRAM(128M)都当做是视频流的buffer的,这样也忒浪费了吧,况且我如果再搭建SOC系统,移植操作系统的话还有什么资源可用呢(需要把编码生成的bitstream数据通过网口传送到PC机端验证),那便只能拼板,而查了一下两块DE2-115拼板用的HSMC排线,居然要3000多元钱。而DE2-70虽然sdram和FPGA的容量不如DE2-115但却可以满足我的要求。其二,DE2-115的sram,又从DE2-70的32bit 2M同步SRAM(SSRAM),恢复到了DE2(DE2-35)时期的16位SRAM时代,我不是很懂,是SRAM的价格比SSRAM的价格要便宜吗,不过我知道现在的软核处理器(OR1200)都是32位的SRAM控制起来要比SSRAM麻烦得多,得在32bit和16bit之间反复转换。2 l9 L8 i4 X  Q  j2 x6 {' s5 }5 n
    ( Q& }5 [3 h. X0 D3 l9 R; W% b
    Ø  Sram控制器的3中验证方案
    8 A7 B* C' H' y* }* J- C9 F3 f, Q) V+ w" C
    本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。- {. l2 R0 G+ Q
    6 j& [9 ^) O$ u  w; G9 F$ P

    # z3 q5 t2 m% Z& u, T" x0 U$ k7 A* T
    以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。3 X6 J$ C9 T6 ~2 o& q( @

    , w2 [& H$ Y6 O  B+ |我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?, Y+ r( C$ N  s/ u9 d
    1 E: n, T$ J& P- Y$ l
    Ø  DE2中sram控制器的时序要求
    6 u: j- J2 M9 p: j( W( x
    % G6 b1 r3 z7 _; LIS61LV25616的一些常用引脚的功能
    $ D/ @' K# h* }& N5 A- m9 ]5 r4 H' [; N

    , }. ^9 M' T! E5 f: k4 M1 A3 J! A. R# s7 g
    读和写时序按照参照datasheet中所介绍的这两种方式* Z' F/ E8 Z) }& `  f

    / E) o8 g( ?! P" U2 Y3 m/ m7 N& e
    ! ?! H  C  E) f6 `4 }* ?/ g% t0 Z* p* S, i3 F  _* @

    ) s& Y6 q# ~# r& T
    & f9 z5 A( b7 Z( l. |* b" q+ p在wishbone接口中需满足途中的基本时序要求。2 `' v) F1 {, M1 R' j6 s- m

    8 j, ?  Z% E' o' _4 L: tIS61LV25616的verilog model在网络上很容易可以找到
    ( d% k* v8 }) I% \7 a8 y
    ' S3 G* v9 l( z9 }5 r5 ?( `/ d$ ?+ g1 a1 g  b$ B7 |* C4 k
      1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns." V4 y3 L6 F7 S! o9 z4 S
      2 // Note; 1) Please include "+define+ OEb" in running script if you want to check
    3 }: v& H' S( a9 X3 w! ^& I  3 //          timing in the case of OE_ being set.: ?9 N1 @7 L7 B& B* y
      4 //       2) Please specify access time by defining tAC_10 or tAC_12.4 B/ v, Q: P$ r
      5
    . ^& F3 Q: }, s! s# H0 B+ S# J: n, Q  6 `define OEb! Z: Q/ M; V3 W- q9 E6 B
      7 `define tAC_10     //tAC_10 or tAC_12 defines different parameters# v; L: m5 h& q9 j4 M# w: {9 b. `
      8 `timescale 1ns/1ns
      Y, d( ^1 E- k& A1 [8 g: B  9 8 d- j! z, I/ D+ G
    10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);3 j/ ]1 y! }. Q# R9 c+ t
    11 ' u: E0 J) E6 H: a) B! m6 g% a% p
    12 parameter dqbits =16;
    - ?4 @0 T8 c; n8 q4 a1 A 13 parameter memdepth =262143;
    $ B6 S- g$ u/ `# q1 @' W. D 14 parameter addbits =19;
      Y: q+ r$ n" h; m 15 parameter Toha  =2;
    : V& K# _6 Q- n) Y. W; O 16
    7 r/ H% }* G8 l 17 parameter Tsa   =2;
    5 I1 Q1 L( O9 N) S 18 0 w1 s  \( P8 G: D
    19 `ifdef tAC_10         //if "`define tAC_10 " at beginning,sentences below are compiled
    $ y0 F( X0 ]# e; I0 X5 X* e 20 parameter Taa   =10,. h6 Q$ x- d. z# {* `' P& t2 O8 `: O) H2 V
    21             Thzce =3,
    3 ]* v' v: Q. {% y( g 22           Thzwe =5;
    % h$ P1 V3 i  U/ X+ ]0 K+ } 23 `endif2 E8 Y7 ~* z0 Y5 @% Z, Q; M
    24
    : S" d& [. Y2 [2 l 25 `ifdef tAC_12        //if "`define tAC_12 " at beginning,sentences below are compiled# \  ^& T# A# n- K  X; \
    26 parameter Taa   =12,
      @0 t, k/ {& z8 I 27           Thzce =5,
    2 m$ E. t, I6 Z 28           Thzwe =6;
    : ]6 p2 M1 N' k( d& f8 y 29 `endif
    $ B4 [$ B% X- u' N- n2 B: A; U 30
    5 j3 X# o5 l: ` 31 input CE_, OE_, WE_, LB_, UB_;; J3 j, L& g- F$ X, c. P( {6 E
    32 input [(addbits -1) : 0] A;5 y* V% Z' E$ N5 C) I
    33 inout [(dqbits -1) : 0] IO;
    # V0 N- J% J2 \- o7 J& u+ c# h+ F 34  
    ! G2 Q/ q7 D. F2 [$ p 35 wire [(dqbits -1) : 0] dout;
    7 B9 [4 y2 c5 H1 k& { 36 reg  [(dqbits/2-1) : 0] bank0 [0 : memdepth]; & |8 R) c0 s" V/ }; W
    37 reg  [(dqbits/2-1) : 0] bank1 [0 : memdepth];
    0 m! C8 U2 K& H 38 //array to simulate SRAM# K4 C# b  b: C' e/ D- R
    39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};! `, g5 ^, G, X+ ]6 A; \7 ]% R$ o
    40
    7 p) C" v, b  B$ d 41 wire r_en = WE_ & (~CE_) & (~OE_);   //WE=1,CE=OE=0 Read
    ! ^1 u, P# c4 D; u4 S9 i 42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write- Z* M" ^0 q$ R, y2 |
    43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; # T; W8 Z% r9 @& w
    44 6 \& s1 V! `9 R% z) Y' Z& {
    45 initial
    ' W9 O8 Q% d5 P4 O8 d 46   $timeformat (-9, 0.1, " ns", 10); //show current simulation time
    4 P9 D8 z, Z* ~7 N" L! W% w 47 + w) k7 n5 l6 V# l! X
    48 assign dout [(dqbits/2-1) : 0]        = LB_ ?8'bz : bank0[A];, e$ {4 p/ @5 l3 h2 e: [
    49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];
    " G+ v1 S  ^8 r1 r8 M' X( ~ 50
    : f( f5 Z5 u/ o- }0 t 51 always @(A or w_en)
    , h+ f' o: y* f& w2 l/ @! j5 z$ K 52 begin
      l7 C, A( i  G& Z6 d/ F8 W 53     #Tsa    //address setup time
    ' b4 o4 x) ^  q: {! W5 ~ 54 if (w_en)  h1 q; s2 O3 k% Y6 j$ y/ k& Q$ O
    55       #Thzwe
    4 Z& ]- q3 ~$ Y1 n  \6 [ 56 begin
    ' Z" `, w3 v# _4 i0 N2 x 57  bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];
    / y& f$ A  ^/ s6 e0 w& G 58  bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1)   : (dqbits/2)];# n1 z' ]/ c9 m3 _. V% W4 q1 \
    59 end
    ; ~; D% a' z6 I* k# O; w. i 60 end
    % d5 k9 y5 h0 P 61  
    ! \- L/ q6 l/ \( ]  L. K$ l 62 // Timing Check
    4 w8 k. K  w8 C2 q8 _  [5 e3 e 63 `ifdef tAC_10' N: i2 \; y( Y* }
    64 specify//sepcify delay7 o# w+ v# J3 }+ P  w  ~) m
    65 specparam% t; O' ]" @* I8 y1 k5 u3 |8 f$ h7 d* n4 v
    66       tSA   =0,* L- P# B& b% Q& i
    67       tAW   =8,6 I8 A- |' k* A7 T6 p
    68       tSCE  =8,. d  q7 d2 v$ b$ E; m. S1 k
    69       tSD   =6,- B/ ]5 S; x3 Y
    70       tPWE2 =10,, l" Z$ `  ?: t
    71       tPWE1 =8,! n2 q* ]- r9 B: v/ m5 B
    72       tPBW  =8;$ Y$ q- I) r3 T8 }4 l8 s
    73 `else9 C# Z$ `& I- W* ~3 H8 C3 H
    74
    6 I) _# L  ?) A! R# {: E: }9 a- l 75 `ifdef tAC_12
    , o4 f: i6 ^& ^6 f% S) p; G 76 specify
    % D* T: _9 D& F0 _1 Z; J 77 specparam
    ; a+ J5 z3 f' m! w. r" { 78       tSA   =0,
    5 M/ `1 ~! n) f" X 79       tAW   =8,# _$ R  C7 V) Y) m+ O
    80       tSCE  =8,
    ! n# Q- ]" D& R 81       tSD   =6," w' \$ i3 ^# f. ^# c& Z; _
    82       tPWE2 =12,
    6 J" j! h$ v' R8 K+ Z7 | 83       tPWE1 =8,1 [; v) @7 |9 N8 o
    84       tPBW  =8;5 _% z) j0 p. L" t; c# s5 h
    85 `endif
    % P9 Z: ~4 Y! l1 |2 b* w: f+ g7 R 86 `endif: F: u# I9 r$ f# M  K) H
    87 ! `5 j, @& d1 @' K2 \- B
    88     $setup (A, negedge CE_, tSA);- |8 @4 S  r# r% v
    89     $setup (A, posedge CE_, tAW);% K% u# v! w' z& y3 h; u
    90     $setup (IO, posedge CE_, tSD);
    " w2 G# k9 \8 p8 |5 }0 L 91     $setup (A, negedge WE_, tSA);
    # y' Y6 |' A" B/ w/ a1 C 92     $setup (IO, posedge WE_, tSD);
    1 @8 n( [# v) Y' L7 ~+ A/ W% t+ n 93     $setup (A, negedge LB_, tSA);
    + y3 l% {/ r' ]3 B* Z" {3 |5 Q 94     $setup (A, negedge UB_, tSA);
    % H8 o, R/ I, ^& m3 k3 c& x5 V 95
    * o' `" V( |+ ]  { 96     $width (negedge CE_, tSCE);% o" D' T0 u& B+ P% b# X
    97     $width (negedge LB_, tPBW);
    ; ]6 I" v' |4 [) d 98     $width (negedge UB_, tPBW);  g1 h* i% Z& _) N
    99     `ifdef OEb* {1 Q: X$ }0 a2 {  |6 K1 X6 O
    100     $width (negedge WE_, tPWE1);
    - O2 v! U6 U/ p) Y101     `else- s0 y& C; d( F
    102     $width (negedge WE_, tPWE2);
    & L! Q$ ^! j# r1 C5 K103     `endif" z/ s; J/ ^3 Q- J* R
    104
    4 l; R1 j& W: |' k' d105 enDSPecify% [  W* X4 o3 M7 y2 E
    106 ; k4 l% Q4 l( |5 |
    107 endmodule8 l0 x, H: m- V4 ~5 r
    ( v1 V- r( `9 W1 t% ?  x
    # s& b1 g! y  Z* Q# ^
    - j/ R) K  a3 r  H) H" ?
    $ e# Q! Q+ V! [" H6 b
    Ø  Sram控制器的设计
    8 E- e1 q- U% @! u5 t0 M  y0 z; U" e7 P4 q8 d7 p, M
    Sram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。6 |! G4 m- N- {" N

    . s7 u( \8 t1 G" _  `- d- NSram_wrapper的源码
    * J. F" G8 W4 I; W- O/ q# B' a5 c
    // Author(s):
      r4 K* S' k9 o1 {1 t// - Huailu Ren, hlren.pub@gmail.com
    + ~7 K5 {: J- x//) s  L; ]7 V* {/ }3 R, H% g

    1 \. Y% \2 Y2 g/ ]2 S/ B// Revision 1.1  16:56 2011-4-28  hlren7 o$ I; E- f8 V# Y, e. z  V- T, E
    // created
    , P; Z. }" O1 z. i9 A//
    5 v" M; |* K! _% y4 G, j
    # S1 S2 ?+ z, U9 `7 t6 j. ?// synopsys translate_off3 r/ u% y' ?- Y2 n: |8 W
    `include"timescale.v"
    / n" x) Y5 Y, J3 b& R+ f, \* @// synopsys translate_on5 Q8 K+ f% B% H3 U

    1 ]( v* p! e- }5 I% [5 d( nmodule sram_wrapper (' K& S  ]  o: t9 g7 `
        wb_clk_i,: [# Y# j2 s+ \1 s! b0 e
        wb_rst_i,
    - K* a! ?9 `5 V' n- S+ D- Z5 l$ Y7 e
    2 m: U4 q0 v% \+ I2 c& E8 r    wb_dat_i,
    8 D6 V0 N6 }* G! V8 G; j+ I    //wb_dat_o,; @; C! _+ Z  a$ x$ a1 o8 D
        wb_adr_i,# X( W" [( ~5 M
        wb_sel_i,$ H( ~, M+ D. M+ j
        wb_we_i,# b4 E  N. l  R. ]1 Q2 s
        wb_cyc_i,
    . f5 m$ W2 u4 b# e$ j( s+ U  f    wb_stb_i,
    : l& W" Y! @4 a" i" q: F/ S# E# A* q6 X# K5 |) p+ s

    - k. ^/ L, T: i2 k4 u. p    // Bi-Directional" |, i! C, l6 F. g- G& x
        SRAM_DQ,
    & |- G1 C* f# A& Y& S* n7 V* s" U8 Y2 \! l
        // Outputs
    # E9 r, [1 L! ]8 G7 |    wb_dat_o,) x* o* e$ ]1 y( A' I
        wb_ack_o,1 w; X8 \" `6 W  h
        wb_err_o,
    / s. A( `5 _" H- ]9 g7 z   0 a% f& m/ A, ]
        SRAM_ADDR,3 K8 ~$ d4 ^: L* R0 u# P! D6 g
        SRAM_LB_N,
    * n7 A0 S' c: e7 v+ i    SRAM_UB_N," h5 `) |0 D; {4 w3 `
        SRAM_CE_N,2 J+ a$ ?" M1 t2 r# }) ^* U# [! p
        SRAM_OE_N,$ O! W2 N; U/ x! w. Z
        SRAM_WE_N6 Q$ ^8 C) |! v: o
    );3 A1 g; o. o# Y" g% E4 O

    ) h4 k+ |+ |, G' V2 v+ v: c: F//
    3 m9 i% N8 E# J' g// clock and reset signals
    ; R- p5 m$ n5 r' v6 E: ^9 e  K  u//
    . V$ l0 m* G; `0 uinput         wb_clk_i;( ?6 X* b1 D4 y0 V2 ]
      input         wb_rst_i;
    # ?* e5 h; t: [$ l7 k8 l  _& ]9 ?//
      V  J. I  |" z. T  [# N" B) u// WB slave i/f0 b( E# w, Z( f7 c; a) r2 q; y
    //
    / x) P2 y  q+ c! _; R8 c, D  ]input  [31:0] wb_dat_i;
    9 U5 A. ?8 l# {: J% B' L  output [31:0] wb_dat_o;
    ( h2 R; v$ ^* y+ ]  input  [31:0] wb_adr_i;
    1 S4 r4 i) C/ O; D4 y  input  [ 3:0] wb_sel_i;' J% O1 Z4 ?6 L' d9 B  N
      input         wb_we_i;
    3 @* P1 q5 K7 k# O  input         wb_cyc_i;/ K8 P, K$ G7 R; t: @' \+ R6 u( Y
      input         wb_stb_i;- R9 P# {' u2 ?; _- ?; M3 K+ ^- }
      output        wb_ack_o;, x, b, F4 `$ o3 z7 Q
      output        wb_err_o;
    & \6 ?! g; w- w# D# H  X//8 J5 S% @3 y9 \$ g# _) I; d; e
    // SRAM port0 R" q4 R2 W( v' U
    //
    ) b5 \' O( j0 y6 S! [) h. z6 i) kinout  [15:0]   SRAM_DQ;    // SRAM Data bus 16 Bits
    " K" n" I, o& W0 g# F3 n( V' f& Joutput [17:0] SRAM_ADDR;    // SRAM Address bus 18 Bits" w3 `. F* e# `6 X
    output        SRAM_LB_N;    // SRAM Low-byte Data Mask/ i6 \6 \' X8 G6 m$ C* V6 L
    output        SRAM_UB_N;    // SRAM High-byte Data Mask2 D! h% h. e4 A, d
    output        SRAM_CE_N;    // SRAM Chip chipselect
    ( n) L3 Y( w6 m4 boutput        SRAM_OE_N;    // SRAM Output chipselect
    1 y+ Q7 T: `9 ]7 K; O* w0 ooutput        SRAM_WE_N;    // SRAM Write chipselect2 D+ A& _. C& u/ t. i3 I

    : s! l* \2 c4 d  reg    [17:0] SRAM_ADDR;& A6 j& |0 e5 _" m5 ]" u
      reg           SRAM_LB_N;. q$ M. y5 P; u  Q5 O0 b: f9 t
      reg           SRAM_UB_N;7 e+ d4 i8 G9 z7 y7 x) p
      reg           SRAM_CE_N;
    8 z0 E4 I5 p2 O* a' A1 a9 @# s( s  reg           SRAM_OE_N;
    $ r4 J  K' w6 [" q- w6 F  reg           SRAM_WE_N;# N" v4 s1 P# `* q

    6 ~" q  C; p5 |# d, c  reg [3:0] state, state_r;
    ) j4 k1 A8 G, k) o& B2 X& v' A  ^  reg [15:0] wb_data_o_l, wb_data_o_u;, C% Z6 I7 A, v+ S% W
    ! d# N2 f4 _( j; `: h5 ^/ q$ |
      reg [16:0] wb_addr_i_reg;
    3 e' F% u3 Q6 r3 [; g  reg [31:0] wb_data_i_reg;
    9 g; c+ D2 t# h- t  //reg [31:0] wb_data_o_reg;
    ( N" z. A: |1 ^reg [ 3:0] wb_sel_i_reg;6 a! f( T3 B' \5 y8 m
    . e# _+ m2 l0 W9 e" J
      reg ack_we, ack_re;* Y1 W; ^$ \7 p. A7 C" G
    // *****************************************************************************3 e& j& M. B9 T+ Y" q
    //  FSM2 u7 ~- a; g! h* a2 @5 s) |
    // *****************************************************************************6 y( R7 y+ \) Z1 E
    localparam IDLE =0;3 h- c5 G; H  h, o' j' M- E, W
      localparam WE0  =1;
    " v% X0 x& L6 l  localparam WE1  =2;
    " \7 @8 w4 G; J7 S* ^, p) Z: s  localparam WE2  =3;# V- ?$ o% u' s: X4 W9 q# d. p( I
      localparam WE3  =4;
    ) C6 H; [; f5 ~5 ^' j4 a/ c  localparam RD0  =5;+ w4 z8 Q. G6 J  E0 \
      localparam RD1  =6;
    & U. Q* c' `5 p  localparam RD2  =7;
    7 a& k/ l0 K* @6 I" |+ t' a7 v  localparam RD3  =8;
    0 M$ r- M7 N$ @8 d* O+ N+ \( Q  localparam ACK  =9;
    % k; E+ M0 \3 U
    : A, F, R$ ~2 I0 h1 J0 P) y  assign SRAM_DQ =  ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0], D7 B3 W( O% e& d9 a5 Z
                        : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]
    7 `8 F4 S, O6 j9 F                    : 16'hzzzz);" e* V3 V# B: _+ ]; t! P
    assign wb_dat_o = {wb_data_o_u,wb_data_o_l};/ G6 g+ P9 M7 r7 N+ r
      h! e& \4 l( |7 C: i
      assign wb_ack_o = (state == ACK);2 b5 d3 J3 _& y) i- j" e
      assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);
      ?+ I! V) G+ M7 V9 a6 Y. j : n5 v, k6 U8 I% j6 P0 P% _$ d) W
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    1 S4 H6 ~) U# h# o    if(wb_rst_i). N8 Y5 f2 G% X$ H
          state <= IDLE;/ u4 N+ R# ]1 {% K0 h
        elsebegin1 x( L, d; j5 y  E' k
          case (state)
    1 r7 Q1 y: c* G: {$ f- V- r; o        IDLE : begin
    ; \+ K9 O& ^& Z# g          if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)
    1 T+ q1 I7 B6 |8 r9 V            state <= WE0;
    5 w, c- D! m" O7 v6 A7 s& @0 C          elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
    ! M6 S1 w& `5 B# L6 O            state <= RD0;: D, H* E, @6 C: r4 a+ S
            end
    : c  B/ B* H6 V7 b* R        WE0 : state <= WE1;, Q3 t/ T1 i: p8 m2 y
            WE1 : state <= WE2;
    $ q  S. L) N- h# g        WE2 : state <= WE3;
    & I4 m2 d: w) |        WE3 : state <= ACK;
      @8 k7 K) C0 B6 U, _        RD0 : state <= RD1;
    8 a! @2 I6 Z. C( X0 c( `( L/ {        RD1 : state <= RD2;1 T2 q1 N" s% m& Q
            RD2 : state <= RD3;
    " j; b, w0 f/ }" ]) H' m8 N+ O; {        RD3 : state <= ACK;
    % K" A! i0 \4 A% s% ^# @        ACK : state <= IDLE;$ Y) N, P% v6 [+ P2 M, \" R! u; s  |$ n% f
            default : state <= IDLE;
    + R% X8 y" C+ p! S- ?9 f6 w  `      endcase6 i- F) g2 d! n
        end) F# d5 ]$ H5 f2 F/ K: l6 u
      end4 \4 V$ \/ h1 b, g3 d2 e' ?9 q& s+ M
    # N' F" C* T. F* ?/ e
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin) K; Q- C( A! \- E9 R
        if (wb_rst_i)
    . G( s0 [! r8 [0 Y: g! `      state_r <= IDLE;7 g3 c* h  H# ?
        else
    / S2 w' T) b0 S: g$ l  d3 u' o  H      state_r <= state;/ T5 J( Q1 U& Q
      end
    ! w; b# Y) ^' j& c! r1 ^//
    " [1 W3 o) F" `' e// Write acknowledge
    1 C6 B: v6 b/ T2 n- k+ W% R6 o. e//
    " c8 P  G, o' q) g/ R0 ?" i# o; galways @ (posedge wb_clk_i orposedge wb_rst_i) begin* @: a- J8 ]/ h
        if (wb_rst_i)
    - c+ k2 E+ {. s  ?      ack_we <=1'b0;
    . f' y4 h3 |9 C8 v8 ~) F" Xelse
    3 V& U- ]+ F' K1 G. A    if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)  N3 j: H4 K; A; D6 }1 w
          ack_we <= #11'b1;0 ?- C. g! z: ], h! D
    else
    ) P$ o( L. ?0 q7 i      ack_we <= #11'b0;
    % ]  U! z# i, c( ~# r4 dend
    ) w8 q* c3 c- H + N3 L2 w0 g4 L) l) P+ z
    //
    2 a1 [' s4 S, j6 n+ w  B// Read acknowledge
    2 g8 p' ]2 S; \% y+ f- S//+ Y. B& Y; q  I: l* d; s4 f
    always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    8 `/ z4 d1 p$ j# v6 T0 o$ p9 U    if (wb_rst_i)
    - H- ^3 I; y5 Y% O" M/ [& P8 D# B; z      ack_re <=1'b0;
    + B# E  `1 n" j& `. P: ielse' T2 u, w; C0 g' o7 L: y
        if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)+ v* h7 I  e4 i4 b
          ack_re <= #11'b1;8 H; C, X5 D3 r: N/ b, a4 \. ?
    else# j% U/ _. }, L+ `8 D
          ack_re <= #11'b0;
    " A0 o) L$ A& C/ C: K9 U) lend0 Z& {% N6 T- \" t

    6 l. @9 P/ Z; R8 T4 P. _  always @ (posedge wb_clk_i orposedge wb_rst_i) begin4 M6 E7 w1 Y6 R9 h! C
        if (wb_rst_i) begin
    & J" I2 F  @# w5 r5 Z) {      wb_addr_i_reg <=32'b0;
    7 M4 H4 }$ b; H. q5 c$ d/ d      wb_data_i_reg <=32'b0;# E/ R# g5 b5 A$ i8 h
          wb_sel_i_reg  <=4'b0;! N$ e+ C; v5 P% a* L. ?9 z3 z8 E
    end2 m8 k9 |7 d9 I, o2 z6 B0 l( A& j. H
        else& I; B* T- s2 y7 Z: o9 u
        if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)2 o  k7 F8 f+ E; ?
        begin
    ) g0 @8 X$ J6 k- m4 D      wb_addr_i_reg <= wb_adr_i[18:2];
    / Q8 [0 U# V% g' q8 n7 A& d      wb_data_i_reg <= wb_dat_i[31:0];; e$ @7 I/ Z/ s$ |2 P+ f
          wb_sel_i_reg  <= wb_sel_i[3:0];
    + b6 m! h- k" T0 ^) W/ x" P    end
    3 d; C) U! {$ K. b8 b  end5 W# @3 r8 M' d9 k4 A) T  u# P2 @  L

    2 f) `: A: a- e) {, e7 }  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    3 |& r) l, M3 u) n0 w& G    if (wb_rst_i) begin) v. {! ^3 S$ f* R/ K# K1 d
          SRAM_ADDR <=18'b0;
      @  O+ c7 h( E) O+ U( nend# t0 u# _( L  t& E( t6 a* P, ~+ \. @
        else
    # H  `9 P# e( Q% _; }5 r7 @      case (state)
    2 \' D8 o/ X$ Z8 M  _+ I        WE0, WE1, RD0, RD1 :
    % n# B9 p+ ?1 h  R4 [6 f7 c; W' M          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};9 y/ T) ?3 C. F+ n3 ?* w
            WE2, WE3, RD2, RD3 :  {- K, k  e) [# v
              SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};
    6 o; Q" ~5 d% Y" rdefault : SRAM_ADDR <=18'hz;+ V3 ]4 E0 N% G4 J" S! @2 S
    endcase
    , I/ f. h! A8 r3 A$ m3 J2 W  end
    7 Y: `) [% m& A: f
    , q6 K) m. R3 r: U% g0 N# M  always @ (posedge wb_clk_i orposedge wb_rst_i) begin3 g# G. ~/ Q/ p' N4 z7 _
        if (wb_rst_i) begin
    " K3 @2 I) e& J8 `      SRAM_LB_N <=1'b1;4 q+ e. {7 e& N, K$ X; H
    end
    $ m1 _$ S( H5 m& p5 g6 q6 _    else  o+ v, t( Z5 W0 c7 L& n
          case (state)3 B) C! S. f# a# I0 c
            WE0, WE1, RD0, RD1 :
    ) Q: q  J/ R  j+ L          SRAM_LB_N <=~wb_sel_i[0];
    ) O- n/ z0 y8 @5 H        WE2, WE3, RD2, RD3 :
    % L$ S( E0 W4 c- g' n$ q) x          SRAM_LB_N <=~wb_sel_i[2];
    3 \: w  Q/ B8 D" k: [        default :
    2 W# |, d1 Q9 a- z' X          SRAM_LB_N <=1'b1;
    : [7 t6 M) x  X" z% Zendcase
    8 k4 \( }, M9 j+ s; B/ [  end
    4 p9 K2 g+ p" e* \& o1 g/ ]7 _ : ]) I& r3 i4 T4 }$ R# m
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin* I. t$ G; S! O& I5 e3 _- s" z; i
        if (wb_rst_i) begin
    4 G: w* F1 y* r# L' I2 `0 H      SRAM_UB_N <=1'b1;
    " L' l0 ]# ]1 r1 b; Jend: u* W- `- o! P
        else4 V) g2 m7 }2 k: t. ]; `
          case (state)/ g* M) \/ V& g! G: ^6 k; S5 A0 h+ a
            WE0, WE1, RD0, RD1 :4 n/ ^' t6 J; B1 {: ^9 l4 Y
              SRAM_UB_N <=~wb_sel_i[1];7 c6 d7 }! G5 G/ k0 b
            WE2, WE3, RD2, RD3 :
    ; A+ i  s+ ^5 v  w; C/ ~7 z          SRAM_UB_N <=~wb_sel_i[3];
    7 H+ e& @4 s1 b/ f/ C% A3 m        default :
    7 F% H% x5 q% a* E& o/ c6 A6 ]2 h          SRAM_UB_N <=1'b1;0 l( G5 e) @( m' q1 ]
    endcase
    7 x% d# ^. U. l6 H) m5 g  end
    4 \8 i& ^2 j9 N
    5 {' B- W) ?6 S# U  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    8 b, K" c+ i+ Z0 |1 x    if (wb_rst_i) begin+ K% F! x$ e# @% E. h
          SRAM_CE_N <=1'b1;
    5 W' N& z6 j9 {end
    & c/ g& n7 ~: @0 ]; V+ ~- N    else
    ; Y& G+ t4 v/ r; B2 }  J; m/ U      case (state)' C4 k% [9 Q% \8 h7 ~
            WE0, WE1, RD0, RD1 :
    # X3 X. e: _3 f, @1 Q9 C+ O          SRAM_CE_N <=1'b0;5 u2 q; B/ B- C
            WE2, WE3, RD2, RD3 :
    ( B" i# ^; c  E* T/ t  g$ f          SRAM_CE_N <=1'b0;% ]; L5 [  g1 U) R$ E: ]3 d
    default :
    * z- I! ]/ W: o: r          SRAM_CE_N <=1'b1;2 L) }/ E, z3 @/ y" t1 T6 }
    endcase0 V) |# r3 ^/ P
      end$ y$ n  y3 g  {1 |- @- e

    8 q; R7 s5 {- V  always @ (posedge wb_clk_i orposedge wb_rst_i) begin" {8 G- o3 ]2 y0 i) J, H8 b: B
        if (wb_rst_i) begin) ]& {' \' Y- t
          SRAM_OE_N <=1'b1;
    3 U- ?, Y- ]" j/ Q( u' F' T. X5 wend: L2 T5 r9 G9 M; f3 v
        else2 N3 |) }9 C* c9 l  V; q; O- p! w8 K' A
          case (state)
      x1 i; K: ~0 d# S; |7 a        RD0, RD1, RD2, RD3 :& t! t+ {. ~" K$ K! N2 [: C+ q, Q
              SRAM_OE_N <=1'b0;
    $ N+ C- e2 P" m& [/ bdefault :
    6 C. f4 S) V9 j          SRAM_OE_N <=1'b1;+ R& N% n8 ^' Q3 t
    endcase
    , @" O! X. R1 u  end3 O6 a2 `9 u7 r7 K5 N

    8 z+ l. E6 G- k( P6 H" u/ m, W  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    4 K2 p+ r* e% x* ]    if (wb_rst_i) begin1 \3 r0 W  z; c+ u: u
          SRAM_WE_N <=1'b1;
    ( M1 d7 x$ r; A- S# _end
    6 u2 P/ [$ h: D    else
    ( M* ]  B+ g6 f# T      case (state)$ O* P/ m$ |8 a% I8 M$ L, g
            WE0, WE1, WE2, WE3 :
    ) Q& ]4 e$ @; r% G" K& j          SRAM_WE_N <=1'b0;
    % V3 m! [' ?; _2 Zdefault :" `! O/ d6 U3 @; L
              SRAM_WE_N <=1'b1;4 n4 u! i4 j* t! j. G8 N% A* F
    endcase
    * B/ D! E- B- {  end+ n. @( ^6 z. f& B, s
      //; R4 F$ T9 g5 ^+ r
      // assemble ouput data
    5 U2 j9 V: X, R7 E  //. J0 W6 g  R1 n6 u& `, D
    always @ (posedge wb_clk_i orposedge wb_rst_i) begin6 K/ o- V  `, ?- D" _- c+ L
        if (wb_rst_i) begin
    - O# T* y/ {0 L2 [6 N# {$ X      wb_data_o_l <=16'b0;- m9 \. |& H2 ^1 A+ D) W
          wb_data_o_u <=16'b0;& `4 x% b+ f0 V$ x; y! `1 f, n' d
    end
    3 u+ N1 b  {4 F* j) F+ v. H) b    else
    * N5 D. k( B6 X' P6 ?2 x      case (state_r)6 x9 |+ F5 R" }) L# [
            RD0, RD1 :/ G* c1 P& A3 ]/ t
              wb_data_o_l <= SRAM_DQ;" r# _- P$ L5 J0 l+ N
            RD2, RD3 :
    ( q/ \1 S1 y5 ~9 X# r; W& Q          wb_data_o_u <= SRAM_DQ;
    5 e2 E6 H1 A5 \' v9 a) b      endcase9 r* M# s2 I1 ]5 P+ E
      end
    " T/ A  q( V+ V5 j" Oendmodule
    7 T' Q$ z( c* f0 u& I+ e0 C9 V. a; U  p7 f

    $ Y% y( _* y; o* k; U) dØ  Sram_wrapper的wishbone BFM验证- V9 u7 U3 x8 D4 u! n+ I
    . i5 t) A2 D7 l* \
    Sram_wrapper的BFM验证的testbench代码如下:( |% G9 J- }2 B

    / h+ B2 n  m+ D) M8 c
    # G% `8 B8 x: q" c4 Z9 H  1 // Author(s):
    6 R2 ~# l4 Y8 O. Y  2 // - Huailu Ren, hlren.pub@gmail.com
    8 f6 Q  K$ h# a2 ^$ i6 C' t  3 //+ g$ G% U6 |6 s6 C* }
      4
    0 Y* ^+ P$ B- G  5 // Revision 1.1  17:45 2011-4-28  hlren
    / O9 h) `7 T' H  6 // created* K1 ?5 {( J+ X; D
      7 //7 t# T( d% ^4 s  j
      8 8 k8 u) ^$ D/ f+ P. p" m
      9 // synopsys translate_off
    6 @/ W( l. {6 A1 E  h 10 `include"timescale.v"
    : s0 q  E% V+ b: ]$ G, i6 r 11 // synopsys translate_on
    . C$ l7 |; w0 A( P2 f- q 12 $ s- U/ @- N" `5 ^+ x
    13 module tb_sram_wrapper ;8 T5 x  v8 X3 ], ^5 ~
    14
    # P/ p+ S/ O7 Q* Y* j( J% y 15 //
    ( N6 S' C' @+ S$ r 16 // clock and reset signals
    % V9 [: |- p) T 17 //
    6 v" b: w9 ]; _3 T 18 reg         wb_clk_i;! |7 X0 |* w  b, b! F
    19 reg         wb_rst_i;
    + ^) i( H" d/ Y 20 - |2 ?) z1 z3 Y& {8 |" C* U
    21 // *****************************************************************************
    5 V2 ^1 ^5 B& {5 X! j 22 //  wishbone master bus functional model  _. P7 p( \; x  {8 i: g! m
    23 // *****************************************************************************
    7 Q/ H- H" \4 D% r  z5 |0 d 24 ; e3 b/ S" k6 z9 x5 G3 W
    25 wire [31:0] wb_din_w;- G/ T$ z$ \- M+ H4 ]" r$ Y+ i" e' A
    26 wire [31:0] wb_dout_w;
    . ?. k& J# L1 K 27 wire [31:0] wb_adr_w;
    : @4 ~5 l, _/ ] 28 wire [ 3:0] wb_sel_w;. o) R0 f  Y# Z, Y4 L! b
    29 wire        wb_we_w;
    : l: J+ k# C5 f4 Y0 E0 R 30 wire        wb_cyc_w;7 K* E: K! y4 o& f$ v: }* _$ g. V: z
    31 wire        wb_stb_w;! `) b* c. i3 N6 D) a- J
    32 wire        wb_ack_w;1 _* A/ F, W1 ^* i2 J
    33 wire        wb_err_w;3 [* [9 h+ I& ]) F
    34   
    3 j" Y' T* q7 N5 [ 35   wb_mast u_wb_mast(
    ) a% T8 ^9 Y4 t. a 36     .clk  ( wb_clk_i ),
    1 b$ M* d) v1 Q8 L; C 37     .rst  ( wb_rst_i ),
    & I7 e3 _7 k, _) C7 I& ] 38   
    , D2 m  G' [5 }( u1 x 39     .adr  ( wb_adr_w ),  v0 |! b  ~1 E
    40     .din  ( wb_din_w ),
    6 i, u6 u8 X" J9 O& q' v2 G& l 41     .dout ( wb_dout_w ),
    8 F7 R" A' D5 G0 o7 i0 W) r" F 42     .cyc  ( wb_cyc_w ),
    % E: Z- X7 i6 w3 j  Z0 S 43     .stb  ( wb_stb_w ),0 A& n% ~% @- h" X$ ~; o& _% h0 k
    44     .sel  ( wb_sel_w ),
    5 m/ i( A8 J7 X! X' Q8 O 45     .we   ( wb_we_w ),
    $ X$ U  I" H4 y" ]' X 46     .ack  ( wb_ack_w ),
    : i/ A+ ]) T3 X0 z! e; X# P& C4 X 47     .err  ( wb_err_w ),2 [. g1 x" v  e- P6 T9 U  n- H$ M
    48     .rty  ( wb_rty_w )
    ) T5 i$ M1 y: { 49   );) k2 H2 b5 ], v" _$ u
    50 ! L7 o) }4 p  X. L5 M
    51 // *****************************************************************************
    # a6 F0 M% [8 y 52 //  sram controller* a# O; k/ N5 i. G
    53 // *****************************************************************************
    4 ?/ o2 j% a2 }" w 54 4 {, U7 `# @  Q  l5 Z  Z! Q
    55 wire [15:0]   SRAM_DQ_w;    // SRAM Data bus 16 Bits
    : {, ^8 M1 s. R, M 56 wire [17:0] SRAM_ADDR_w;    // SRAM Address bus 18 Bits' R% L3 G6 m3 e/ \  \: G7 B7 U$ _
    57 wire        SRAM_LB_N_w;    // SRAM Low-byte Data Mask; [! x' Z$ |# C9 X9 Q! S7 A
    58 wire        SRAM_UB_N_w;    // SRAM High-byte Data Mask
    2 a# i1 E, g3 X4 F. t( y+ { 59 wire        SRAM_CE_N_w;    // SRAM Chip chipselect
    ; `  X! ~; D7 V/ Q2 R 60 wire        SRAM_OE_N_w;    // SRAM Output chipselect: ]! ]1 U# v: f0 h; T
    61 wire        SRAM_WE_N_w;    // SRAM Write chipselect; O' ~" b8 i5 _! B" E
    62 7 A  p7 Y* l% Y# y7 u/ B+ w
    63  sram_wrapper DUT_sram_wrapper(7 ]" |2 q  y5 k# X
    64     .wb_clk_i  ( wb_clk_i ),8 ^" f! n7 y& _+ c
    65     .wb_rst_i  ( wb_rst_i ),
    + k, V9 d3 A' r' k1 u. T# O0 H 66   
    ( W3 ^" f% A  Z 67     .wb_dat_i  ( wb_dout_w ),
    ( ~1 `6 b/ i: P- h' {9 F: J" _ 68     .wb_dat_o  ( wb_din_w ),* k* _1 p0 D! v$ N
    69     .wb_adr_i  ( wb_adr_w ),
    ( |: t& ~6 z3 D( E; b3 F0 g2 s 70     .wb_sel_i  ( wb_sel_w ),- x, m& c. |! p, t! I( N
    71     .wb_we_i   ( wb_we_w ),1 b  `. U' N/ m: Z' l1 n' o
    72     .wb_cyc_i  ( wb_cyc_w ),8 O* @) v3 ^0 r" x1 i: ?( T
    73     .wb_stb_i  ( wb_stb_w ),
    , s$ o& L  a  b% d  S2 `5 |' b 74     .wb_ack_o  ( wb_ack_w ),
    ) N- @6 J. i( f+ l+ ~0 k0 g6 e4 E 75     .wb_err_o  ( wb_err_w ),
    " q' u/ f/ R. h) c& b+ Y 76 0 U, T% \. {6 e3 y
    77 // SRAM
    7 B: V2 D) r5 j' m* t1 m" c  ~ 78     .SRAM_DQ   ( SRAM_DQ_w ),5 A/ _" ?. h- \; M) _4 Z. m9 X
    79     .SRAM_ADDR ( SRAM_ADDR_w ),) D0 ?6 c/ \- J  k/ O( \
    80     .SRAM_LB_N ( SRAM_LB_N_w ),
    , s+ u) X% G( A" j 81     .SRAM_UB_N ( SRAM_UB_N_w ),
    # O  M: ^1 K6 i 82     .SRAM_CE_N ( SRAM_CE_N_w ),
      O3 j: K/ Q5 t9 \' [) L/ H 83     .SRAM_OE_N ( SRAM_OE_N_w ),: t5 y* ]: i" ?" |& @
    84     .SRAM_WE_N ( SRAM_WE_N_w )* m; F8 W+ ~; x# t
    85 );
    : q, n( Q& Q; h% @ 86 8 i5 x. K9 s* @8 P* M' t% V
    87 // *****************************************************************************
      e' P" S4 i$ W7 u 88 //  sram model
    ) u# Y! y' x" e4 ^# } 89 // *****************************************************************************
    0 @% `8 `) p; i+ v& X3 G6 y$ Y 90
    6 V, \+ {- n; v3 n5 ]2 p 91   IS61LV25616 u_sram_model(
    1 z; ^3 A9 i2 P, p! Z 92     .A   ( {1'b0,SRAM_ADDR_w[17:0]} ),
    : c5 v* t0 G0 m  ^8 _ 93     .IO  ( SRAM_DQ_w ),! ?: z8 u4 n7 V
    94     .CE_ ( SRAM_CE_N_w ),
    / h5 c* F) G( L2 \/ I( V& P/ u 95     .OE_ ( SRAM_OE_N_w ),
    5 o# _& b  x- D. K: D 96     .WE_ ( SRAM_WE_N_w ),
    ( u3 {5 G8 G+ ~3 I* `8 X% A# e1 A: M! F 97     .LB_ ( SRAM_LB_N_w ),! t) f% T7 V2 i6 J) o4 S) `
    98     .UB_ ( SRAM_UB_N_w )
    1 T7 V" ^; ^2 w6 H! e$ o5 j 99   );6 a% R3 t$ x8 I: V
    100 ' {& `$ h6 @9 y; `- q0 ]
    101  ! J5 k' D; |& X9 K
    102 initialbegin* i1 i  B: s2 N( c% C1 Y& S
    103     wb_clk_i <=0;9 T: u) x* `$ x7 j+ N& d
    104     wb_rst_i <=0;% u/ e( {8 G  |5 T2 i% r3 R
    105 end, K0 z$ B" J- K) N3 k7 a) H
    106  1 k2 b& W3 @. ^# G' M. R% G# a% L
    107 always@(wb_clk_i)  begin
    # x, z% A1 Z8 W+ M+ h108          #10 wb_clk_i <=~wb_clk_i;- U+ X) H6 \7 S2 G' _1 E
    109 end! J# A' ]$ q4 T/ G9 P
    110 ; ^8 V; u4 {+ f) Q( @# e
    111 reg [31:0] tmp_dat;
    2 ^+ F$ O' W* ], q. J112 $ S( u  S) P8 l/ ?8 L8 F* A
    113 reg [31:0] d0,d1,d2,d3;# G9 o9 S! `$ z" o4 P6 L9 _
    114 % L  s  y8 N9 k" `; ]2 _0 u
    115 initialbegin
    ( r5 f" S) s" C8 u% |* C: V& o116 repeat (1) @ (posedge wb_clk_i);
    - a, x( \0 p: [/ [+ p1 Y8 P  C2 y; q117       wb_rst_i <=1;( w5 ^& T9 k( K5 `+ r5 Z  e: P) N* m
    118 repeat (3) @ (posedge wb_clk_i);& a8 y8 c& k+ s% r: O
    119       wb_rst_i <=0;
    ( k8 q' d  O, Q. D/ r120 //write your test here!& A6 |5 P& [! @+ X' \, J4 f
    121 repeat (1) @ (posedge wb_clk_i);
    7 y% }* B, H0 K9 D4 m122       u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);
    5 t+ Z$ {) s* `  {/ w) _123       u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);
    6 g5 `* z! g3 q& c124       u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);
    8 |& i# t* f+ g, T125       u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);3 ^; r3 B' l# p" q) L$ @
    126       $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);3 _& K! G$ f. m2 Z: v) [
    127 //adr,adr+4,adr+8,adr+12
    7 S+ M1 `: P! c% @& Q128       u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);
    5 w# {6 m% i  G" U4 e129       u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);* p2 L6 k1 Q. d2 u# o
    130       $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);
    7 P! ?7 L+ q  p5 Z- [131     #100
    3 C" p  P. R; C# h2 o* N3 |" p132       $finish;
    3 h) ]' U: x  e0 R, s& S133    , k7 Y' G. m6 v/ |
    134 end( {0 r2 A5 q8 O6 R
    135  
    1 {. j( A: j  N136 initial
    . A- T* K6 x) ^+ w; E137 begin; r( ?' A) N6 ^* Y
    138       $fsdbDumpfile("sram_wrapper.fsdb");& U4 ~5 U8 w% A& h  h! K
    139       $fsdbDumpvars;
    3 o. D+ c* c! {( |2 h! v4 Y140 end
    + d( A0 F# A4 J( }141 endmodule  _6 E, o9 ~( V* n8 C
    ! ^* Y# G4 Z; r% u3 t

    % f/ V% {& o- {6 F7 N仿真结果, i9 H8 ]0 ]" [( m/ H
    5 u( ]# I! W: ]+ K) P1 l( s/ E
    # INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)% q) p# P, H# {2 ]+ B
    #
    6 F0 ~3 S8 J/ ~6 |/ f) k0 }#                  571 readfrom 00000000, value = ddccbbaa4 z  f% [2 ]% O
    #
    $ o; ]1 a7 _/ }#                 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 00000004
    $ m% W2 s9 G" v* |$ ^. x7 |( ^* ?; S#( v# n/ \6 C5 ~: a% q* K
      V  u" G; w$ e" p5 T9 B: ?8 u
    没有错误" E3 z8 z6 [( W0 Y% h2 A  g

    , G" [2 b; x& T# f# q& MØ  Sram_wrapper的soc系统仿真验证
    8 v/ q1 F8 t$ c. C, J5 M9 r+ \+ `2 \8 |3 c
    加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示
    ( a8 ~& ^2 S* M0 M) `# U# {. d- H& V, Y/ y( D; y; q4 G
    1 #include "orsocdef.h") d# ?& X7 u- Y" C8 f7 p: k
    2 #include "board.h": k$ ]5 k  Y; r5 j" `, ?
    3 #include "uart.h"9 R/ D. A. |1 j% w8 @/ w2 x
    4 * q" J& x) A+ l8 o5 \3 Q
    5 int
    5 w7 M5 v6 r3 O) U 6 main (void)  B0 Q; ~* a( S/ t; X4 @. @
    7 {
    $ k, F$ s, [' O& s# }  a 8 long gpio_in;8 b: }2 U$ w% L1 N$ R/ V% F
    9   REG32 (RGPIO_OE) =0xffffffff;6 ~* Y! w+ |& u8 Y1 t
    10
    ' ~0 J6 j2 P+ Z5 E) ?1 M) {/ L11   uart_init();
    2 o: d3 V( M; u5 Q, K2 k* `# N( M12   1 o8 L1 s7 S$ k  M4 F* F
    13   uart_print_str("2Hello World!\n");3 G8 u# y1 Y' J8 R# `
    14   
      w# R% }3 F9 M1 g3 H15 int i;1 E; a/ j& k. L; E9 k1 B
    16 int t0, t1;& d# Q3 L7 `: K) \0 Q  @6 M; I
    17   t0 =0xaabbccdd;
      s- M0 D" H, f9 m18 for(i=0;i<10;i++){
    ) Q3 V8 ], L1 I- b& J5 @19 //REG32 (RGPIO_OUT) = t0;
    ! E6 U( b& w+ t20     REG32 (SRAM_BASE + i*4) = t0;
    % P1 S9 ^( l7 k21     t1 = REG32 (SRAM_BASE + i*4);0 L2 c9 S( N. p# b! M- @. F
    22 //REG32 (RGPIO_OUT) = t1;
    # i+ C4 R# y3 G! d/ Z23 if(t0 == t1)
    5 u' M& ^. B0 m0 u8 s: p5 d! d24       uart_print_str("correct!\n");
    ! l1 h  S$ g* u- V0 B25 else/ G) S1 a9 B' R% R0 t
    26       uart_print_str("error!\n");0 D0 Z6 I7 t2 E
    27     t0 = t0 -0x01010101;2 \: q3 F% K4 N6 N. p' P# H2 b: N
    28   }
    2 O/ n$ y) r& J3 T29   
    8 Z8 ^5 v9 ?, O9 K30 while(1){
    , v( B" u$ Z+ T. k2 N3 S31     gpio_in = REG32 (RGPIO_IN);. C' i" O+ R7 c
    32     gpio_in = gpio_in &0x0000ffff;
    , j/ ?0 C9 ^0 m, T3 A2 h33     REG32 (RGPIO_OUT) = gpio_in;  Z5 V  l( `2 b; h# J) V- B+ H
    34   }
    - W1 ]% o  J/ x/ K35
    $ X: N0 K! Q0 I36 return0;
    ) C$ W6 q( g8 u6 k8 H0 @37 }, {$ ]3 C9 B; r1 U( v
    ( o2 N2 `6 d# {; m$ L1 }( }: s! J

    1 o) p$ s/ E2 Y0 H3 `8 a仿真结果- l0 J) M* n6 o" W# P0 ~
    2 L$ p/ B( C8 X3 [. B6 T
    # 2
    ! H9 h, p9 {* a! Q% H+ w: d# H! T# H
    1 a9 H1 r5 O# F. L0 u: q  X# v: H1 L5 U# e3 b  `& |4 z$ \( {8 F# h
    # l! G& G7 C. H. j% E
    # l
    # J" m! @% t6 }$ a# o2 P! u. w, L& B# G
    #  
    8 D$ v* W$ {6 {# W
    , u1 R& B; E; S* a" Q" o0 K# o3 L0 G4 O5 X. l9 T5 V9 _
    # r
    . d& k( l' T5 r( K) E8 b# l
    1 R( o& f) {1 F# d
    ' L8 n- B1 ^" O( d1 X# !* _7 [) ]5 w; d2 \  ]$ g
    #
    $ P( e3 X+ Y5 C5 g0 \#
    6 B  o# f0 m/ X/ P# a( w# $ B* o* ?9 F5 f/ \+ L# `8 Q8 Y
    #
    0 k; ?- s1 Z; R2 V  H1 _$ e# c: U' t$ e2 G& ^' [+ P4 @( }
    # o  L. T% X6 N/ ?5 D
    # r
    3 s  l/ B/ ~/ v# r
    : s; P: f4 L; U; `" O6 f# e& s' w* j. x6 N4 V/ b
    # c
    # F+ @- D7 r) A3 U4 p; J# t; Q5 R! e# q' N; J: v
    # !8 P: b. ~$ m. o
    … …
    0 ~9 I1 A$ m3 e( g7 \7 B3 G5 ]* _, k$ _7 J8 d: Y  j
    在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。6 Z2 \, s/ x( `& h" p2 X
    ! |  f5 s9 H9 j1 K3 L, I3 u4 j
    Ø  Ssram控制器的设计与验证7 n+ ~' o1 d8 H2 y4 p( _& w

    8 e" T; L+ G% c: o. \3 KSsram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。
    # R3 b6 b! ^# i. r7 h6 v  l
    ; t% t, t- |, a7 D2 q& [) }+ m: m关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下) \3 H$ S, J$ H% Z

    ) V; ^4 l0 ?1 t- `6 m, i3 f( u( R
    9 F& _+ w5 p) @8 Y0 D7 c  1 //----------------------------------------------------------------------------/// {# G+ F1 j& r! B; E4 S
      2 // Filename       : ssram_wrapper.v                                        //' W/ V9 u) p- X- X+ K9 j
      3 // Author         : Huailu Ren ...()                                       //! O( n: [$ Q! }$ A& i" l0 H
      4 // Email          : hlren.pub@gmail.com                                       //2 e1 d. S( Q8 j* r
      5 // Created        : 23:54 2011/5/17                                           //9 E) G3 K* k1 S0 y7 m& O
      6 //----------------------------------------------------------------------------//
    : Y: v# ^+ l9 w) s4 u$ ]  7 // Description    :                                                           //* j! p- W- G( G! f5 X
      8 ////$ [: Y$ ?' @% \6 r) L/ D! [# Y
      9 // $Id$                                                                       //
    7 s2 C: m* C+ w9 B* {$ h 10 //----------------------------------------------------------------------------//; n, U, e; s4 |
    11 . N3 O! F. b6 Z+ E9 b
    12 module ssram_wrapper(, j. u, j+ ]1 a/ y/ J6 Q
    13 input              clk_i,
    ( _6 t! B: V) f: }8 k9 c 14 input              rst_i,; y! H& D1 D, O  U( e7 b; W
    15    ( a2 ~# n4 H; y; ]  z5 ^+ @
    16 input              wb_stb_i,* s$ f$ }  g( V5 |& |
    17 input              wb_cyc_i,8 X. ~  d) ~; m9 u
    18 outputreg         wb_ack_o,
    ' ?5 B. J7 r, x  \1 k( v+ I) q 19 input      [31: 0] wb_addr_i,# y; L8 r1 H- Y7 Y5 u) ?' \
    20 input      [ 3: 0] wb_sel_i,1 }8 G5 y, m- W/ [. I! c
    21 input              wb_we_i,/ C& L0 q! X/ j* r' f
    22 input      [31: 0] wb_data_i,
    ( i: d9 |2 X7 I+ c* O 23 output     [31: 0] wb_data_o,- E4 n" c, ]) H5 S$ m' V
    24 // SSRAM side
    6 ^9 v6 B2 s) J8 F 25 inout      [31: 0] SRAM_DQ,     //  SRAM Data Bus 32 Bits
    ; \- M; M6 C; T 26 inout      [ 3: 0] SRAM_DPA,    //  SRAM Parity Data Bus
    % n+ {- I* B* w0 }3 R 27 // Outputs                     
    5 S# F. {! P- g6 S8 Z 28 output             SRAM_CLK,    //  SRAM Clock
    9 X& e5 {5 O# P8 F# Z  A$ n) P6 E1 X 29 output     [18: 0] SRAM_A,      //  SRAM Address bus 21 Bits) P5 b& Y7 r/ N$ I
    30 output             SRAM_ADSC_N, //  SRAM Controller Address Status  : f1 U- C+ I8 ^8 u$ G$ L
    31 output             SRAM_ADSP_N, //  SRAM Processor Address Status2 M0 ^1 j6 b5 f2 L
    32 output             SRAM_ADV_N,  //  SRAM Burst Address Advance7 y; J# G! x% j$ k6 U2 H
    33 output     [ 3: 0] SRAM_BE_N,   //  SRAM Byte Write Enable7 y, R# e) h: N0 s6 Q; Y
    34 output             SRAM_CE1_N,  //  SRAM Chip Enable
    0 S7 p+ F' _3 C3 Y6 L 35 output             SRAM_CE2,    //  SRAM Chip Enable
    ( `1 o5 J  P& o* E7 @* R* [$ y 36 output             SRAM_CE3_N,  //  SRAM Chip Enable
    ; T- j2 P6 z6 D- Q 37 output             SRAM_GW_N,   //  SRAM Global Write Enable7 U# M: o3 w8 y2 S
    38 output             SRAM_OE_N,   //  SRAM Output Enable% S0 Y  r+ [1 G9 y9 r7 y
    39 output             SRAM_WE_N    //  SRAM Write Enable% ~! \. y  ?) Y4 }: k6 |( o, K! e
    40   );
    0 F% K( z$ O8 S9 u% D 41 : D& m2 f5 q% t2 l" d4 o3 u1 K
    42 // request signal0 {& h$ `  S- j. e( K
    43 wire request;- L( ^) ^1 _9 n$ e7 c2 S4 i5 N$ i$ S
    44  
    3 z, \3 N6 L8 p: l' N5 R9 a# W" G 45 // request signal's rising edge9 P8 d' v2 m% H9 m7 `- `* ]; S( Q
    46 reg  request_delay;6 ~8 Q; O: x' G7 d9 H  _8 h, I+ T
    47 wire request_rising_edge;
    ) C7 Y+ b8 u5 |) q/ B0 ]: n* r* T 48 wire is_read, is_write;+ k- ~# h* J& K1 H6 n
    49 4 {* T4 O4 h& |5 J% j5 M( X/ a
    50 // ack signal
      {( V( N9 P! W0 X0 O+ E( U 51 reg  ram_ack;" {8 I3 }% b5 R7 J; a( W
    52  ' J" l: C! ^  s4 f5 [. G. ]
    53 // get request signal7 _& ~$ D: ^" T
    54 assign request = wb_stb_i & wb_cyc_i;9 s1 K/ p0 ?. E! S, K6 Y4 j' X
    55  
    6 w9 w+ g$ u0 Y5 S0 v 56 // Internal Assignments3 Z9 i( f7 `4 w1 z7 Z
    57 assign is_read  = wb_stb_i & wb_cyc_i &~wb_we_i;) I$ h, g! `5 ~/ S
    58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;1 }; ]6 }( J& a% `( X
    59  / f  M1 F+ x; K1 L0 d
    60 // Output Assignments
    4 [+ `! z3 o! _" L* F$ [+ Z( x 61 assign wb_data_o      = SRAM_DQ;3 o/ z# m/ D# Q9 B& F
    62 & K+ r4 c' e) A, I9 `5 e' r
    63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;' K9 P  \. \( b$ w  Z/ K
    64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz;
    3 B' X1 T( f9 J5 o 65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;- e# M2 I1 K+ E1 a! S, F9 r
    66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;5 O- W3 |2 e+ U8 o
    67 7 l$ i  k! H# \) \( C
    68 assign SRAM_DPA     =4'hz;
    - E: Y  h/ ^- D' H5 j) u 69 ' K0 G, M) P- I( d
    70 assign SRAM_CLK     = clk_i;
    : M% b- \+ I' A/ {- W 71 assign SRAM_A       = wb_addr_i[20:2];
    8 S) ~6 p5 ?  n& U3 Z  X9 H 72 assign SRAM_ADSC_N  =~(is_write);
    ) }4 j. U7 ], }/ r. ^$ n 73 assign SRAM_ADSP_N  =~(is_read);
    ) b$ X5 b9 [  G' c 74 assign SRAM_ADV_N   =1'b1;4 u3 I" b0 F0 R/ K6 l% o
    75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);
    3 Q% V/ X. U; K9 ]* S! V 76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);
    0 R) }, D: [% [4 s* \/ a5 a 77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);' A4 p& {- k9 w# N1 _. O9 h
    78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);
    ( h' O. C$ {( l9 ^- {* ?6 |8 n2 q 79 assign SRAM_CE1_N   =~request;
    : O2 M! V4 o( E) u 80 assign SRAM_CE2     =1'b1;
    - x8 T5 M) u, }  R5 n+ i 81 assign SRAM_CE3_N   =1'b0;
    & y; p9 t: X! U/ z4 A 82 assign SRAM_GW_N    =1'b1;' f, `6 C7 T/ j4 x. b
    83 assign SRAM_OE_N    =~is_read;  L4 X1 H' ^0 E- S# W, y
    84 assign SRAM_WE_N    =~is_write;
    7 T  e+ X& W* X: D- } 85  # n7 M3 l0 K! w" X3 K8 j* ]
    86 // get the rising edge of request signal7 N- k9 _. U0 V7 a! L
    87 always @ (posedge clk_i)
    ) {& Z, v; h* t" z( j* t8 G7 { 88 begin
    2 x3 K; P! O* k- x 89 if(rst_i ==1)
    8 i  U3 R% }8 Q0 M) ?/ a% Z 90       request_delay <=0;
    + v* o% z: e: D. V2 N 91 else
    1 w! j+ r' e* y; I 92       request_delay <= request;* G7 _- @  _9 a% X
    93 end  a. x! ^, ~# m" z8 O
    94  
    3 ]( A2 G6 Q2 ~0 z, O  } 95 assign request_rising_edge = (request_delay ^ request) & request;8 A5 \! s% Q* @
    96 ) g& t& x: r& C- o/ l, k( L
    97 // generate a 1 cycle acknowledgement for each request rising edge
    : G. H, p5 V: N- N# w  Z 98 always @ (posedge clk_i)/ Y% h. L. U( I7 S, c/ d$ f  J' J
    99 begin
    2 a. h( Q6 h: P; B% T& K$ u' j100 if (rst_i ==1)
    : Q+ v: g* n9 z3 b' r7 b3 X101       ram_ack <=0;
    1 A# C& r7 ]; B: ~3 l102 elseif (request_rising_edge ==1)
    ( X4 K# Z+ @( X9 u' T! y103       ram_ack <=1;2 Q  p  U" q7 r; r
    104 else
    7 i( X& S( q# b105       ram_ack <=0;/ r' r6 {3 o3 s; t
    106 end% r* Q- t# z' f* A
    107
    & C& }: C% K6 E$ X1 H, h: ]8 S: _( j108 // register wb_ack output, because onchip ram0 uses registered output$ }8 Q$ M+ a9 F" B: a! h1 S
    109 always @ (posedge clk_i)* t; {+ t5 H$ ?
    110 begin. P4 _  ^9 Y3 d. s, {4 i4 M
    111 if (rst_i ==1)
    ! Z+ u$ w7 W2 E/ s! R112       wb_ack_o <=0;
    1 J2 U3 J) r5 Z113 else- ^5 L  o( O. N$ z/ }
    114       wb_ack_o <= ram_ack;1 J- F+ [0 B+ J( v( d% S3 z& s
    115 end
    , @1 D8 k( H8 `# w0 M4 v# p116
    % ~0 j% j1 ^( n. R) S' b117 endmodule( N7 U9 h5 o# b; o) e; L

    7 P  q6 r( i$ O
    , H& ^: ?# L+ z$ T) M/ ?并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
    ' s5 N( g, {" x3 x  |5 p% B+ m3 P- [5 B
    源码可以在这里下载
    5 U7 u0 }" s9 X, I" @3 ]" T) _2 T: F5 q, {7 \
    稍后。。。$ \6 S. k2 T2 F/ j) Q' F
    To Do
    9 V* m% ^9 \" d0 u4 }2 M9 x# P
    $ _* A. D: z% w. X1 u用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
    3 V: v0 J4 P8 g8 [: `5 N, d修改以下用所写的sram_wrapper移植到DE2-115平台上
      R/ q1 K; Z# N) T: N+ _4 ^5 \% |9 dTo Do--关于opencore,or1200的soc平台
    8 F# r) M2 q, S; k6 P0 @
    * B0 m/ ?; p, K9 ~+ xOR1200的引导方案设计(基于硬件或者软件uart控制)+ b: H% \  d3 C% @- S
    移植uc/os II操作系统1 o. [% F) d2 x6 C3 f' G
    驱动起来DE2-70上的网卡4 ?: g+ M( l- e7 V4 l
    加入jtag模块
    0 [0 E! H' E2 e# z2 g: s2 A- v移植u-boot
    / {& c% {; F! T移植ucLinux  W$ b+ B% c4 s. D
    ……
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-2-22 10:42 | 只看该作者
    基于or1200最小sopc系统搭建(四)--(sram,ssram)
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 20:54 , Processed in 0.187500 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表