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

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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x

    * k4 ^- M( J) t+ x% b$ q6 ]7 Q4 tØ  DE2-115和DE2-70的存储器配置
    ! v7 q9 `" e5 @% d; {4 {4 P9 L
    ' D) @6 n( [; _1 e& \9 K; zDE2-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之间反复转换。% d" w2 J/ B7 n" C0 L$ X6 i0 O! d

    3 }& i/ e8 d5 y, ?# _Ø  Sram控制器的3中验证方案
    : w3 E) v* i" }: t  a6 \7 W  E$ r/ z
    本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。
    9 ^6 X5 u& ], ]5 t
    6 y$ `& V( O0 B2 r
    + a" Y1 U! w  _: y1 ]
    " e% j; ]$ f- Y以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。& _, |% N3 a7 H8 p- W1 l1 }
    ( T( k0 j6 Z6 R5 v6 ^
    我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?2 v& A! G1 l* ^! w/ Q" {4 Z3 X

      |3 C7 \1 q& y9 MØ  DE2中sram控制器的时序要求( n0 _; n- M$ {! S0 j, J8 w

    * N. Y  X6 m; d0 OIS61LV25616的一些常用引脚的功能( o6 _3 n5 W/ q
    1 \  e: R- _! F$ d0 U

    ) p/ m  t# }* r' j" B) p+ z0 F) r9 {# O$ L3 L3 }! W
    读和写时序按照参照datasheet中所介绍的这两种方式
    ' _% \, E8 a* P% D" T# l; y/ H( o# ]3 }" r" t
    8 M) n& Z6 o7 G+ N! B% N+ W5 L. }, ^
    & T: o' x9 S2 h6 ]0 I. y. }$ {, m" Z

    ! B. ]7 @% W, q8 N3 P2 l  h: a: T  F+ {5 A% J! J, m7 S: O; I
    在wishbone接口中需满足途中的基本时序要求。5 Q  X. x  ~) G0 t& @+ ^! n( J+ J1 s
    ; `% E# Z/ o; C
    IS61LV25616的verilog model在网络上很容易可以找到4 ~. T* K. P/ f
    : e8 Q+ H6 l5 B( }: e

    ( b7 \/ E! M% D, D  1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.
    ' q. M/ U. L& p2 @$ X) m" D9 l  2 // Note; 1) Please include "+define+ OEb" in running script if you want to check3 b2 ~$ r6 G+ s5 |
      3 //          timing in the case of OE_ being set.# q9 r- z- [# |! c" Z/ C1 Q
      4 //       2) Please specify access time by defining tAC_10 or tAC_12.
    - [2 A& t) r* h; |  5 8 O; `6 E1 @. `9 w& t5 d/ y. U1 u
      6 `define OEb" l, j! o( H+ r- h( f$ V1 A! h, ]
      7 `define tAC_10     //tAC_10 or tAC_12 defines different parameters, ?* ]" e! U% j) x! r: E1 n; o
      8 `timescale 1ns/1ns" ~# c$ G! U& |
      9
    , d: A% v# m2 F8 m$ v* g 10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);( p) Q  b0 G' }: ]8 ?: P1 l! N2 O
    11 7 U& U) T! |$ ^" r
    12 parameter dqbits =16;
    2 X3 U& V8 ?) d! m( u# ?' l 13 parameter memdepth =262143;0 r+ E7 H1 x# j
    14 parameter addbits =19;
    2 o4 y9 k. L. [ 15 parameter Toha  =2;& `$ ?: d; z! n& M, i
    16
    + ]" t. a5 I4 L% Y2 ? 17 parameter Tsa   =2;3 G% I: X: c1 ^; o0 B* l: g/ i
    18
    1 j& b0 l0 x) j$ Z% E 19 `ifdef tAC_10         //if "`define tAC_10 " at beginning,sentences below are compiled5 s* Y& y0 `7 _
    20 parameter Taa   =10,
    ! S/ ^. x# I3 W- q0 c' d 21             Thzce =3,
    ; K# R$ w0 S3 j' Q3 h 22           Thzwe =5;% p0 C4 ]; C0 }
    23 `endif, x. k# Y7 ~1 c  v/ W- }
    24
    9 V: F  B; i: p1 T: `; ^: B3 g 25 `ifdef tAC_12        //if "`define tAC_12 " at beginning,sentences below are compiled* q7 S0 {8 D! Q
    26 parameter Taa   =12,3 X/ ?# A+ v0 n$ F& J
    27           Thzce =5,9 W7 M' W4 N+ {2 H) ?7 I
    28           Thzwe =6;
    9 k9 t! _2 i5 `4 I/ B% J 29 `endif% N2 W: d- b( k0 Z( S) y
    30 : x" ]8 R4 e( M" k4 o
    31 input CE_, OE_, WE_, LB_, UB_;+ r& z' P6 T! D$ w8 R: W/ _7 u2 ^
    32 input [(addbits -1) : 0] A;+ f: o/ g, J5 O
    33 inout [(dqbits -1) : 0] IO;
    3 M6 e6 {4 m0 L& j/ F6 ]# X! R 34  0 X  q6 U! I( J. d& ]/ e  w
    35 wire [(dqbits -1) : 0] dout;
    3 t- l$ a1 U, k& P 36 reg  [(dqbits/2-1) : 0] bank0 [0 : memdepth]; " V+ I6 W) p# P, f6 v, t' Z
    37 reg  [(dqbits/2-1) : 0] bank1 [0 : memdepth];
    ! ?! ]& W# U' R, \3 y 38 //array to simulate SRAM1 D, h9 B! V1 \& R
    39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};& @4 f" C/ t+ i5 @9 V7 n
    40
    - ^' H1 y1 ]3 [* j6 p 41 wire r_en = WE_ & (~CE_) & (~OE_);   //WE=1,CE=OE=0 Read/ p$ B! y4 }7 L5 Z! Z$ e
    42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write
    ' Y) r2 P, `: u4 L5 n% o 43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; ; Y% J0 z. @- J0 o
    44 0 r6 |  A  I% u
    45 initial
    $ P) _- u. _: a1 K- ^0 W7 @ 46   $timeformat (-9, 0.1, " ns", 10); //show current simulation time
    4 ~/ \' D4 ?% @, p# i! d 47
    , k$ X5 G- S- E# D! j) J. R- _# q 48 assign dout [(dqbits/2-1) : 0]        = LB_ ?8'bz : bank0[A];+ K' `; g$ g- a! t" H  ]
    49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];$ _% a6 R" q. S- N  }! j
    50 3 h7 L+ u# n& d- v' V" E+ V
    51 always @(A or w_en)2 B( Q  Q7 a7 R1 f1 H
    52 begin
    ( y% q3 J5 e) Y$ D  l0 ? 53     #Tsa    //address setup time$ u  e- p9 t4 V
    54 if (w_en)
    9 Y! m, b5 j) R% s, D$ k6 S 55       #Thzwe
    + _/ p* [+ f; O) Q( j 56 begin- B  ?. y$ }) u* M
    57  bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];
    % p  I) a2 x: G9 n1 K/ h 58  bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1)   : (dqbits/2)];
    + W0 Z& a9 C$ p* ~+ G( p 59 end
    ; j" l0 _* `& Q, Y1 n2 K# } 60 end3 b- |# v$ ?$ W3 c1 N/ t  I
    61  
    $ z% o8 d5 z7 V. [ 62 // Timing Check5 C8 h# I7 f7 Y3 ]9 p
    63 `ifdef tAC_10
    5 `  ^# m3 o! Q3 Z9 d 64 specify//sepcify delay
    , `1 I& A3 J8 c' C) f; U 65 specparam- B6 m: p' J2 p5 X* w2 Z
    66       tSA   =0,
    ! T% T3 U% w; u3 J 67       tAW   =8,
    * w* B# M* r) `( f0 J& O$ X 68       tSCE  =8,
    2 h; E3 L9 M. |0 E9 F- ` 69       tSD   =6,
    2 c7 i, L3 v& |2 l6 _  @8 l 70       tPWE2 =10,. _9 d: r9 D9 M$ D7 Y+ F
    71       tPWE1 =8,: D, y; }( R! [5 `3 V) A/ m, |; @
    72       tPBW  =8;( W' p: n0 W# c8 D* ]+ A% ]
    73 `else! T  [! v! W- B& J% [, V7 }
    74
      l5 P# G# s. ]& x 75 `ifdef tAC_12
    4 _+ X4 T% V: g+ _ 76 specify9 f, m6 O0 w  i/ j* F3 h' q8 z. g9 n
    77 specparam
    2 T1 M1 G+ q8 v! G# V! H 78       tSA   =0,3 |8 u1 e- G5 z8 u3 K5 n
    79       tAW   =8,4 ?2 g1 O. v( `9 q, d$ ?
    80       tSCE  =8,
    " ?8 }) w2 t$ E: u5 Z& f+ H4 E 81       tSD   =6,! v7 ?/ m/ b0 N. G& c, i
    82       tPWE2 =12,
    $ b* m0 |+ D0 h- h# F- M 83       tPWE1 =8,
    & F( s( V# l; O( m6 _& {+ H! W 84       tPBW  =8;9 v* x( c% }* V2 x
    85 `endif
    - A* `0 G/ F  ?' w 86 `endif" G( V* H" f8 e" d
    87
    0 w$ h1 h3 M2 J  l  x3 e% { 88     $setup (A, negedge CE_, tSA);/ r9 I" J6 M; A# ?6 |- {
    89     $setup (A, posedge CE_, tAW);
    & ^9 U( Z9 }( E( Q" l 90     $setup (IO, posedge CE_, tSD);# v: }9 l1 D( ]# a# d
    91     $setup (A, negedge WE_, tSA);
    6 z6 e9 [- j! ?% x% V5 ~9 [, c 92     $setup (IO, posedge WE_, tSD);/ E% j$ t% e2 i$ ~- F
    93     $setup (A, negedge LB_, tSA);
    ' C/ O, V/ I1 r3 ^ 94     $setup (A, negedge UB_, tSA);
    4 k( E1 X3 {3 ~: o 95 . n+ ^  Q# a# |
    96     $width (negedge CE_, tSCE);
    8 x) Z. m! t/ ]: s, C, V 97     $width (negedge LB_, tPBW);
    ; N/ k+ U, O8 C+ i/ @- ] 98     $width (negedge UB_, tPBW);
    6 D% R5 h3 D: O2 Z" `4 ^8 _ 99     `ifdef OEb) _+ M2 o4 {" |- p* f
    100     $width (negedge WE_, tPWE1);
    : Q8 H! \' d) z2 A6 N7 {) L9 b, K0 Z! k( h101     `else
    . ^' Q+ S7 n* z- c6 L$ i+ b102     $width (negedge WE_, tPWE2);" ^( j% p  T6 [' L" V
    103     `endif
    9 M9 ^% N2 J, Z& |104 5 B3 m" }# T$ I0 M; k! a! g
    105 enDSPecify
    * c" ?" _( e, V106
    ' c$ n4 r1 ]- |( J7 Y. Q107 endmodule
    5 U3 v' _: `# n+ n
    ; W# `: a6 _6 H! `' D
    6 r% ]" F" n. q8 c; o  ]5 t. J
    ' H0 C5 K7 g1 Z' M* s( R1 m+ I" Q2 W2 t$ M# Q9 F2 A( O$ f# i
    Ø  Sram控制器的设计- x+ L- k7 X  m+ H8 z

    ; U2 W) U8 r% y3 ]5 u& \0 kSram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。" ~3 C+ `7 ?" z$ o$ s
    4 Y9 J" v; \8 i1 ?$ Q. Y2 H
    Sram_wrapper的源码
    4 A( R+ `0 E( K8 ?8 M8 h9 h
    / ]+ q& E9 q% o( Z' P// Author(s):
    , l1 n; u) `& i5 k4 [3 }// - Huailu Ren, hlren.pub@gmail.com
    6 R# K& T2 o1 E; C) e//: N/ I) ?) e4 s' b* K
    " z8 u. n  G4 B* G' i/ N" [$ K
    // Revision 1.1  16:56 2011-4-28  hlren8 O( K, p3 B5 \
    // created/ K9 L3 V3 U: r9 v5 n& P
    //7 i  y! a, a/ y5 A
    9 \; J; Q9 C3 m2 s0 J9 e
    // synopsys translate_off
    7 O8 ~2 E; n6 q: c. e! d+ v`include"timescale.v"8 N$ z) v+ B  c* k8 f' L
    // synopsys translate_on
    8 Y3 @& K. \  J
      ^) A& s0 G8 R( }( d1 Smodule sram_wrapper ($ |" f! k7 A3 P$ f6 T8 t
        wb_clk_i,+ t9 A- x" q( v% g0 l
        wb_rst_i,6 C  S$ `: }/ \, Z! }) r
    ; G+ E0 a8 A( `4 r
        wb_dat_i,
    ! A% z  A- l4 u" t1 s    //wb_dat_o,
    5 j% F" p4 F' l' v, k5 y( _: d    wb_adr_i,* Z  t2 p" U" H) {6 I1 {, d/ L
        wb_sel_i,
    / Q1 L/ Q- m, B+ X    wb_we_i,  Q. w* Y! r8 C0 Q3 q( A+ [. d4 z
        wb_cyc_i,3 e4 A) Z; s+ X
        wb_stb_i,) B6 E+ n2 N6 g- c8 A% ?

    , z7 G/ X3 N7 s+ e  W
    5 u9 A% z8 |+ l* m    // Bi-Directional
    , C$ t- _" y7 p& q/ Q% \3 F    SRAM_DQ,
    ' e" V: A* X! f) b5 a3 ^: A( w6 R: ^. e- ~; C
        // Outputs5 `) M" q1 P+ ^& Z; e
        wb_dat_o,. V$ I0 L: \- Q' E! L* ?
        wb_ack_o,
    * C8 V9 f) q% l! K    wb_err_o,
    & U+ Q( h+ ~' \' K7 L' j+ a2 I9 p   5 u0 q( L1 m1 W, x- Q
        SRAM_ADDR,) B- ^# ^0 ]$ q4 r
        SRAM_LB_N,* g, |: A- f9 K' @3 M8 V% }1 h
        SRAM_UB_N,3 h! H8 f$ r! x3 `( Z3 L7 T
        SRAM_CE_N,: t7 h7 k& n+ E4 ^. {& {
        SRAM_OE_N,% W! ~# H- B# t6 [3 D2 n1 r/ ]
        SRAM_WE_N6 g1 C: P# m( k" O7 E/ g3 U" A
    );
    , |( Y0 P$ h# ~" P. p/ c+ ^
    6 v  L0 e& u" B  _5 E//# W6 n9 F4 ?8 ^" \/ r, \
    // clock and reset signals
    : j! v$ t4 ?$ h8 e//% t8 Y% i1 f! N2 e5 @
    input         wb_clk_i;. k+ S( [. J  o7 I4 m* P$ N- y
      input         wb_rst_i;5 E7 A: J' {) o9 a8 k% [& d
    //
    . _  s+ G5 Z8 Q4 e) i( \// WB slave i/f7 \9 m9 p: J6 k0 Q4 J
    //1 Z( ~" i5 J- U+ s5 g; A* B0 q
    input  [31:0] wb_dat_i;9 z- T$ ]! i; _4 B
      output [31:0] wb_dat_o;8 f: B* U) Y; ], `3 J! z
      input  [31:0] wb_adr_i;6 ]0 l8 k7 p% O$ z8 J, w; i
      input  [ 3:0] wb_sel_i;- h2 r7 l6 ]7 Q/ C* k; O
      input         wb_we_i;- ]) ?; P/ u% D" I) J
      input         wb_cyc_i;
    3 i7 ?/ j: l- d6 c! O7 d  input         wb_stb_i;( }& B$ Y  u" j$ n3 O
      output        wb_ack_o;
    0 u0 k4 z& G$ c& z  output        wb_err_o;5 X1 x0 p% J2 \  A6 B& y/ e3 [
    //
    4 T) s4 r( b; ~7 z5 P2 k// SRAM port
    ' E0 r# n/ w& l3 P) T* x# s//
    ; C0 c7 X& u( a$ C* O" D8 {inout  [15:0]   SRAM_DQ;    // SRAM Data bus 16 Bits
    : t# M* x' Y% Coutput [17:0] SRAM_ADDR;    // SRAM Address bus 18 Bits( A* T# c  {- ~& Q
    output        SRAM_LB_N;    // SRAM Low-byte Data Mask1 Z) [$ T7 k, P' k7 }! g# g
    output        SRAM_UB_N;    // SRAM High-byte Data Mask( d! T# n; S  n6 M
    output        SRAM_CE_N;    // SRAM Chip chipselect* W6 d- O- f6 m) W1 j/ l
    output        SRAM_OE_N;    // SRAM Output chipselect7 b$ ^3 q  i  Y3 \3 B- i
    output        SRAM_WE_N;    // SRAM Write chipselect
    1 F! o/ O5 a( u' `0 k2 u7 B3 ]1 K  Q0 `
      reg    [17:0] SRAM_ADDR;
    1 a. p( l& k9 J3 R0 X4 Y( H  reg           SRAM_LB_N;
    3 d* G- P* j2 P+ {7 w" c! ^  reg           SRAM_UB_N;+ |. L# s- U7 s' S0 `4 y1 c, D
      reg           SRAM_CE_N;
    . v8 c5 X2 W1 v9 R9 c  reg           SRAM_OE_N;
    " E* L) X5 ]# A' p1 V1 K+ O  reg           SRAM_WE_N;
    2 O6 y/ r4 x3 A+ }# ?- j/ E
    8 j7 d, \  \! `) ^' O2 h5 a  reg [3:0] state, state_r;: H$ P9 I' r+ a
      reg [15:0] wb_data_o_l, wb_data_o_u;: q) O' h0 u) P2 }; i9 m

    ! S' K+ T3 O& Q/ N+ u  reg [16:0] wb_addr_i_reg;
    + K+ A# l# a  W7 P/ u+ M/ q  reg [31:0] wb_data_i_reg;6 ?+ g/ ?/ d' R  w8 t1 [' f
      //reg [31:0] wb_data_o_reg;
    9 X/ `; {: X. t" ?reg [ 3:0] wb_sel_i_reg;) T1 r: {- ^0 q2 o" c

    ( I1 y9 I% C6 A$ H  U$ |2 ~7 b  reg ack_we, ack_re;
    : K3 M. A6 o, z2 C1 G1 h4 r// *****************************************************************************: }" {/ x" L# a8 d
    //  FSM. R7 _1 [$ s( E
    // *****************************************************************************: c* E# _' c9 y3 t  M! @3 O
    localparam IDLE =0;
    ( f: e- c. L# e2 i6 L5 D% ~  localparam WE0  =1;
    & V( H4 O4 @+ d  localparam WE1  =2;
    ! w" W9 U. v2 t0 N- w) G: M0 z2 J  localparam WE2  =3;8 l2 |; _8 g5 M8 l* G3 y
      localparam WE3  =4;9 H- f; B( K; p) e
      localparam RD0  =5;
    : }5 N, t+ A# C& `' D8 Q6 K  localparam RD1  =6;
    % ]* N' ?7 I8 t7 F  localparam RD2  =7;, e' G: C6 J1 \* ^  F
      localparam RD3  =8;
    2 @& x* k' P, E1 h3 Z$ ^/ b# I  localparam ACK  =9;
    $ P  d2 f. Z+ R$ k- X
    + S7 G% G7 k7 b6 a$ p+ B5 q  assign SRAM_DQ =  ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0]
    # Y1 S# ^' `2 l9 V6 g                    : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]
    1 d9 _* b3 k9 ]; S0 r- L; c5 Y/ ?                    : 16'hzzzz);
    ' v, \! Q# [. X, \$ u3 Hassign wb_dat_o = {wb_data_o_u,wb_data_o_l};9 L* h2 M7 a: g% K) l7 {! O2 V/ l$ O

    0 I. L. t( p8 `3 C  s7 [$ T  assign wb_ack_o = (state == ACK);
    $ x$ f! f7 b6 m' L: P  assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);; @" b. H& F1 v. q6 t( B# [

    ) C( n- P! R, A3 q/ x; J! @6 e8 z  always @ (posedge wb_clk_i orposedge wb_rst_i) begin( p1 C0 E! {& z
        if(wb_rst_i)( o& p" }# G- u2 Y8 L0 G
          state <= IDLE;1 W& r2 n5 l8 u, G6 t7 F' I
        elsebegin
    + I& H! t6 {, F2 m* g      case (state)
    9 A! `. O2 B' S% S/ _        IDLE : begin
    * f9 t; W; `$ }! u; X/ F1 G% I" R& c          if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)8 }4 e! x' K+ R, J; m
                state <= WE0;' I, b. Y4 S" O7 t$ y+ y
              elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
    : H/ X  ]/ E* W0 k1 {4 g" V            state <= RD0;6 {0 {+ k2 X8 Y- i4 n! c7 y
            end! O0 C$ Y  B6 K4 C  A6 ?
            WE0 : state <= WE1;# u" t0 q0 {2 ~) _' W
            WE1 : state <= WE2;
    : c& k6 u: V) Z/ u        WE2 : state <= WE3;
    9 a0 f! I" O7 t) X; c        WE3 : state <= ACK;, V) y. I6 S3 G( _9 p( K1 J
            RD0 : state <= RD1;
    5 D1 C& {1 n0 _  L% K        RD1 : state <= RD2;
    % u( E' W' ?) |3 `2 I' y/ Z8 S        RD2 : state <= RD3;8 p: S1 \9 d  S6 A" J, |& [
            RD3 : state <= ACK;
    " A0 |. p% l( }5 Z        ACK : state <= IDLE;6 T% O$ U* ]  e
            default : state <= IDLE;
    6 j! ?; J9 X! `8 Y. k5 q) K      endcase
    : {7 U0 J* t- `+ x/ @+ M/ t    end
    7 }) J2 E# b8 t  end3 L7 F( i( ]* T" ?

      m; g0 |% p1 f& e: P' J7 B6 i  C0 P" ]  always @ (posedge wb_clk_i orposedge wb_rst_i) begin, ]' B  ~1 l3 z5 V0 H- Y
        if (wb_rst_i)
    ) l/ I. u: W, r# b+ Z, T! w9 V& e      state_r <= IDLE;' o! O3 d4 _9 `5 x% v
        else
    ( V' Z; Y: K( F  v. ^' i      state_r <= state;
    " C( Y6 n1 B. l! H' [  end% Y4 h. P2 D. ~4 I
    //
    - B" G! ^6 x% ]/ z# f// Write acknowledge: }8 O% E3 n9 J, A. I* L$ ?
    //
    $ y6 x( ^$ m2 A6 ]; Galways @ (posedge wb_clk_i orposedge wb_rst_i) begin
    6 ~4 g+ \$ p6 R* D. k5 Z: s    if (wb_rst_i)* `* [! F: ^5 q8 N! m2 ~* _
          ack_we <=1'b0;5 t, K. |: a0 Q% |# N" j2 S  a
    else8 k$ w9 k; ?+ K* O: o1 T
        if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)
    & q6 U/ F$ W8 `: s% V2 K8 g      ack_we <= #11'b1;( M! U  g7 l: s: F& k
    else
    ' |0 w: K9 [/ c* K1 ~- Q( A0 V" f      ack_we <= #11'b0;) X' r# ?8 p/ q( E/ k; d. W
    end& I6 r7 D, y3 _" u* i" M( ~

    . l  [$ y) g% u- p5 H4 P//6 J# S6 v% C* p+ q$ D
    // Read acknowledge
    - @& {6 `# w/ {, F  e( R//* Q1 l" J6 T7 E) @
    always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    0 X- D2 ^7 g+ [7 H) h    if (wb_rst_i)  U5 |6 ^9 w# H6 i5 G6 u! E' X+ d
          ack_re <=1'b0;# Q! z7 r6 K, `6 x+ C, z
    else
    1 A! g+ ~  K3 Y/ U3 ]; Y/ f( K    if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)/ ]' }& L$ W/ m, i' h  D* g
          ack_re <= #11'b1;0 h8 z! c* q% Y% ^1 b3 u8 j
    else
    - e4 E. X/ w0 a9 `      ack_re <= #11'b0;
    ! a# N8 A4 g7 d- Lend0 k, c( n0 I0 [

      p. X3 ~3 ~( z+ x, C2 e8 v% M  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    4 L' H- e. W5 ^; Y    if (wb_rst_i) begin
    ! G! t! E' J* S      wb_addr_i_reg <=32'b0;6 l# Z5 ]/ m  p7 j7 s
          wb_data_i_reg <=32'b0;4 I  U0 v9 d/ m+ o0 @+ O
          wb_sel_i_reg  <=4'b0;
    + }0 u. @+ D. m( l6 K* eend
    . E/ \' D9 b1 E! \) N6 h/ J+ t    else: O. q- y( {8 @
        if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)
      w4 i. T, v, }% _( U    begin$ M4 b* A8 F5 ^1 l5 b* b
          wb_addr_i_reg <= wb_adr_i[18:2];- W) W+ _+ Q6 I0 [1 U$ k& ^
          wb_data_i_reg <= wb_dat_i[31:0];: Z! Q  T& W  ?; `, N4 i8 S- v
          wb_sel_i_reg  <= wb_sel_i[3:0];( ?* G0 n( F+ C) a; e% F% \; h
        end+ I7 _5 [8 q/ U9 {9 g
      end, a# s: p  B. w- W; y

    + ]6 |% P' M7 i+ j  always @ (posedge wb_clk_i orposedge wb_rst_i) begin9 [% C# |' U+ _5 b$ [
        if (wb_rst_i) begin
    6 b! K) k# ^& R, B      SRAM_ADDR <=18'b0;
    $ ]( D/ F2 H( L+ Pend
    ( y' C( H2 J8 y    else
    - {$ W7 [. b& y) M+ L" A      case (state)
    9 ^3 K3 q, `. i6 z/ V        WE0, WE1, RD0, RD1 :
    5 T- f8 d1 F; \+ V2 y          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};4 D! O( u: I4 _+ q# f- _' O9 b+ k- k
            WE2, WE3, RD2, RD3 :
    & ~" P4 c" _5 s, j; B3 n- N6 g          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};
    ' t5 N3 Q7 o  Z5 x' Zdefault : SRAM_ADDR <=18'hz;8 [$ q( |% c* s2 |- S8 ]
    endcase8 F% e8 O& U5 V
      end
    ( y1 k# U$ p$ m, T& c ; {: e0 U+ b3 G3 @" p0 }
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    / @% l+ {1 w; \' `* R+ v' b: t& @    if (wb_rst_i) begin9 e" Y4 k+ ]& z' T0 c3 H& A5 \  q; d
          SRAM_LB_N <=1'b1;2 G: f% D6 [3 s# j! n4 f( }
    end3 m1 H! {, K. u5 i3 K! z& w( _
        else
    0 r9 ^) O* Y( a4 q( m9 c      case (state)
    ; ^, I; G! v: K  X" D6 _- k# F        WE0, WE1, RD0, RD1 :
    # r8 l8 O9 f9 p          SRAM_LB_N <=~wb_sel_i[0];
    0 S. g4 e' c. `& C0 t' m        WE2, WE3, RD2, RD3 :( I" @" k6 `: X. S" R
              SRAM_LB_N <=~wb_sel_i[2];
    9 x. C0 D- j) Z. o, A3 e  q        default :
    5 ?" [) T+ x' X2 m* m5 Q          SRAM_LB_N <=1'b1;0 K6 ?! g: Q9 a) k  I/ ?+ Y
    endcase* B, w4 B; T5 k5 b; `6 u
      end
    1 F3 o- i/ G# [! k& @
    5 a) p+ @0 q  z, Y; |9 R  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    - p( E/ c: d' c/ M" T9 M    if (wb_rst_i) begin) ~0 S* v, T# |. N
          SRAM_UB_N <=1'b1;
    0 `. q. S( H5 l8 t5 T4 dend, H! n7 I9 r( ~5 F
        else
    , ?0 ]" J4 Z0 C' `      case (state)
    9 H: P! {3 \# l% U. x/ L        WE0, WE1, RD0, RD1 :' O" O( F- f7 M; n
              SRAM_UB_N <=~wb_sel_i[1];
    $ V5 X% t/ c3 {4 w        WE2, WE3, RD2, RD3 :
    ) \, \3 |# h' I7 z6 _          SRAM_UB_N <=~wb_sel_i[3];( e+ |( l2 v0 U$ \4 z
            default :
    1 h( M, U% L, T4 x9 P          SRAM_UB_N <=1'b1;
    ! w- H( _1 x: S+ p" D: c9 G- V9 eendcase3 l7 {% }4 S) n1 d$ ]1 Q( }% q% X. v
      end2 c3 ]( T; A% T" ]7 P& [
    6 m4 |7 t' B3 N6 @
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
      B" m( Z. c0 I( S+ C    if (wb_rst_i) begin& p% t* a5 H" e  }" r' B
          SRAM_CE_N <=1'b1;
    ) G% C' i, y/ ~end
    2 D2 Y1 Z7 j, O* ~9 `    else  j/ p) E& V/ e9 J4 h
          case (state): V7 D! f6 ^" g& M
            WE0, WE1, RD0, RD1 :/ G7 v% C8 t. c2 x4 P- K
              SRAM_CE_N <=1'b0;* H  W; d4 T2 O) R& g
            WE2, WE3, RD2, RD3 :
    ' t: C7 A3 @$ U8 j" [7 c6 A$ d0 t0 z5 g          SRAM_CE_N <=1'b0;7 s/ r+ s5 y. h/ ?" g
    default :! T  |& B. K' f3 }4 r. V
              SRAM_CE_N <=1'b1;
    % p$ ?) m2 N. V% m5 Rendcase
    # P5 h+ K- c8 C# ~1 F$ o  end. u: O4 z, O) m  `! {: E
    $ K$ ?# W9 j( C. _6 F6 F
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    ( S- L/ {4 c; u9 M' u7 `    if (wb_rst_i) begin
    8 A3 n/ y6 E* I! M      SRAM_OE_N <=1'b1;
    : F* J( j, f5 q; i9 Eend8 [. m9 G2 a; r$ r
        else
    1 Z7 i& y5 A6 D* n      case (state)
    . n: V8 A( W" ^        RD0, RD1, RD2, RD3 :: {$ }2 ?" a+ U8 Z8 b/ t2 I- y& ]. n) a
              SRAM_OE_N <=1'b0;7 h& n9 m/ d6 C# F6 h; [
    default :2 w2 O# _* q* G/ E7 G
              SRAM_OE_N <=1'b1;0 I% B) \% A* [1 s, P! T" v# l1 y" ~
    endcase
    7 y4 Z, I# `+ [' U1 I- F, ^  end
    " Y! ^& a& a  R) ^ 6 q8 a9 f7 q8 X0 Y7 o2 B% i* ?
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin9 J6 c) O4 n0 Y! D: L6 m
        if (wb_rst_i) begin1 K2 J% R' l( F( G8 D+ r& W+ s7 Y
          SRAM_WE_N <=1'b1;9 w+ O. k/ w7 i4 ^
    end
    " Y* N' l' c- ~, G7 ?8 A/ R- A$ r4 @    else$ R; j& Z2 L9 u) `3 n
          case (state). H0 J) q8 ]7 O& U" I. c
            WE0, WE1, WE2, WE3 :0 @% G6 G$ c6 L! v" q* Z& p1 U! Q
              SRAM_WE_N <=1'b0;! a+ S& ?7 K% I: n% ^& C- v$ c8 ^
    default :1 M7 N* B* O; N
              SRAM_WE_N <=1'b1;
    3 V% ~" v5 D! Z5 Y) Sendcase7 J1 u, |( X% ?# z9 Z. o( v
      end) K0 A* n5 ]: N: d5 J/ n! D
      //# _3 W% Z: F& ~5 l' X& q% d5 {
      // assemble ouput data$ }+ R: I1 n6 r$ p$ x
      //
    $ f! q- B! q2 ~8 T# c7 H( M/ Calways @ (posedge wb_clk_i orposedge wb_rst_i) begin
    . D, A* a7 C9 d3 j+ ?" k2 m9 a    if (wb_rst_i) begin2 @7 d! t: ~$ P/ |+ H: M+ H
          wb_data_o_l <=16'b0;' k  r6 O: b" |- g% l, O$ a1 E
          wb_data_o_u <=16'b0;5 L, {8 G( k* e1 [5 ]
    end
    ) K  D" W! q1 l% d; E% r    else
    / I/ z& n& ~: e7 r  y      case (state_r)( F: O/ V+ K2 z* {: G' }( [
            RD0, RD1 :8 c3 ]  Y4 i$ Y! g' Q# O
              wb_data_o_l <= SRAM_DQ;5 }% u: X' f/ v0 X% c& Y
            RD2, RD3 :" p3 `4 ]& ]) r
              wb_data_o_u <= SRAM_DQ;
    : K% f8 ~( ]# `6 \      endcase0 b9 m, G7 K) r
      end
    + a3 s  f; s& ]* vendmodule0 g6 j, Z+ ?8 U. U  t7 a+ }5 T0 o, C
    % r) ?3 P  t/ ?  p9 c3 a& W
    + }  E8 X( H- `
    Ø  Sram_wrapper的wishbone BFM验证! g, f9 O, K$ F7 }: s! B# O9 {
    ) q, j* d) Q2 V* D; A" ~
    Sram_wrapper的BFM验证的testbench代码如下:
    " n5 j' _4 ^% g% [$ _0 E- P, j- Z0 s8 [: T7 d

    * b; B/ v. s" r& X$ v+ b  1 // Author(s):
    0 S' Q8 G& A6 P: E) [  2 // - Huailu Ren, hlren.pub@gmail.com
      j, h% U( `4 D0 z  3 //
    - [9 o' z0 h! a  e7 y  4 / l+ P  `; I! e1 u) U
      5 // Revision 1.1  17:45 2011-4-28  hlren; Y) M( D9 _. E
      6 // created
    / h5 a  [% z1 E( r3 ]* u  7 //$ K# E, e% w$ V. R- \; G5 S
      8 1 j. p9 M7 k  y% Q& L
      9 // synopsys translate_off$ V5 n; n7 r% E# v9 W* \" q
    10 `include"timescale.v"
    ( Q1 @. a5 h* g7 C" t 11 // synopsys translate_on* G% p* q$ J7 d* c% L: M/ r- w4 y
    12
      Q3 \! B$ Q% x/ F5 ] 13 module tb_sram_wrapper ;
    ( u. P  l  u- D  v! a7 t1 ] 14
    * u! K# k- h, @& ^, P& i4 e 15 //! n  L# C( s: ]7 X# m2 T. Q  h
    16 // clock and reset signals
    7 y9 x; D3 z# j7 w! S 17 //
    2 e9 {- p6 H& t  m2 l6 d5 u 18 reg         wb_clk_i;
    ' a- Y) Y2 S: m 19 reg         wb_rst_i;
    ; `$ V9 i& {' I3 Z, m: Y# J& e( n 20 3 U0 ~7 w& A, s* H2 ^0 C7 C( z
    21 // *****************************************************************************! Y+ g8 V# a+ T3 h) F
    22 //  wishbone master bus functional model
      Q. D3 T0 q4 m, n" Y( x 23 // *****************************************************************************
    & B7 l0 M$ P' Z' h. l* r% I 24
    , k& {9 i3 o: k; f1 l3 k 25 wire [31:0] wb_din_w;
    4 N3 g9 ]! V* z: y' v) E0 Q/ l! ] 26 wire [31:0] wb_dout_w;9 j: o9 }; a9 x! ^: `; J5 b' F4 p
    27 wire [31:0] wb_adr_w;2 u' q8 g( {; I- ^7 F
    28 wire [ 3:0] wb_sel_w;
    * N$ M% s# N1 h6 i1 a+ d" a2 k* {3 ?' y 29 wire        wb_we_w;0 F) h( b: G8 W: T
    30 wire        wb_cyc_w;) E& R& B; n0 v2 @  F( U
    31 wire        wb_stb_w;
    # Q# W8 p9 l0 J 32 wire        wb_ack_w;8 k0 l- q1 h$ v8 r8 O: o+ @  Z8 J6 T( w# f
    33 wire        wb_err_w;
    2 d) A" y. \. b3 b 34    / d, r# V; u9 A7 j* u* ?
    35   wb_mast u_wb_mast(
    / U% U2 A6 P$ H! ^" Y) ^& u" O- { 36     .clk  ( wb_clk_i ),
    1 g. Q1 p  N5 C$ E; O) G 37     .rst  ( wb_rst_i ),
    ( Y. T; \. f( r# x  p* Q* N* m8 _ 38    - P2 Z4 r- a# U% a4 I& m) V
    39     .adr  ( wb_adr_w ),
    1 U1 A3 L/ n5 ? 40     .din  ( wb_din_w ),
    . |: {( ]' _* W; q; y8 _) R: A4 K% H 41     .dout ( wb_dout_w ),
    * u# y' ~  N) l' A0 `5 J 42     .cyc  ( wb_cyc_w ),9 Z! G) `) z; s: N: v9 |8 N
    43     .stb  ( wb_stb_w ),
      j% P6 C( m* Q& T 44     .sel  ( wb_sel_w ),
    ; X  B+ q  Z" ?% k- F 45     .we   ( wb_we_w ),
    % C( a$ c, I5 a8 j6 X5 Z7 K3 | 46     .ack  ( wb_ack_w ),+ X, B8 T1 ^. x7 R- ~4 v
    47     .err  ( wb_err_w ),% L; B3 c6 y- w' G
    48     .rty  ( wb_rty_w )
    9 q) A* Y9 q( h. z 49   );6 p2 _- ?& O1 `/ N6 V7 g$ D
    50 # v/ C5 U3 z, ~% J( d2 Y
    51 // *****************************************************************************6 d8 G  v6 l9 b2 _+ U
    52 //  sram controller
    ; K: z+ \0 K( o& k 53 // *****************************************************************************/ Y! O$ `8 F5 L# ~+ v
    54 ; K0 e1 s" c. Z, s- T$ M% d( }
    55 wire [15:0]   SRAM_DQ_w;    // SRAM Data bus 16 Bits
    ' i( ^) T& _  j  ~* P' M9 T4 J 56 wire [17:0] SRAM_ADDR_w;    // SRAM Address bus 18 Bits& i. S* ^; d# G! L6 @2 T
    57 wire        SRAM_LB_N_w;    // SRAM Low-byte Data Mask
    + ^4 {7 ~# F& h) f, D' m6 ]6 r" [+ \ 58 wire        SRAM_UB_N_w;    // SRAM High-byte Data Mask) Y+ R/ q- M  m. u3 ]
    59 wire        SRAM_CE_N_w;    // SRAM Chip chipselect
    4 u9 Z: `+ M- A0 s 60 wire        SRAM_OE_N_w;    // SRAM Output chipselect* y  [2 r0 @( p* D# l
    61 wire        SRAM_WE_N_w;    // SRAM Write chipselect  j2 W4 ]  t* S  v8 D( G$ o
    62
    5 A% q1 ^7 ?0 ?# o7 R9 s 63  sram_wrapper DUT_sram_wrapper(
    " ?4 J" T7 m( ~ 64     .wb_clk_i  ( wb_clk_i ),4 U. |) ^" r) l6 ?
    65     .wb_rst_i  ( wb_rst_i ),4 R6 o2 I+ p: s
    66   
    " M8 T+ K1 {. } 67     .wb_dat_i  ( wb_dout_w ),/ x7 u/ o" J: s  q
    68     .wb_dat_o  ( wb_din_w ),. k# A) M2 o) x3 p) ?  L
    69     .wb_adr_i  ( wb_adr_w ),5 c" f$ I& o. }, {, \( D
    70     .wb_sel_i  ( wb_sel_w ),( D- ], U' _9 y% a
    71     .wb_we_i   ( wb_we_w ),
    ; j- B  z6 \6 ]9 I" l/ U 72     .wb_cyc_i  ( wb_cyc_w ),5 m' P5 {  \( M( S
    73     .wb_stb_i  ( wb_stb_w ),( d) U7 o# Q4 g: G" ]0 g
    74     .wb_ack_o  ( wb_ack_w ),
    2 c- b4 a$ _1 X5 N 75     .wb_err_o  ( wb_err_w ),- \5 L# Z2 X" _+ l6 Y  P, D+ U
    76   T+ m/ m1 _: L$ N! d
    77 // SRAM
    9 t0 Q( ~* t+ @0 K/ q+ W& K 78     .SRAM_DQ   ( SRAM_DQ_w ),
    0 x6 I1 v4 a0 \6 A! ^# T 79     .SRAM_ADDR ( SRAM_ADDR_w ),& D; \& P- n7 t5 E6 {# \4 Q
    80     .SRAM_LB_N ( SRAM_LB_N_w ),
    : f, p" y  @+ N1 K 81     .SRAM_UB_N ( SRAM_UB_N_w ),
    3 F* n  ~$ ]) l  G* o1 y& G 82     .SRAM_CE_N ( SRAM_CE_N_w ),
    % }+ o$ n/ |" j" } 83     .SRAM_OE_N ( SRAM_OE_N_w ),) D: H: E3 ~. C5 }$ M) d# w( ]
    84     .SRAM_WE_N ( SRAM_WE_N_w )' i5 _4 \+ V0 b+ S4 }% j" `
    85 );/ d/ H9 }: \# _3 ~
    86 * X9 `. h& ^1 L- T
    87 // *****************************************************************************( I" G3 F* s5 ]
    88 //  sram model) M% Q& o* ^. u! _- W- q0 _/ H
    89 // *****************************************************************************
    * {! r6 P; g4 Y8 q 90
    5 W4 Z/ h1 S1 d) W* G 91   IS61LV25616 u_sram_model(4 H- T, l1 w& p# }4 ~  {1 |9 }( V+ i
    92     .A   ( {1'b0,SRAM_ADDR_w[17:0]} ),
    5 X& Q# B& M* m' F8 F9 K* C. }' b 93     .IO  ( SRAM_DQ_w ),3 \, X' I+ g! u, k
    94     .CE_ ( SRAM_CE_N_w ),: K# O2 _: U* J) h
    95     .OE_ ( SRAM_OE_N_w ),, g2 [! ?2 l' O3 q# @9 V
    96     .WE_ ( SRAM_WE_N_w ),
      \* X% h* U! ]9 t 97     .LB_ ( SRAM_LB_N_w ),
    3 Y8 U" t5 s( c3 e: U# O# P0 P# h 98     .UB_ ( SRAM_UB_N_w )4 T2 V3 \6 f3 x+ y& i; [
    99   );
      D( i' f0 @, d2 F( w# s100 , y6 k- m/ t1 B7 U* U
    101  ) M) @' I/ \" P5 L8 e1 ?, g) p
    102 initialbegin
    1 y  K% g5 f0 S103     wb_clk_i <=0;7 f" M6 W! [! I% g9 h1 I' \. r
    104     wb_rst_i <=0;
    7 x9 J. v  i! v% o105 end
    . P# `3 V, P7 m! j1 I7 k( y106  0 ~7 V" d& ]& q) L- P0 A) T
    107 always@(wb_clk_i)  begin
    2 ^, F% \  K1 K( H3 W108          #10 wb_clk_i <=~wb_clk_i;
    9 S! x0 F1 z; `* A6 h3 R0 q109 end7 h' `2 Q" N8 J1 R" o; S
    110   _0 ?% L# e, l9 p" {+ F
    111 reg [31:0] tmp_dat;
    . [; d) p3 E) P; i6 B+ p112
    # c6 e2 B; I1 a8 I# r) L% m8 `113 reg [31:0] d0,d1,d2,d3;
    ) t7 _' \# V( ]" R5 _+ `  c, C  H114 3 W) d9 u+ e- M1 K9 W
    115 initialbegin
    ; p+ M' J6 Y# l1 t/ y  l116 repeat (1) @ (posedge wb_clk_i);8 \$ Q0 j9 u4 `- l6 D
    117       wb_rst_i <=1;
    1 Q& r5 v4 h. v, b. K, G; Q7 Z! v1 a118 repeat (3) @ (posedge wb_clk_i);
    & y% U! o+ K2 d119       wb_rst_i <=0;; A. E0 u/ _9 }( a- y
    120 //write your test here!  ?$ v+ F* ]& G( K) M/ Z* k1 o
    121 repeat (1) @ (posedge wb_clk_i);, s1 N$ ^* I* j' ~# e
    122       u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);7 M' x0 Z% s, u0 |! A
    123       u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);  {7 u2 x& V' Q8 z) M
    124       u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);
    $ P. z. c+ z- a  X/ r, ?1 |125       u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);2 q5 H, `$ ]0 x, `3 n4 b
    126       $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);) {, P* ?/ |7 C8 \8 H: B
    127 //adr,adr+4,adr+8,adr+12
    ) f) f" T) }% B' y3 f128       u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);
    8 l% `( W: h- r& ?' Y129       u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);- ?7 Q: H6 @6 W
    130       $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);
    * A% f2 B4 P6 a4 w( S0 L131     #100
    1 ~. t3 J% F9 q! g' Z. Q+ C/ K  D132       $finish;
    ; H/ B& r) l' |* D7 w& ^! y133    7 @9 Z9 |3 {  p0 I$ O) `
    134 end+ ]6 \4 X6 y/ |; {1 @5 v$ U+ ?) l
    135  & Y' a9 m  ^% t" \" R+ w' V
    136 initial
    3 t2 O# ]4 o: R" \% [4 C137 begin
    * C1 Z+ }$ ?; V' S9 q138       $fsdbDumpfile("sram_wrapper.fsdb");
    + L$ C) n3 B. c139       $fsdbDumpvars;
    3 r8 y5 n) t0 P- v" Q140 end* e8 U$ e) A' r) _; Y  L) r
    141 endmodule- |5 o& ?) a9 N' h- ~) h/ _( w$ I
    9 L. M  K2 X2 o6 l9 E+ o$ v# s

    : \2 {$ d( ^, G6 y/ T) K1 `2 f仿真结果! L8 E; c' V& M; \0 H6 m. [4 p
    ( B9 y, u3 e! i9 T. m
    # INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)
    & B$ m! r" O# F! H1 p9 g$ G#
    5 s- G& ~; u6 ]1 d( F1 a. ?  R#                  571 readfrom 00000000, value = ddccbbaa+ Q, ~7 _4 ^0 |8 y6 g) r. z
    # # E0 ]% B" S1 o0 I
    #                 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 00000004. R3 C$ e% n2 y( L% `- i
    #7 Z6 W) j5 a7 m$ g; R2 k
    & l$ U$ l' n0 X" C% r
    没有错误8 N# t: i: E& k4 k

    8 c( a6 {- ?7 r: [Ø  Sram_wrapper的soc系统仿真验证# l# D- P( n, w( a
    ( `. r" M$ o3 U
    加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示
    1 ~3 e9 n2 {9 |
    8 u2 c/ b" F6 `$ `7 z6 P( F 1 #include "orsocdef.h"1 l7 I8 X2 d5 m! @
    2 #include "board.h"
    9 n9 f# h  _8 k8 x7 s 3 #include "uart.h"
    ' [, ^' G; B9 \ 4
    " k7 ]. c, q4 G" V 5 int
    8 G  ~4 \8 ]% Z- U; d- m 6 main (void). S2 l5 q- p# A* j; |: Y
    7 {
    " o$ w$ A3 ~; h 8 long gpio_in;  E  \$ L4 x$ z0 i" V+ d7 r
    9   REG32 (RGPIO_OE) =0xffffffff;
    2 ?& ^4 W& ^7 \' L10
    2 Z* y9 ~& ]7 K- z11   uart_init();6 A1 l1 A3 h, @7 {4 i! L2 l
    12   
    4 {7 e5 o% H! N5 D6 k, H8 R" q( e13   uart_print_str("2Hello World!\n");
    ' v: B. Y) r/ Y* p4 ]  Q14   
    3 k" W9 m7 @5 d2 A( T15 int i;8 a4 I1 K  k: L4 t. J9 ?
    16 int t0, t1;
    5 F" j' f9 [% q5 M17   t0 =0xaabbccdd;
    / \1 g6 L  X' E  [' Z18 for(i=0;i<10;i++){  B0 g0 x) {5 {( e
    19 //REG32 (RGPIO_OUT) = t0;
    : I5 v0 R/ E/ q2 f. B& w20     REG32 (SRAM_BASE + i*4) = t0;: [4 p7 o6 d$ V9 u+ _  K+ Q
    21     t1 = REG32 (SRAM_BASE + i*4);
    ) Q7 y) s1 {- }2 ?0 a5 R+ u4 Y22 //REG32 (RGPIO_OUT) = t1;- n: ~$ Q! u! J: {% W0 x
    23 if(t0 == t1)0 w6 K3 f# ^- V# [2 @* a
    24       uart_print_str("correct!\n");0 f- d% f- |! V6 J
    25 else6 G0 G2 J# ~) u0 |
    26       uart_print_str("error!\n");
    1 ~3 j7 m" [- o6 N6 G# j5 d27     t0 = t0 -0x01010101;& o, D/ _2 q5 o  ^: ^
    28   }
    , ~* {" ]: V3 ?( L7 l/ l/ ^9 d/ Z29   . s" K9 B  g$ e, @
    30 while(1){5 J& s. X% d' b0 k1 |# ]
    31     gpio_in = REG32 (RGPIO_IN);, [; r) c8 h2 }+ q* H1 b
    32     gpio_in = gpio_in &0x0000ffff;3 r3 `) r/ ]- F- H3 a) _+ @
    33     REG32 (RGPIO_OUT) = gpio_in;; L" m& }$ D1 t5 B
    34   }
    ' i# f  n- }' D9 j8 O) _35 ! d% r* b3 i. X' w" h; C/ j
    36 return0;
    $ b4 o; ~; ~) b5 [" g: I37 }
    ( H8 a+ L, G' k+ A4 h
    3 B6 h; N% z- @3 V  Q* ^! h* z* s/ v6 ?# D; e1 h/ k# \; d
    仿真结果9 N0 m3 m6 s1 O% m% j$ h

    , a9 ?" `1 f+ \8 I# 2. }0 a. k$ s5 G. K0 m, g
    # H
    $ ?2 Q/ F7 z/ d7 \( s) m- j- B# e7 W* R' r7 S. y3 K2 V+ b
    # l
    ; C* Y$ Y* \: L  V9 S# l& U0 L* W9 Q; u2 \4 Y  ^4 k  Z$ }
    # o
    ( a3 {3 C6 t, E) d  m2 J4 }/ ]( c#  9 U  t- O; y: H  Y1 _, M
    # W9 w7 \4 D1 f1 k& @7 c" J
    # o
    # G8 Q3 h% F& C8 p# r$ t* F5 _/ S+ W1 G2 B/ d- p
    # l* F# Y, `8 J% y( D" C: d
    # d
    * q! o: o8 m: _! y# !2 Z" w7 @* V, A3 o
    #
    ) Z5 c& W+ s8 g' S# 3 R& \1 k9 K3 {
    # - |# d" v3 q9 h1 T. a: `7 E
    # * C7 m! y3 ~: E1 z1 y4 j5 l
    # c
    0 k) Z8 Q/ _: s# o: [" I' f& P! K$ i/ M- ~3 V
    # r. m5 P, u" I" X2 U: d& i2 R( Z
    # r1 m" s9 e+ R& V! w! `1 Z+ ]
    # e3 `8 w& F' `' n" g6 ?3 g% q
    # c
    / b* @, c- e5 z( }8 G6 r8 u' w# t
    ! `: t% \% X/ I% _, [# !' d" K, _7 {3 K# h" `& q
    … … 3 K6 q/ R, k1 C; x

    ; n8 i& i. O/ R在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。
    ) M* |, u  S4 }9 V% J$ H! [6 {
    $ g% v, U# ^" J7 _% s* SØ  Ssram控制器的设计与验证/ x' d0 K. d5 n6 W9 P

    9 V! j9 o# C+ c6 r( aSsram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。
    ; p8 ~# A: |5 t, \2 i" t
    ( c& ^% y* H# t2 p/ y关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下: s1 m) R9 x7 W2 E8 ?1 i6 q+ Y8 C
    5 ~) \- `' Z5 _/ q7 Z( P

      B  [" L( s# l  \* k% I  1 //----------------------------------------------------------------------------//% H3 c) c* ~3 Y
      2 // Filename       : ssram_wrapper.v                                        //
    9 i: r9 G* S# q8 A0 l  e  3 // Author         : Huailu Ren ...()                                       //+ s4 Q) q) \& t' X% i
      4 // Email          : hlren.pub@gmail.com                                       //
    $ b0 g! V0 C& _- |2 l+ S/ D  5 // Created        : 23:54 2011/5/17                                           //
    7 k) I# P; H5 v+ O6 h' e+ X5 ^  6 //----------------------------------------------------------------------------//! k- C1 }: S# w; ~
      7 // Description    :                                                           //
    8 y; Y+ I* C9 r" e/ c  8 ////: ?7 ?7 g! I/ m' `
      9 // $Id$                                                                       //
    # A3 P# H# p+ F1 V* u 10 //----------------------------------------------------------------------------//+ J' ]6 H3 F. w, L$ ^
    11
    4 h) S0 p: W6 u1 G7 B* W5 F 12 module ssram_wrapper(1 Y0 s( }( K- c1 B$ V6 C/ E
    13 input              clk_i,
    % W- `6 v- v7 \2 K7 a7 G1 W 14 input              rst_i,
    3 [7 @( c+ ~: Q+ ~- C) b 15    4 A$ I, \' w+ g, d" Q8 Z7 s& [
    16 input              wb_stb_i,
    8 w# X& V  i8 @+ i! r 17 input              wb_cyc_i,
    0 O$ X  w( [) x2 z5 |- u9 r 18 outputreg         wb_ack_o,
    % o- X& P' E* n7 l# ?7 u- u  B 19 input      [31: 0] wb_addr_i,' H8 b) `/ f& d4 ?0 S' Y
    20 input      [ 3: 0] wb_sel_i,
    ; J: y* o' E/ ?' L9 s/ c9 p 21 input              wb_we_i,
    ) T/ b( `; a$ c2 o) \ 22 input      [31: 0] wb_data_i,: o) k. g& P: n, l
    23 output     [31: 0] wb_data_o,0 B7 v  d- v; e0 G
    24 // SSRAM side
      {* z& z# w4 G1 y. L- Q5 W 25 inout      [31: 0] SRAM_DQ,     //  SRAM Data Bus 32 Bits
    + {! O* u- v: Q  O6 t9 i$ ^' P" g 26 inout      [ 3: 0] SRAM_DPA,    //  SRAM Parity Data Bus
    4 f' E, U( p# } 27 // Outputs                     % D5 f0 c$ V; q1 d5 y. t
    28 output             SRAM_CLK,    //  SRAM Clock  d$ a2 r( a. _8 z
    29 output     [18: 0] SRAM_A,      //  SRAM Address bus 21 Bits
      z2 O9 _& Q* i7 l+ p) S 30 output             SRAM_ADSC_N, //  SRAM Controller Address Status  
    - |; A4 `8 O. H( h' |- d 31 output             SRAM_ADSP_N, //  SRAM Processor Address Status7 \( h# I- T" E, U0 G9 C; K
    32 output             SRAM_ADV_N,  //  SRAM Burst Address Advance
    ! J% b5 H2 u! R! M; C$ i/ m 33 output     [ 3: 0] SRAM_BE_N,   //  SRAM Byte Write Enable  L- n9 T  |0 ?% D3 M# v& X. r4 s
    34 output             SRAM_CE1_N,  //  SRAM Chip Enable9 k2 O5 u" \" y  }1 c3 R
    35 output             SRAM_CE2,    //  SRAM Chip Enable; j& S, z& z' d
    36 output             SRAM_CE3_N,  //  SRAM Chip Enable1 s' O4 w3 ^% ~4 B) g. K
    37 output             SRAM_GW_N,   //  SRAM Global Write Enable
    0 q7 x% D2 o3 v4 V* N# M 38 output             SRAM_OE_N,   //  SRAM Output Enable) O4 O( I5 [! G3 W1 i$ \" x& N: Z
    39 output             SRAM_WE_N    //  SRAM Write Enable6 x% E, x/ ]9 }% p$ j( r% z
    40   );
    * H2 p$ A/ b7 e- P* z3 V" B 41 2 h5 a* k) O( @5 r
    42 // request signal
    ' x  z( l) f2 h! z. R- u 43 wire request;
      q2 a+ F: M# E  \& ] 44  
    4 u4 P' |- u+ k: w9 R 45 // request signal's rising edge- t' ^7 K- q3 D
    46 reg  request_delay;
    " L/ I  A" i2 l4 g 47 wire request_rising_edge;
    8 ?0 v  y* ~8 C. j 48 wire is_read, is_write;! \% ?9 w, ^8 t
    49 & G$ J* E6 ~& @* i1 r: y
    50 // ack signal
    ! V5 d( i) n* u, z# f- B) R 51 reg  ram_ack;
    " W/ l3 A3 a) L+ u2 ?% Z: z 52  6 t, b- K; {* X
    53 // get request signal" L; n: n% H5 z9 B1 m5 \
    54 assign request = wb_stb_i & wb_cyc_i;
    ; X5 v% F# z) {, [* N 55  * K' ~7 H3 j2 P' r) `7 G7 y
    56 // Internal Assignments
    5 j- \" m! k- s2 a! ?# ` 57 assign is_read  = wb_stb_i & wb_cyc_i &~wb_we_i;
    . o! x( c. x0 ^* D0 \" d9 l 58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;
    , \6 X! Q2 H- [ 59  5 B  x+ e1 N- l; l6 C( T3 C+ q
    60 // Output Assignments
    & V8 b/ B8 N1 }0 t 61 assign wb_data_o      = SRAM_DQ;3 J# D9 ]9 ~* ^* `5 A+ i% D8 J
    62
    * T/ Y* I3 l: ]" Q0 W% G: d 63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;# w* r+ z/ A5 R! a. T
    64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz;
    ' t* f& X$ P) g( P 65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;1 R8 I) z0 F" q+ O" a
    66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;+ ]5 _7 j. k- L( s, s' |6 L( Q
    67
    . l; Q$ G  u) l, n5 F 68 assign SRAM_DPA     =4'hz;
    , c8 o; i2 y; M/ H8 \ 69
    2 l3 F  F& P& U2 ^$ L; |  k 70 assign SRAM_CLK     = clk_i;
    " a" Z* @# ~+ V1 g* j 71 assign SRAM_A       = wb_addr_i[20:2];! Q. G5 m+ T+ E9 Z6 n
    72 assign SRAM_ADSC_N  =~(is_write);4 W: S8 a3 e, d2 f$ H+ q: F% B
    73 assign SRAM_ADSP_N  =~(is_read);
    * P& q* h; t7 R+ y( G 74 assign SRAM_ADV_N   =1'b1;( T4 Q# k# @3 R5 n! A
    75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);
    5 G& z2 W: _9 f% m) k  S 76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);
    6 S- y+ m! _9 a: {/ M# v# l 77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);
    , e9 B$ R9 x5 p; R# \ 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);
    : o- G" c! q' q( n# e 79 assign SRAM_CE1_N   =~request;0 h9 C7 u1 E+ {+ p2 C, o3 t
    80 assign SRAM_CE2     =1'b1;- v& b0 Q3 O) p- Q
    81 assign SRAM_CE3_N   =1'b0;3 u& ?5 G9 F/ V7 B/ X9 P' u
    82 assign SRAM_GW_N    =1'b1;
    3 p& W; V8 W( W3 ~ 83 assign SRAM_OE_N    =~is_read;' A1 r# w8 g1 E
    84 assign SRAM_WE_N    =~is_write;5 H3 f& _+ c- D2 e
    85  
    $ X# G7 v1 N* Q+ A8 m( ^ 86 // get the rising edge of request signal
    4 i" H/ o4 p* x" x, { 87 always @ (posedge clk_i)0 y/ b$ t3 k  B  k; C8 P3 O- k
    88 begin
    ' b# q/ ?) C% Y  V; {* d0 n) K 89 if(rst_i ==1)% P; o6 E. r: Y* R
    90       request_delay <=0;5 b1 Y' W" k! S; M
    91 else
    ; L6 f) z5 F0 f1 [- k 92       request_delay <= request;0 C- d( K$ {3 q2 b6 G
    93 end
    . K. ~) u  N: R2 q1 ^ 94  
    4 T; L: v! [- Z 95 assign request_rising_edge = (request_delay ^ request) & request;5 x$ f& I- v$ ^$ M/ X% z
    96
    2 {) E4 u3 I  e: w( J 97 // generate a 1 cycle acknowledgement for each request rising edge
    - |! |9 t+ f4 W6 D  G 98 always @ (posedge clk_i)
    3 R" ?. }0 f: |% L0 G/ [ 99 begin
    ) j* A5 j& z9 F# E0 k( \100 if (rst_i ==1)7 B! e  N) f, F
    101       ram_ack <=0;
    3 r! Q) F0 n; Y102 elseif (request_rising_edge ==1)
    4 x0 I$ @! i5 r' c' m103       ram_ack <=1;+ C3 }$ B+ z3 V- B- Y7 r' p0 _
    104 else
    * g! `3 h" ]6 s7 t7 e- G* |, G105       ram_ack <=0;6 `  Q: |- y* S: d) V
    106 end* w9 E: \- _, U! _+ ]  q, J2 m
    107   @7 J5 C- R: E) g+ {
    108 // register wb_ack output, because onchip ram0 uses registered output5 @; T1 |& e! @7 Q
    109 always @ (posedge clk_i)
    % I! d. ~- J: ~0 N: H  U7 F/ k110 begin
    - r" ]3 W1 ]& o8 e) t5 f111 if (rst_i ==1)
    ' U2 N# y' M2 M3 k112       wb_ack_o <=0;* t, D2 w6 [  L, t- s* R
    113 else2 C5 H7 Z* [. M3 d
    114       wb_ack_o <= ram_ack;6 O6 b8 E% }! D
    115 end8 q& W- u+ u. g1 G' q. F
    116
    . @# Q2 Y; N% Z% k2 u117 endmodule2 h" |1 [! x; R+ G
      @7 Y4 q" O) q! g1 B, O+ P  T
      q4 k) {! a1 e9 [# |7 H# s2 ~* G" \
    并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
    # V( Y/ b. B3 m5 i4 k2 _
    : Y# S6 H8 ^: g0 k$ P! C源码可以在这里下载
      e8 b3 y3 u7 N2 }& [8 t1 {+ V- m5 ]) t6 Y
    稍后。。。2 J7 X5 Q# c6 L$ ]
    To Do
    / L# K- y$ S, h/ r* u9 i8 D- t( X7 w7 N
    用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码* V1 r+ I- R1 T' L8 q
    修改以下用所写的sram_wrapper移植到DE2-115平台上
    , O: p) h, F7 D5 E: i4 z  YTo Do--关于opencore,or1200的soc平台
    ) s- p9 H6 B  ^" h/ m
    " o7 y6 t: k% x+ v/ UOR1200的引导方案设计(基于硬件或者软件uart控制)7 K3 |  U1 q8 }; F+ k' C9 N# i$ b' u
    移植uc/os II操作系统
    : R/ S; M( N( S# N; a+ ]驱动起来DE2-70上的网卡1 C) i" e0 E/ _
    加入jtag模块- r, U( F) e6 W4 c0 c8 v
    移植u-boot
    8 w9 N! p/ e1 f% F1 U移植ucLinux
    4 D: U+ l; ^# O8 U9 }# j) u……
  • 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 15:14 , Processed in 0.250000 second(s), 24 queries , Gzip On.

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

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

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