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

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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x

    0 n7 |8 a! B! {* T5 G: e7 J. fØ  DE2-115和DE2-70的存储器配置# A2 X* Q  W8 w+ _' {

    , @; ^, K3 k. a5 L- f5 K5 k- Z3 fDE2-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之间反复转换。, H8 s3 G- ]( Z
    . B) g/ T  g$ J; x
    Ø  Sram控制器的3中验证方案8 J& y3 ]7 Z2 x& t( r* V0 W

      b  I0 L* ]5 @8 x& K4 o6 z9 w本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。
    # A8 S8 a8 N# j+ m) l* D8 x% H. m2 ^. K/ G: [4 y9 B

    + t0 Z& q7 T( |7 f/ Y9 E" L  ^/ v
    以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。
    8 j4 {- v' s  E' K1 b9 N5 v, D  t/ q1 [& B) s& f: b- v+ E1 l+ e
    我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?
    ; D. f1 _* `0 e. H0 N# [0 p: O* E1 I0 m+ j( ?3 V' ~3 |. [* Z3 e7 e. _8 m
    Ø  DE2中sram控制器的时序要求7 n: f+ a" ^/ s( c

    0 j5 s* H* }6 m4 ^6 K5 T2 fIS61LV25616的一些常用引脚的功能& z" k3 v. j  Z

    ) D$ S8 U1 a) |
    + P4 O' H+ O" [# {6 k/ d" s& R- W) L- }/ S' c- s
    读和写时序按照参照datasheet中所介绍的这两种方式* `: g1 \5 ], u2 a, j" \4 X
    2 d# u' s! M$ d" o) C4 m2 f( V

    / p/ V/ h- J% R3 X6 g2 Y- b: Y/ ~' d& G3 H, H# i1 N: c' q& L* _# ^

    ' T0 G+ S0 z* ~& ]' N3 Y& V
    " D% L& s/ N+ _# @& w1 x3 o在wishbone接口中需满足途中的基本时序要求。/ `' ]" t6 |( K  x* s6 ]# y. D
    : m2 v+ {; g/ O+ _0 v" y' l# H
    IS61LV25616的verilog model在网络上很容易可以找到  b1 h# K/ x+ d
    ) A6 g. O. Q) A% a4 c/ q' E

    $ S+ o! Y' [) U/ h/ |7 H8 o1 L$ Z  1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.$ L2 s$ p' G* r7 V+ u8 ^
      2 // Note; 1) Please include "+define+ OEb" in running script if you want to check
    9 |; f& C5 M5 O8 L+ m3 M9 T- Z  3 //          timing in the case of OE_ being set.4 E# I4 i" M5 M3 }9 _' A5 y0 c
      4 //       2) Please specify access time by defining tAC_10 or tAC_12.
    : f( e: u2 ^" V9 D3 ]% s  5 ' l; E& u" ^2 I+ R# [( h9 h$ t
      6 `define OEb
      d8 U$ o2 a. g; u. N  7 `define tAC_10     //tAC_10 or tAC_12 defines different parameters3 d7 F; |% [& J% k5 I
      8 `timescale 1ns/1ns  `& X9 {' U+ \" e5 w% b! n
      9
    7 b7 _* b6 o$ D* n9 ~ 10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);
    & \, B9 l/ O" h' @7 x# t9 U 11
    7 \( G- ]8 G% w  _" e  D+ N2 T 12 parameter dqbits =16;
    / G3 b: e( o4 }/ U 13 parameter memdepth =262143;/ V1 d( w8 e6 B
    14 parameter addbits =19;
    ) ^' j( R" u, X8 y 15 parameter Toha  =2;- I0 b" [6 M6 k  ?
    16
    7 @2 e) x$ S2 D- F' J: e7 d9 [7 X4 q6 G 17 parameter Tsa   =2;
    % g2 p$ K) Q% B+ {  f/ }7 @( } 18 ' Y8 A; H# G7 ]6 D1 E( D& K+ j
    19 `ifdef tAC_10         //if "`define tAC_10 " at beginning,sentences below are compiled
    . `) Z# A4 `% L. V 20 parameter Taa   =10,
    / ]3 ?) l- v, t- c' @& l  w. C 21             Thzce =3,$ m$ Z, @& q! F- o( c8 h
    22           Thzwe =5;
    9 ]& t: U" f6 X1 ~' l 23 `endif2 n2 y! u# W* x3 {# M
    24 ) g! x+ @9 Q4 |
    25 `ifdef tAC_12        //if "`define tAC_12 " at beginning,sentences below are compiled
    1 ~1 y8 t/ N# L6 U# r/ X% h 26 parameter Taa   =12,
    : S2 l/ l' D, f 27           Thzce =5,
    % I, Y& P: ~, S 28           Thzwe =6;) d4 P+ b) `% g7 g( k6 k5 s
    29 `endif: k: ~0 w" \" _/ f8 n
    30
    + _8 G, H$ @  ]  d7 @ 31 input CE_, OE_, WE_, LB_, UB_;
    1 z" z. v' I5 n( t% p( D 32 input [(addbits -1) : 0] A;
    & S9 D, L5 @' `1 H8 J% `. h 33 inout [(dqbits -1) : 0] IO;% ^1 @  `1 F  M2 X2 v1 E% u6 K
    34  8 I# l/ j, H* G7 J9 [, W: b
    35 wire [(dqbits -1) : 0] dout;
    " K  b/ N) ?* B  _ 36 reg  [(dqbits/2-1) : 0] bank0 [0 : memdepth]; . y: b2 d  ^" j( y2 J5 ?
    37 reg  [(dqbits/2-1) : 0] bank1 [0 : memdepth];% U. \8 F' Z* ~' ~/ ^) V
    38 //array to simulate SRAM
    9 G& L' ?! Y$ F: b- F 39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};
    * Q# ?( j6 }) f 40
      }. z4 y! M# Z7 w8 r 41 wire r_en = WE_ & (~CE_) & (~OE_);   //WE=1,CE=OE=0 Read
    9 N* I4 Q# E9 C 42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write
    " `& I+ o3 S" e/ \- S 43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; , ~# V( I  N. j$ e$ A
    44 - Q. \* u4 j9 j4 d! {$ F
    45 initial
    & G5 Y4 A2 O5 `! _ 46   $timeformat (-9, 0.1, " ns", 10); //show current simulation time) d1 K7 f1 t* i( A0 e$ k
    47 : u. l; K: O) [6 `
    48 assign dout [(dqbits/2-1) : 0]        = LB_ ?8'bz : bank0[A];  v  m+ d# X: C
    49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];( A5 U8 p+ M* C
    50 ) K  G, U  m0 ]: ^
    51 always @(A or w_en)- ?8 G9 N* e; z; ?# \4 Z0 ]
    52 begin8 K" f7 Y, I9 G& ~0 H
    53     #Tsa    //address setup time% A4 R# ?% U* O! Z( ~
    54 if (w_en)% Y+ g" f- c! A* A# i2 b( d7 N1 x
    55       #Thzwe
    1 C" l" w) R" U. f  Y. @- i; a" A 56 begin
    8 f  f' t7 N8 [5 o. c- b: Y 57  bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];
    $ [# g6 B1 u9 U! Q' A3 O! b 58  bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1)   : (dqbits/2)];
    ; i7 y* r% P2 q4 G3 [; z 59 end
    4 H0 L1 \4 A* ^( [# B0 g 60 end
    2 @, L2 c7 x" I$ N9 @% b! G 61  + n" D6 N0 u" A( F2 Y
    62 // Timing Check
    , Z$ B9 y/ V  T! u2 h8 L2 | 63 `ifdef tAC_10
    % }) f( `5 I0 k" i& Q0 a* l 64 specify//sepcify delay4 W# W2 U, j  q/ \& p6 q+ G
    65 specparam7 W7 \  q6 y% d/ z
    66       tSA   =0,! E3 |, k: Z) K7 e5 k  A2 K3 K
    67       tAW   =8,
    " X" i5 D/ s. Y" Q 68       tSCE  =8,
    + [- L. X0 x# M5 N- `$ m 69       tSD   =6,- H/ t$ g- b% \' V+ T' i
    70       tPWE2 =10,% }/ B1 t( j+ y& @" Y) @$ J
    71       tPWE1 =8,1 h/ s9 b' s0 x2 i
    72       tPBW  =8;
    . z( i. y1 B1 n" ~: u 73 `else
    2 E, |! k2 B2 G( \% p7 P 74 " Q8 h! h3 A$ j- e
    75 `ifdef tAC_123 Z8 F$ H$ n' u9 Z2 _5 j
    76 specify
    ! ^# G! r  Y5 k" V4 n 77 specparam
    . K1 n3 f" B- }2 ]% B6 C: j; _8 f 78       tSA   =0,
      Z2 I! L; j  h9 ~/ K+ t8 S6 g* z- F 79       tAW   =8,
    9 e6 Z! ^: F! M/ D 80       tSCE  =8,- i& f& c6 z. C( D: V/ n3 z
    81       tSD   =6,
    2 l) `2 C7 \" p" R 82       tPWE2 =12,' K+ F1 _& ^% U8 r- M
    83       tPWE1 =8,2 r4 Z  L! W" w: Z& U! q$ R
    84       tPBW  =8;
    . ?- M' |3 }/ Y9 J& U# x1 O* U6 c' O( k 85 `endif
    - c6 M' l4 I/ K: F 86 `endif2 A! Q' |$ k" l7 Z6 y
    87
    ) ]) \- V/ S8 x2 M4 ? 88     $setup (A, negedge CE_, tSA);
    0 J" \. t1 Z- v2 a8 {$ p/ m 89     $setup (A, posedge CE_, tAW);1 e5 [$ V' Y8 H0 y+ t, a# a! f' G
    90     $setup (IO, posedge CE_, tSD);
    ! L0 X5 N3 B# Z  ~! l9 G3 Y6 i 91     $setup (A, negedge WE_, tSA);- S: U: \5 u. Y& a; E1 f, @
    92     $setup (IO, posedge WE_, tSD);
    4 K, k+ H# b( e" V3 c  R& ^( U% j 93     $setup (A, negedge LB_, tSA);
    : ^( m9 S) X' |$ Z) v6 A2 | 94     $setup (A, negedge UB_, tSA);
    / O' I; W  o- {/ i 95
    . a9 c: T  _3 V( x7 G5 ^( R 96     $width (negedge CE_, tSCE);
    ) t! e& W$ \0 w 97     $width (negedge LB_, tPBW);% _3 c6 U- u6 n( V, n/ \0 J- E
    98     $width (negedge UB_, tPBW);% ^  G) C/ o! R+ u5 T9 d' r
    99     `ifdef OEb/ r- q8 e) e8 ~. e3 _
    100     $width (negedge WE_, tPWE1);) D) n$ O( h+ ^" j
    101     `else3 e2 ]% l5 S# V1 Z& f
    102     $width (negedge WE_, tPWE2);5 b* C% j( `" P/ w3 P
    103     `endif  D- }7 T) U, w. v7 ?  G
    104 ! G9 ?1 m% H  u/ Y8 Q  Y( i$ K
    105 enDSPecify  }- d- F* g+ \& S0 e
    106
    7 }3 W2 d1 F& b8 J  g1 ?107 endmodule
    5 ~' W; f5 o) r- y9 f5 Z/ Q- x
    ' N% `* M& |2 ^  `% h7 f+ D! M8 F6 O4 k* Q  o* u4 Y; a& n

    - }- t- u: H* m5 y- v; n0 D
    ! A! v9 V7 R  a' OØ  Sram控制器的设计/ ^9 Y6 n2 x0 C) i1 Q; G

    & s, n0 {: }5 J* }" Y9 ]3 c7 _: M& ]Sram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。. R% x. {6 Y7 Q
    6 A+ f1 \8 A8 O& t4 l! h
    Sram_wrapper的源码/ q9 e2 ]; j& h3 I" w

    : V- F# l& c+ B// Author(s):
    6 ]6 [, F$ H4 J! O2 E// - Huailu Ren, hlren.pub@gmail.com! ~; o* J5 e2 M
    //- d2 [9 b$ ]4 P1 C; }5 C

    ) n' \9 t4 B, |# O. D// Revision 1.1  16:56 2011-4-28  hlren/ ^* M4 A5 i/ \
    // created
    ' `7 C* v) W' ~//
    * c+ ^5 k' U  _2 }% D+ }0 y3 N; _" c. I( u  h, G; H) i) H" V) @
    // synopsys translate_off/ R5 l/ S, ]8 H' k
    `include"timescale.v"3 N5 O% c1 E& Q( Y* V  g' L' X1 n# L+ \
    // synopsys translate_on
    " R3 h- {) E( g+ O7 i; H
      L9 \$ N2 e2 m* |! r6 Kmodule sram_wrapper (
    , s9 b7 }6 S5 J0 h1 m    wb_clk_i,8 ?& N. c% h: s/ a) P2 p
        wb_rst_i,% W1 x+ @9 i" S% R6 ]

    ) |  v) ~6 W" r9 N$ t' j7 K    wb_dat_i,7 p' z' S, V& Q
        //wb_dat_o,8 s# }2 P* N  V# s3 X; K9 R
        wb_adr_i,
    0 F. l: h% h1 z7 w  C0 X3 g$ O    wb_sel_i,
    - S- x2 x. g  i+ ~2 ?0 y    wb_we_i,6 a3 F; S% {* ?, V- T
        wb_cyc_i,
    ; T/ [3 ~( m2 l: {    wb_stb_i,
    ) O) m) X- ~+ @$ C4 J5 Q" C9 V6 ~( |3 b/ W' Y: P$ T
    3 t# x7 |, h6 t' f' K
        // Bi-Directional+ W9 N- |! I6 U( K5 j1 |! ?) ^9 s5 i
        SRAM_DQ,
      |' [7 R9 G4 p4 h  |& [/ _6 b  l8 `! Y; P" }" Z+ f5 y
        // Outputs
    $ F( n6 ^4 W. o8 s# d    wb_dat_o,0 b; r( Y  t  ^$ Q0 Z  F
        wb_ack_o,
    4 r" \# g5 f2 Z/ a  Q8 @- H  G. T5 m    wb_err_o,6 |. {2 j' p1 s$ G- u
       
    1 x# y0 y8 M3 l    SRAM_ADDR,1 d  v/ A/ n$ @  Q  b
        SRAM_LB_N,6 M4 j( v% s# j4 z% l; w" j$ k
        SRAM_UB_N,! g9 q( s" W5 n! p! h
        SRAM_CE_N,& j9 U- \) B! L: h$ J! k' S' ~9 e
        SRAM_OE_N,0 F8 e0 K4 W+ r  D4 o
        SRAM_WE_N! v5 _  |' L+ f" `1 F+ f
    );
    # t$ \3 ]8 @4 ]9 E. g+ c( U2 v3 l* }" s: b; F2 ]1 k
    //* Z  i0 x. o  u/ K/ K! w
    // clock and reset signals
    6 N, ^* x+ n3 [; [( R1 V4 n1 m  J//" _3 l. P  K! v& S. U
    input         wb_clk_i;. ]! V1 z/ U4 x) ^
      input         wb_rst_i;
    ; K: B# x6 r4 v& u% n; a0 [//- j+ g/ A6 Z4 m8 X
    // WB slave i/f1 b# Q3 V, `0 V
    //
    ( P% G9 \- M' ]/ pinput  [31:0] wb_dat_i;
    1 k" E% d4 E9 R1 m$ H- T& t  output [31:0] wb_dat_o;" L& ^2 n+ }: x5 J4 ?+ W- w
      input  [31:0] wb_adr_i;+ P, `3 G9 d! X9 J+ ]
      input  [ 3:0] wb_sel_i;6 M" b! H5 T5 q& v& \, o+ Y
      input         wb_we_i;; S0 X0 k2 r* t6 g3 N' m
      input         wb_cyc_i;
    ; o9 k! s" p- C- A  input         wb_stb_i;1 d& h% a' n0 b
      output        wb_ack_o;
    2 z( K# D5 z: R  H  output        wb_err_o;7 R( O" }( h6 R) @3 E
    //
    $ u# C5 O' o% ?  v7 j+ W+ m$ l// SRAM port3 B( C6 B7 }& y
    //5 A9 _# v% [4 W' \3 N* }
    inout  [15:0]   SRAM_DQ;    // SRAM Data bus 16 Bits
    : G  m  R2 e! F' n( S- w' n6 zoutput [17:0] SRAM_ADDR;    // SRAM Address bus 18 Bits6 N# p2 @% V. s
    output        SRAM_LB_N;    // SRAM Low-byte Data Mask  q5 G: L7 K& {; k% o2 w9 t& A
    output        SRAM_UB_N;    // SRAM High-byte Data Mask, H( n. ~, i3 G* y5 l: c: V
    output        SRAM_CE_N;    // SRAM Chip chipselect& Q3 q1 z7 W# l  O3 S% ]7 x
    output        SRAM_OE_N;    // SRAM Output chipselect- z5 s3 j, m5 y7 O6 d7 e
    output        SRAM_WE_N;    // SRAM Write chipselect& R+ _$ z1 j& j% V$ N5 a' z

    & K! d) M3 x/ y8 Y- L7 w  reg    [17:0] SRAM_ADDR;
    ( z: O% ~. H  W- V! N$ x, D  reg           SRAM_LB_N;
    / Y( b: U1 g% U; c8 P( ]  reg           SRAM_UB_N;6 c, ~0 H8 L6 B8 X1 `" Q% {
      reg           SRAM_CE_N;7 t4 a* |! B) h2 ~- r% f$ m
      reg           SRAM_OE_N;
    ( @3 }5 r8 [! r$ V, E4 N) J$ |  reg           SRAM_WE_N;
      g7 W  }' W5 j4 y) { ' A7 T% C: W! Q! X
      reg [3:0] state, state_r;
    : Z  o' J! V; Z8 r5 p! j  reg [15:0] wb_data_o_l, wb_data_o_u;
    - p# _; k. u: @9 p2 I * g$ m/ b9 l  I6 E
      reg [16:0] wb_addr_i_reg;/ K! [. d2 V' X& x
      reg [31:0] wb_data_i_reg;' w# c, D' r; ?+ h1 s  W3 C# R
      //reg [31:0] wb_data_o_reg;
    - B. C% ^3 V) C4 Y0 greg [ 3:0] wb_sel_i_reg;: C) [" I) E( [; n" `0 u
    $ H0 `8 c3 U# E7 `; L  y2 B
      reg ack_we, ack_re;
    6 i& O5 d, D& K: L9 [# C8 P// *****************************************************************************
    4 c5 G% \& C4 m' y) h$ m/ K//  FSM( S3 N7 ~$ |% ]! w& v9 }
    // *****************************************************************************3 x0 ]& i6 E' R# @7 m* M4 H
    localparam IDLE =0;
    ' P% a8 x9 [1 Q; t  localparam WE0  =1;' f& s. N5 f, m- E1 T
      localparam WE1  =2;, ~9 g! c' C8 \- O: S5 V; U# Q8 ~
      localparam WE2  =3;
    ) y3 B0 k7 \' W1 ]" B  localparam WE3  =4;
    - p2 w+ v3 {; [# w- M/ y8 l; e  localparam RD0  =5;
    $ s4 B+ I2 d  J( a+ V1 D# Y  localparam RD1  =6;
    , z/ z4 b2 T3 J) I5 K" z) u8 K  localparam RD2  =7;
    + i3 G3 v- X, c1 [4 u0 S  localparam RD3  =8;* F' S1 R$ N, I) w5 |# u
      localparam ACK  =9;
    " P* _# }* W" M; e. K/ ` 4 C! v- Y; Y$ m
      assign SRAM_DQ =  ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0]
    # U0 m) M9 V+ t; X8 R9 Y: @                    : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]
    # w. x/ h9 X; ^7 ^                    : 16'hzzzz);
    % {7 A1 W* X+ \3 k  {assign wb_dat_o = {wb_data_o_u,wb_data_o_l};! X( x/ U+ L; m) `% N0 Y- O/ x

    " l6 a3 \& {6 x7 P0 \- X  assign wb_ack_o = (state == ACK);
    4 ^2 x, T5 H* u3 U1 A. N2 @0 ]  assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);5 Y+ Q3 T* R2 p- K
    " N8 p9 r  V, {7 j- d7 v5 \/ A
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin" e+ T  ~" M1 ?, Q4 k' B/ d( o) X
        if(wb_rst_i)
    : ]# {- A) i: j4 Q3 k2 _5 ~( w0 |      state <= IDLE;! |9 Z, Y( K3 a2 O+ O
        elsebegin$ _+ y1 L5 m- O( m5 M8 `
          case (state)9 K6 W* K: w* H' Y% U5 j! }) J: |
            IDLE : begin
    * ~5 [0 P2 X" d8 N$ {          if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)- f: J1 \$ E4 B4 r. o
                state <= WE0;
    ) H$ x# t; x' s2 _' Y  i- ]% V          elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
    1 @/ N# S( W7 Z            state <= RD0;( U2 Z  N1 L" q4 d# [( O
            end4 i* _' K( o  X6 J- g* _
            WE0 : state <= WE1;
    0 W5 R' ^, x& F9 o- d. b        WE1 : state <= WE2;+ F$ M, q/ \  Q: s1 b: j
            WE2 : state <= WE3;
    / O7 R/ |7 B: d/ M7 V2 m# m* P( D        WE3 : state <= ACK;+ I) ]( v8 Q7 p$ u) X5 r
            RD0 : state <= RD1;
    ( f' F# I* Z$ W" g  J$ [. @5 l        RD1 : state <= RD2;
    ' u& h1 H1 {6 H* e1 b# o. i0 Q        RD2 : state <= RD3;
    : M% w; f$ k/ \: p+ A$ S        RD3 : state <= ACK;
    # v2 R. M- y" _% c        ACK : state <= IDLE;+ w2 r) |( ^7 O3 E4 H: h: O
            default : state <= IDLE;6 f3 ~! l: v  K* l
          endcase
    ) p% }" N. c; u- B5 S+ \5 d    end
      U( d2 |6 M/ W: r  end& d. {( q& e' e# Q7 y( s" C# g

    9 S- Y  x* f# \! t4 W9 U$ t% |  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    6 C  U  K! {, P0 I4 G' Y) D; w7 Q    if (wb_rst_i)) t/ \+ `# L" c1 w! ]6 a( M
          state_r <= IDLE;
    . T5 W- J" d0 O) I" W. S* c& }    else
    + R+ t9 a# t( k9 Y      state_r <= state;
    + d9 u" Q" S- U9 S0 n  end
    , h" P9 _% x" N9 x$ g  L: y1 j//8 k1 C6 X: b" e; y; m/ v
    // Write acknowledge
    - B& z8 I) C/ ?//3 Q$ j& A, ]- _# |  g6 K
    always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    % e& i1 i' S% h/ k) P    if (wb_rst_i)  h3 E9 ?6 `2 R) a
          ack_we <=1'b0;
    : E8 M! J: d/ J" ]$ |" ~' s9 {else
    9 d$ O" z6 r5 z# ~$ B    if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)
    ; q/ r5 P4 f9 I. E: X      ack_we <= #11'b1;
    2 c- [( W# i3 k# belse
    4 }! L9 g  Q- x. v      ack_we <= #11'b0;- |0 U7 F; ]6 |0 `, L* S$ q, \: a
    end
    5 a) P+ ]! Q# S# J1 C- I# r$ g 5 n( q4 i7 L1 u2 R, z, P6 J
    //
    / P# l2 S& k8 n* F8 G// Read acknowledge7 \3 z* D1 }# `
    //( |$ U. l" V( y$ S( P' g
    always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    # g! m6 M2 b' k- w- r' A) M# @    if (wb_rst_i)
    . s* e% ]8 a  ?% j4 t      ack_re <=1'b0;
    " n, a' {. Z0 P9 relse6 g3 K; k2 q$ O! ~5 d* S& B& O
        if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
    ! J, }* v/ A% R- u9 C! ?' B' o      ack_re <= #11'b1;$ g% _; Y- e4 j* c8 w  R: E7 m
    else) ?4 ^6 S+ g+ K
          ack_re <= #11'b0;
    ' U' Z0 h9 W% F8 tend
    8 y2 l3 G) x& d+ d& g5 X$ _/ t* Y4 l
    : _  X5 [5 [7 E+ h  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    - n1 y: |: }7 j( j  Q+ S    if (wb_rst_i) begin
    9 I" Y* u7 s3 c. f( T      wb_addr_i_reg <=32'b0;& m, H! _" ]) G
          wb_data_i_reg <=32'b0;
    : n7 z, ]6 @1 s- o7 x      wb_sel_i_reg  <=4'b0;
    & c: w: X- l4 \; b. w6 e- j+ Wend
    # _7 ~, |9 N& E$ ~! g) o/ D1 F    else
    - h4 c) z, S8 B; ~0 p% R    if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)
      T( `% p0 r* X7 ], u! }' t5 }    begin
    6 R  C( t' m$ D4 Q      wb_addr_i_reg <= wb_adr_i[18:2];( C7 D) G. p0 D* z' ?8 c
          wb_data_i_reg <= wb_dat_i[31:0];4 J$ s! n3 N1 R1 `
          wb_sel_i_reg  <= wb_sel_i[3:0];3 d' _0 g/ s, p8 q
        end: q7 i( ?. ^$ s: J- b
      end
    1 z; C. a" p2 U4 F4 `
    0 G' U* _9 r& ?  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    ( Z' }  @% H3 Y  c    if (wb_rst_i) begin  K0 Q; {, V0 J  {
          SRAM_ADDR <=18'b0;, f( _/ E* {8 o2 D3 p; U) h. Q) t
    end2 u0 h8 l$ q8 N& H- w7 B. y
        else; u: x! c, m' [" C9 N7 l! J
          case (state)
    2 u3 R3 L/ z% L! z( h) |- J        WE0, WE1, RD0, RD1 :6 s2 a$ ]2 u8 i! c2 ~; L
              SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};
    , C3 ^. F$ `- P" L        WE2, WE3, RD2, RD3 :! L9 R+ |5 X, C# o
              SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};# N, n8 s) h) k6 [" s6 n
    default : SRAM_ADDR <=18'hz;
    ) o5 W" u: I7 Q6 P: h0 e# vendcase& S$ l! I0 o( J- ^0 a. G
      end3 E+ r9 M. w6 z' T

    + [+ ^) k& f6 c9 U8 k  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    - Z" v$ ~6 Q  I6 z7 P9 p6 Y    if (wb_rst_i) begin1 M, k! x- W0 R! N
          SRAM_LB_N <=1'b1;5 A. ^# ^5 t  J4 O+ v: o! d
    end
    : d0 j0 f6 w& \; c& G# v, j    else
      Q5 c- W) @1 v      case (state)
    6 g+ d9 [/ C, j1 j& S! N7 B        WE0, WE1, RD0, RD1 :
    $ O$ k7 e0 f- j* ]          SRAM_LB_N <=~wb_sel_i[0];
    & [* X; D9 N1 K' [        WE2, WE3, RD2, RD3 :! V* s1 Y: h' i9 }' \. }
              SRAM_LB_N <=~wb_sel_i[2];+ z' b) f4 e0 d; L7 S0 a* @3 p% V
            default :
    " Y, x8 i& A5 N) v" v          SRAM_LB_N <=1'b1;' d# d& l4 n7 I; ^/ M) c: e# B5 g
    endcase
    , j: {: Z( L. s& ^  n. e  end4 g# E# }$ }3 d' d$ H

    ( ?9 i3 q6 Q& q- t" g& D- ?  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    ' r- N: z. s5 e# `    if (wb_rst_i) begin7 I( [2 [2 V8 b7 |# g
          SRAM_UB_N <=1'b1;
    ; l( A3 \5 Q" k7 F' U+ E6 Hend
    8 F2 l* G  O2 s* X    else% e# }1 @. ]- F
          case (state)  b" N' E/ \3 H( C
            WE0, WE1, RD0, RD1 :
    ) S3 E- g" C: m          SRAM_UB_N <=~wb_sel_i[1];
    - Y$ a# |4 O, P# X5 Q, ?$ p        WE2, WE3, RD2, RD3 :/ Q, k% i% o% d* E- H+ H+ r, W
              SRAM_UB_N <=~wb_sel_i[3];
    , O7 E- v; i. f        default :5 I$ k9 V8 T1 B
              SRAM_UB_N <=1'b1;
    * o3 t8 ?" `' E. j% Wendcase' O9 e+ V; p( d- |
      end
    ! @' Q4 @' q' f9 H* p$ }( K8 ?
    6 f/ s6 y7 S- \6 ]  always @ (posedge wb_clk_i orposedge wb_rst_i) begin9 e/ a- i: m7 {; M
        if (wb_rst_i) begin
    ! o9 W/ }. l2 ~7 R$ J      SRAM_CE_N <=1'b1;
    8 E# k9 o. n: k3 Gend+ k' n% I  t% y. O- z& U
        else1 M& r" W, k3 C( V' e+ ^
          case (state)
    : A4 @( [3 M# S        WE0, WE1, RD0, RD1 :1 B. Y) O9 e+ z2 H4 O. a; o6 ~
              SRAM_CE_N <=1'b0;$ S( [3 B! P% n, h7 T+ U
            WE2, WE3, RD2, RD3 :
    + G2 I, Z( D+ a1 S          SRAM_CE_N <=1'b0;
    ' ~1 S- v1 ?/ y% Qdefault :
    : c% M7 L4 S: ~0 y. ^2 W          SRAM_CE_N <=1'b1;7 q1 C: q, u  H- b7 h% Z
    endcase6 n9 V* g3 E% v; }& {/ Q
      end
    # S9 K0 M+ `5 u4 B/ J
    / I* C8 F% O- `/ d$ D" m+ s8 Y  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    9 W3 ~3 \3 h, c6 L& N, D    if (wb_rst_i) begin
    ) N9 p& O; o/ n  x/ R* ^0 d0 f      SRAM_OE_N <=1'b1;
    " w& g. c% x* T+ k; U1 N/ Nend
    + K' u8 n) f+ ?3 y+ Y( o    else
    2 H/ P2 w/ [5 a* d' X1 \( p# c0 }      case (state)" g# a2 ?& I6 ]
            RD0, RD1, RD2, RD3 :3 a9 L9 w# o; n. p9 f* C% Y) |/ R
              SRAM_OE_N <=1'b0;
    7 {, U: c# l6 u) Wdefault :  I" C4 W& f; d- v! e* @$ ^! c
              SRAM_OE_N <=1'b1;
    2 J2 g2 \8 x% E; L: Wendcase; d1 \/ y  x6 R' I; F9 ^
      end
    1 r, `5 L" p' R. C5 H, c5 H4 {
    3 m3 W* O" @( \1 b3 B* n( O2 R  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    " V' i1 C5 p$ |, _6 B& x    if (wb_rst_i) begin
    # G- Q$ ^0 r) s" C/ Q: s2 x6 S      SRAM_WE_N <=1'b1;
    # x9 Q/ k; Q9 Eend
    8 g. H% B9 c5 \* W' f    else! Z7 ^; \# ^5 `7 g# x4 W4 _
          case (state)# ?1 e% t) u- \7 w- W" H3 f
            WE0, WE1, WE2, WE3 :
    % Q$ Z  F  n! s- `1 V* Z: M( D7 J; G3 i          SRAM_WE_N <=1'b0;4 F9 D4 n3 G5 I# d7 F
    default :
    ; I& l7 j1 `6 N$ {9 V2 s          SRAM_WE_N <=1'b1;, W2 W, Z8 L' V- ~$ \
    endcase6 S& ~$ d/ r9 V) a; p  @4 {# X2 }
      end
    " q: S0 W) a# h8 h1 ^3 m, N  //+ g' S9 K  U8 x) o2 ~+ ~
      // assemble ouput data
    $ k! P, E: f6 V+ j# ~  //
    & H* h' s, Z/ Ralways @ (posedge wb_clk_i orposedge wb_rst_i) begin
    . \6 d  s# R5 _4 |+ X    if (wb_rst_i) begin
    $ t& z5 U; ~# y- S; b3 {. ?9 ~      wb_data_o_l <=16'b0;
    : h8 x, q* b. L, E      wb_data_o_u <=16'b0;0 n( C9 D6 _, o2 S4 v- ~
    end
    ) V8 P1 B5 ^$ k4 d    else  i6 N' Y: B+ u
          case (state_r)
    - z1 g/ \% _6 Y        RD0, RD1 :& _# o. Z  E! m6 |
              wb_data_o_l <= SRAM_DQ;
    9 S$ B  L: K  }2 e. N7 ^: r& C        RD2, RD3 :
    - P' g5 t6 D7 b7 N( G/ i          wb_data_o_u <= SRAM_DQ;
    2 t. Z: D% X9 y: q# L      endcase4 |2 p" h0 k* ]
      end
    - v  X7 d1 G. J+ X, Gendmodule
    6 b# |# Z+ E" F1 `0 P& @8 ]" C+ U# p3 c# O
    9 M4 }& [0 x- u
    Ø  Sram_wrapper的wishbone BFM验证: J' u- U5 A9 t7 X
    5 ]! ]. {* j( P6 N0 {, m' C4 k
    Sram_wrapper的BFM验证的testbench代码如下:
    ' F; a8 Y) }/ R& K, m$ P% C9 {5 o( {
    ; e4 m/ Q  L: M
    8 d' i$ Y# ^/ {! m: F3 s  1 // Author(s):
    ! K, d( X" G$ e( a  2 // - Huailu Ren, hlren.pub@gmail.com8 `: [1 g* S. ~/ y+ Q3 |! ^3 s
      3 /// T4 Q4 B, ?+ N; W- ^3 o: f/ T
      4
    ( q. l/ O3 i$ u  5 // Revision 1.1  17:45 2011-4-28  hlren2 @0 p8 x0 j. F( m
      6 // created4 S% [" T( o, ?8 Y
      7 //+ o3 Y/ C/ Z9 ~& _: D3 J
      8
    2 d* k0 t0 T; ~  R' Z  9 // synopsys translate_off+ i% K: h' R6 @9 v' T0 B1 _: b! {
    10 `include"timescale.v"
    : x# d, s0 k  [. R) i 11 // synopsys translate_on- G) y8 J. Q; q5 ^" e% i
    12
    9 P  k1 S9 _" @+ K0 b 13 module tb_sram_wrapper ;
    2 C- x- Q& H: P  W 14 / T4 N# d/ K9 h$ Z
    15 //
    7 R- @2 D) t& V+ u 16 // clock and reset signals' W9 _3 N7 Z( W+ P. [. r2 d+ {# }8 L
    17 //
    . C6 ?( P( H" w5 S/ N 18 reg         wb_clk_i;
    $ n( S$ a- \! w: `( Y+ R0 a 19 reg         wb_rst_i;$ \7 E% Y2 \3 {7 c9 q
    20 + u& \& Q; K' Y8 J
    21 // *****************************************************************************- ~' r! p5 i* C5 A! Z! S6 G! Y( N
    22 //  wishbone master bus functional model. t+ r$ H8 p, [/ U$ U! h
    23 // *****************************************************************************
    $ {2 u$ a& P( }# x# [8 Y3 F 24
    ' w! @+ p# G, A8 S% B# M6 z 25 wire [31:0] wb_din_w;% b7 ]7 c+ [, ^3 g6 ^- Q9 Y
    26 wire [31:0] wb_dout_w;
    ; i( A, `9 s! y! c- Z6 _: Q, T 27 wire [31:0] wb_adr_w;
    : E% J! s' j3 Z/ \* |# T+ I 28 wire [ 3:0] wb_sel_w;1 c  U: n( A2 D7 s8 e5 D' k
    29 wire        wb_we_w;% [# I$ {6 G* Q  k0 V( p
    30 wire        wb_cyc_w;; A/ J2 e, w. m. J. U* ]
    31 wire        wb_stb_w;
    ) Z1 C8 F# }% W8 w2 u 32 wire        wb_ack_w;
    2 M) F1 C* d# P* C 33 wire        wb_err_w;
    & h  V8 J2 c: F5 c' \ 34    . B0 }1 u' [5 n+ @# h
    35   wb_mast u_wb_mast(
    $ I0 S( i" W% o' G  Y 36     .clk  ( wb_clk_i ),
    0 P& e. w+ `2 W: ]7 q( [8 d 37     .rst  ( wb_rst_i ),
    ! i+ H# ]3 Z3 L( h: ]9 \ 38    0 y8 X  @* M; S2 e% ^. R. r
    39     .adr  ( wb_adr_w ),
    . E& r/ A. t- m. _5 m' d 40     .din  ( wb_din_w ),
    3 Q4 j1 _" q8 o8 S- R. C. T 41     .dout ( wb_dout_w ),
    % ^' q0 M& m+ w9 `# @* c( I$ P7 ] 42     .cyc  ( wb_cyc_w ),1 @- {8 b% K; K
    43     .stb  ( wb_stb_w ),
    9 S. M0 H2 B- p. {1 i5 t3 P  v, r 44     .sel  ( wb_sel_w ),
    # n% X+ o, b, B* R' m$ m 45     .we   ( wb_we_w )," T( S# Q1 w' O9 H' E
    46     .ack  ( wb_ack_w ),
    7 q# j6 e2 b6 S8 x0 @2 M" } 47     .err  ( wb_err_w ),. |; H) z( }+ ~% w- V7 i" g& P
    48     .rty  ( wb_rty_w )+ j  X! k: M+ J5 h; }
    49   );
    ( g& h0 ?' y6 k4 x' C1 p 50
    ( S3 R: b% P2 H+ f- y! U; N7 ] 51 // *****************************************************************************
    5 `3 m3 x6 s' x 52 //  sram controller/ m6 {' K5 N; z1 c; R  D" L5 W, y
    53 // *****************************************************************************
    ! ?% k' w; b8 @* [# h# w 54
    ! o4 s( S8 _# e* w+ W, C 55 wire [15:0]   SRAM_DQ_w;    // SRAM Data bus 16 Bits! C. c/ W0 u+ R6 u
    56 wire [17:0] SRAM_ADDR_w;    // SRAM Address bus 18 Bits
    8 T- D# W+ }3 G! M 57 wire        SRAM_LB_N_w;    // SRAM Low-byte Data Mask* q6 b- P: z0 x' Y: f7 e  a
    58 wire        SRAM_UB_N_w;    // SRAM High-byte Data Mask3 ^$ o7 G2 `/ {8 K; s" |
    59 wire        SRAM_CE_N_w;    // SRAM Chip chipselect+ k% R6 v6 K9 `+ a8 R! s6 |
    60 wire        SRAM_OE_N_w;    // SRAM Output chipselect- u) M: f! z0 J) p; s) f# N# K
    61 wire        SRAM_WE_N_w;    // SRAM Write chipselect) E0 {; t* k3 n( m
    62 3 w' S, r5 ^9 e
    63  sram_wrapper DUT_sram_wrapper(2 p" |1 S$ X$ C
    64     .wb_clk_i  ( wb_clk_i ),3 j6 q- t# h" @6 {: h$ b
    65     .wb_rst_i  ( wb_rst_i ),! x# J# m* {. l' T% i) P$ `
    66      H* M% V& ?5 p, P% _  W
    67     .wb_dat_i  ( wb_dout_w ),0 j7 \+ `/ w2 e! z% B
    68     .wb_dat_o  ( wb_din_w ),; Q) G) E( r- Y% ?' C; p4 Y
    69     .wb_adr_i  ( wb_adr_w ),
    ( S9 Y) k( w- o% }3 d2 C 70     .wb_sel_i  ( wb_sel_w ),
    / v+ z+ D) j' K6 o) ?5 S* ^ 71     .wb_we_i   ( wb_we_w ),) A; E+ n4 D0 H; K0 {& [
    72     .wb_cyc_i  ( wb_cyc_w ),
    9 H# R/ h, v" [+ V 73     .wb_stb_i  ( wb_stb_w ),
    " B8 `: F% d1 e+ D- g! ? 74     .wb_ack_o  ( wb_ack_w ),
    1 ]  @3 G- V: { 75     .wb_err_o  ( wb_err_w ),
    8 n% {; i3 P# k% E2 H 76
      c! a1 P* @; u& T& r+ R 77 // SRAM" M  H- F3 D, m& b! S
    78     .SRAM_DQ   ( SRAM_DQ_w ),
    5 F, b4 b" N1 o 79     .SRAM_ADDR ( SRAM_ADDR_w ),
      X0 V# T9 ^- C" y9 _ 80     .SRAM_LB_N ( SRAM_LB_N_w ),2 R' X( W6 |) t# [: ~1 O
    81     .SRAM_UB_N ( SRAM_UB_N_w ),7 e: H6 i0 K; o! ~: U
    82     .SRAM_CE_N ( SRAM_CE_N_w ),1 t  `9 H6 ]' u2 ~. `& b
    83     .SRAM_OE_N ( SRAM_OE_N_w ),. u  P  \+ q5 ]7 a1 q9 b# ?% Z7 B
    84     .SRAM_WE_N ( SRAM_WE_N_w )5 {* u4 }( U6 T0 e5 K) g. v
    85 );' V) x( B, Q' q# p' q
    86
    + S2 g5 v# U/ u4 l0 U1 S' ^ 87 // ****************************************************************************** }* k: o) D1 F; s
    88 //  sram model+ H7 R, u& F1 Y/ x
    89 // *****************************************************************************
    0 N  \) x+ Z; d4 @) n6 M6 X; B; \ 90 0 g' h6 D2 T2 x0 ]9 M
    91   IS61LV25616 u_sram_model(3 l4 L$ u. T  |. ^3 i6 ?3 r# ^
    92     .A   ( {1'b0,SRAM_ADDR_w[17:0]} ),/ g1 j  s; m. c. f5 E
    93     .IO  ( SRAM_DQ_w ),
    3 a7 P1 Z- \7 k$ M! k+ M( ^ 94     .CE_ ( SRAM_CE_N_w ),; {* Q' C7 L) p
    95     .OE_ ( SRAM_OE_N_w ),
    " G# \1 t3 y2 e& `6 o& U8 O 96     .WE_ ( SRAM_WE_N_w ),0 y* Y0 z  i0 b; y& f
    97     .LB_ ( SRAM_LB_N_w ),: ?9 l* l0 L$ C
    98     .UB_ ( SRAM_UB_N_w )) D- ?* o- L4 \! k6 V
    99   );
    , Q, W. o$ K. Q; j2 g100 . Z. B9 j" g2 q4 |9 r6 ]2 Y
    101  6 v  a5 J7 o$ I* H
    102 initialbegin$ V1 a5 e. S+ ^" K
    103     wb_clk_i <=0;1 f! A% p* x( I0 z( C+ m) h
    104     wb_rst_i <=0;: ~) t2 u% g4 S1 {% u$ L' f* P
    105 end
    9 X* V7 s) i8 @106  
    4 J- `1 Q+ X2 e* P5 f107 always@(wb_clk_i)  begin7 X9 h6 Y5 |/ Z* X: W# k; g
    108          #10 wb_clk_i <=~wb_clk_i;
    ; q9 [1 Z' h) a1 j; R: C# K  Y109 end
    + `8 }- u- ^/ z4 e. M110 ! g# B- e% |7 K6 x/ m
    111 reg [31:0] tmp_dat;% W0 {7 I+ Y- J% L3 F5 U
    112
    4 k9 r4 ~& q$ O$ [( V+ Z113 reg [31:0] d0,d1,d2,d3;
    4 F. V$ t% d* R# j3 l6 v; j! }* x114   t) h9 Y6 X$ _" W
    115 initialbegin
    2 e( z) L. F# a116 repeat (1) @ (posedge wb_clk_i);
    ) Y+ Q: g( k4 Z# u' E117       wb_rst_i <=1;; ?  H$ s/ f- w& d
    118 repeat (3) @ (posedge wb_clk_i);
    4 X' F( _' S# g119       wb_rst_i <=0;
    * ?, b. T! ^" ?( u120 //write your test here!/ G, [( T1 x- l# Y0 M0 N
    121 repeat (1) @ (posedge wb_clk_i);
    ; r2 y: l+ f" w9 R122       u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);
    7 E5 w; |* J/ J* D- ~8 D% l123       u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);% p0 Y- M/ s. d5 }/ c, i) t0 N% q
    124       u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);
    7 d7 U# C" c( T# L125       u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);/ C( [. r: H' \2 u5 k% V
    126       $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);7 F5 T. o8 D- W5 w# d2 a# \
    127 //adr,adr+4,adr+8,adr+12; N0 M2 _( i% ^* w$ ?
    128       u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);  d1 W; e+ b0 Q1 y6 C
    129       u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);
    * K" Y/ a+ d: ]2 Y130       $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);
    * x" U6 d4 a: W9 ~131     #100
    1 z+ A+ t# O4 i9 U) Q132       $finish;
    8 @' |) x' F8 n# O1 W5 d133    : a; G, V3 I3 R
    134 end8 T! e) G% n, ^/ Y* V1 P3 ]% t: l
    135  
    ( l9 e+ A% ^/ l) L# H% z136 initial
    & d( \  ]" m. p* ^3 E# Y+ G137 begin
    / S5 p' q+ O0 ~  ^3 o# G$ Q138       $fsdbDumpfile("sram_wrapper.fsdb");
    ; J! g3 A9 P6 `1 X139       $fsdbDumpvars;
    ' d# }4 u8 {7 ?+ M  s& o140 end
    " U$ O. y' |  _; H141 endmodule2 V2 ~) ]$ S5 m% a6 A6 t2 \
    & V5 ]4 ]3 W  B8 f* t
    8 J5 {' Q; Y8 M! M- c
    仿真结果3 D# |0 @1 j$ K! A$ S5 v

    ( E4 ^' r. x) |+ ~# INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)
    # _: a6 `8 b8 F5 n# 6 ]  t5 h, P3 t, m2 Q6 n& D
    #                  571 readfrom 00000000, value = ddccbbaa
    ' J; e/ i4 F+ v1 r) ^. O#
      I  ^& c* Z! R8 a( ~+ H/ E#                 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 00000004
    / k; E) u$ C" w1 T  U#
    0 O0 d2 O2 w/ w5 e0 M, n7 M& H0 D& V2 `5 s, V6 V4 Y2 ^
    没有错误  S2 z" F# I( e

    9 H; v8 L: ~9 }8 q5 a* JØ  Sram_wrapper的soc系统仿真验证
    3 h) @4 q5 F; g# p% ?( t
    * L: X5 Z6 h. W5 s( c加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示7 C9 P/ t+ t3 S: h! T8 ~

    ( ~8 _. U. z" @' c 1 #include "orsocdef.h"- B( ?# b' ~, C1 z2 C
    2 #include "board.h"- d0 n& e2 c0 [& ^
    3 #include "uart.h") c2 i# W/ x5 H# o
    4
    - D6 d" v( q4 u& v7 m' j6 D 5 int
    $ h, T8 U0 _5 y3 K) p 6 main (void)3 Q; q9 ?4 A" L; r$ ~4 V2 P
    7 {
    5 h8 Y% F' }$ N4 ^" D( n0 A 8 long gpio_in;
    . T% Z2 X# |; z, X. {+ n 9   REG32 (RGPIO_OE) =0xffffffff;, k* W5 p9 E+ c; B) [" r5 U/ L
    10
    , Z8 U9 S' A+ ]' n' Y11   uart_init();
    5 h" {$ N* z4 R$ K! M12   9 h) B1 u0 A9 `- V0 y; ]& g5 m
    13   uart_print_str("2Hello World!\n");5 }9 q) m* v3 ?* w
    14   " |7 b; F: }( E6 ~/ \
    15 int i;5 d/ D  y' U% L
    16 int t0, t1;1 k2 S! M9 L' O+ i  x7 F* O3 g/ z
    17   t0 =0xaabbccdd;
    0 O: ~# R- w: x3 n( m, X1 d4 i- k6 g18 for(i=0;i<10;i++){. {7 }! B) @9 c' c/ |
    19 //REG32 (RGPIO_OUT) = t0;) A1 L2 A* n) T1 x  @' j
    20     REG32 (SRAM_BASE + i*4) = t0;
    - `2 ^. s5 E6 m$ {21     t1 = REG32 (SRAM_BASE + i*4);* Z9 w& F' D  N7 V2 O  ?
    22 //REG32 (RGPIO_OUT) = t1;
    . i* ^* f  U) e1 V+ n2 M23 if(t0 == t1)
    2 c: }5 L% C* a# N24       uart_print_str("correct!\n");
    9 K: W3 G9 \% D2 I9 C& v" X" D; K25 else
    $ O3 [3 F1 p# n+ ?6 I5 ^26       uart_print_str("error!\n");
    $ u9 T! w4 O2 A* B& K/ B( d! w9 S( F27     t0 = t0 -0x01010101;8 W0 e) q. r' y9 s- s; P' i
    28   }7 U/ d! U' c7 ?% K
    29   " d. W, I$ A% x' Q$ o
    30 while(1){
    , k# A! ^$ \9 D, z' p6 M31     gpio_in = REG32 (RGPIO_IN);
    " F* ], z1 s: M1 M- ^% P32     gpio_in = gpio_in &0x0000ffff;
    ( z/ d+ s: ~/ F2 @" G3 M33     REG32 (RGPIO_OUT) = gpio_in;9 B% ^8 x) m9 T$ m
    34   }2 n- j! q" m! N9 A6 C6 K
    35
    % ^* U5 ~. m( c- q36 return0;$ W1 @( o  m  I# r
    37 }
    7 s# U- t0 y  }1 u5 `1 h+ j
    $ D1 R6 e( y! L( z0 N0 _+ k3 K/ A( D! y1 |% Y! _% A! t
    仿真结果
    1 T5 j2 q" o+ e+ s4 |8 ?9 s
    ' B+ _8 |8 G. [5 Y3 }# [# 2
    - v! [8 K  ?% I# H4 \, H+ R* ]+ ?2 i. e
    # e) C$ W5 @; A: u# g. r; Z
    # l4 B8 u/ K& }( [- i% R3 c" W8 V0 }
    # l
    $ f& i, c, ~/ z7 u* c# o( z1 n& z) u* c9 @8 P% f/ [
    #  
    0 R# b3 N  d5 p# W% h  M$ {& Z2 E2 c' v
    # o
    . s# K. S1 U$ C6 W: A5 @3 A5 U# r
    * X8 `) @- u0 I, k: z2 ]% i# ?' \: B# l
    5 a- }( F$ k) ^0 K8 H( I9 }# d
    9 \7 u! \7 B+ K, Y/ a# !! t6 a1 N; h$ t; {; }
    # 4 G( P8 Y$ P+ x" k
    #
    3 w2 C7 C; Z2 P0 m# 0 C8 X  X9 d4 L
    #
    ! R- b! J1 T  o2 p+ V! N+ U# c2 L$ W2 Q' _& h
    # o
    ' d7 z3 N2 l, ]" ^# r/ x/ U+ s; P' k! a
    # r
    & D( c& m) K6 o; J& K5 ~# e
    ' Y3 h; h- e; V9 @; z; b( Y% Q9 G# c. v4 Z  y- K0 O, o! j2 C4 E- i/ }
    # t
    5 @3 A/ a3 W: e7 E0 k, D# !
    5 q+ O) \6 W# y7 h… …
    ) x/ N3 H9 X4 ]# G/ y
    " O3 I  p# }. y; R8 s( E- Z6 a' W在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。
    7 c# X& W6 h* k# H
    % O  H* I5 u  |0 n% cØ  Ssram控制器的设计与验证
    - y. T8 o# z9 j0 R- `0 i5 O8 `+ s! o  [4 X4 C$ L
    Ssram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。; R7 c3 i* J/ G

    5 r' W+ i; k% ~5 ~* S关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下! h7 S6 `0 H- \. r$ X
    * I9 Y2 R+ g% Q4 U0 @8 Z' e( ^

    . e" ~+ Y6 [% Y! F+ y9 m- h  1 //----------------------------------------------------------------------------//( z/ v/ q3 M& R) b8 ~; P' d* \
      2 // Filename       : ssram_wrapper.v                                        //2 ^! ^) f/ O. ?
      3 // Author         : Huailu Ren ...()                                       //
      A& u! e8 C  s/ p& b' T  4 // Email          : hlren.pub@gmail.com                                       //; `8 [( p1 s# n2 e) _3 N. F
      5 // Created        : 23:54 2011/5/17                                           //
    / A  o* @; V! @7 t  6 //----------------------------------------------------------------------------//4 S" H% ]$ }( _4 J) j6 q: A3 K9 b% o
      7 // Description    :                                                           //- |0 m. V: @- U7 z' @; T0 ~
      8 ////+ ~8 Y/ |" R! g: j& C5 K
      9 // $Id$                                                                       //
      K8 Z) F7 G" v1 M1 ^: e0 \! w. X 10 //----------------------------------------------------------------------------//
    " d4 h" R3 H7 G5 r: R3 Y 11
    + ~! M, B1 b: [# Z1 o1 X. C 12 module ssram_wrapper(  T9 P3 C0 j# x3 J' }) o
    13 input              clk_i,
    $ ~& G; v8 T1 P  Z 14 input              rst_i,
    $ q$ _* U! A( C1 b/ s! K) J 15    % U, c' C# v# R0 F. B
    16 input              wb_stb_i,7 ~5 \2 w! H6 P. a0 K5 {# Q
    17 input              wb_cyc_i,- S' W8 F4 R" d$ P. p
    18 outputreg         wb_ack_o,
    7 m: |0 h$ ~& s8 X) P2 B 19 input      [31: 0] wb_addr_i,) h/ Y# `& P# R  Q: G0 }$ b1 Q/ x( M
    20 input      [ 3: 0] wb_sel_i,
    1 I% m0 N! ?  T+ C! W 21 input              wb_we_i,
    4 z( d3 F5 d  A8 L  B1 s 22 input      [31: 0] wb_data_i,9 o$ z6 W0 _' _+ z% J! e( m
    23 output     [31: 0] wb_data_o,5 h. T' D& z0 D7 X( C
    24 // SSRAM side
    - X6 c( _% T0 E0 D 25 inout      [31: 0] SRAM_DQ,     //  SRAM Data Bus 32 Bits
    * I( F# H5 V/ [) Q4 ^( `, [ 26 inout      [ 3: 0] SRAM_DPA,    //  SRAM Parity Data Bus
    5 K4 I# ^' j6 l5 H2 j 27 // Outputs                       ~4 t" l( _6 C' ]% M5 P
    28 output             SRAM_CLK,    //  SRAM Clock
    9 z$ ?( Q! K* t5 a 29 output     [18: 0] SRAM_A,      //  SRAM Address bus 21 Bits2 m+ W& ?4 f6 o2 K
    30 output             SRAM_ADSC_N, //  SRAM Controller Address Status  
    ; H, X% j. n- c) G4 n- a 31 output             SRAM_ADSP_N, //  SRAM Processor Address Status
    , ?3 J' K3 c& b4 j# r 32 output             SRAM_ADV_N,  //  SRAM Burst Address Advance2 s- L* _2 s- t  A5 c1 h! m& k
    33 output     [ 3: 0] SRAM_BE_N,   //  SRAM Byte Write Enable2 E5 k2 X! K# ?
    34 output             SRAM_CE1_N,  //  SRAM Chip Enable" U" M" l7 O6 W4 F
    35 output             SRAM_CE2,    //  SRAM Chip Enable4 A% ^8 s( I/ T: S4 i# R
    36 output             SRAM_CE3_N,  //  SRAM Chip Enable& `0 x4 V( R& T) E2 t
    37 output             SRAM_GW_N,   //  SRAM Global Write Enable8 y) S1 m) R# b; n# U
    38 output             SRAM_OE_N,   //  SRAM Output Enable# a( t6 j6 n9 N: k
    39 output             SRAM_WE_N    //  SRAM Write Enable. g; w5 ]% e! M
    40   );/ b7 k% y% `0 A7 F% {$ x
    41 . I% L* h9 @2 P9 w  I8 ?5 ~
    42 // request signal
    & B+ x  v/ K: } 43 wire request;
    + G7 M! r$ m) x* r- Y' T  D 44  
    ; @" A0 @/ B- G) w& U7 f 45 // request signal's rising edge
    4 g7 ]. ]: D& ?. h3 M 46 reg  request_delay;
    - h+ l6 }: L2 c+ T4 c  S( | 47 wire request_rising_edge;/ N1 z  _5 z. K  i+ [
    48 wire is_read, is_write;" S( r! N; U( o
    49
    # R3 B* o1 P9 G/ K$ H6 p* S% F$ R 50 // ack signal4 G6 b; x3 e; ^: T# ]4 X2 y4 I
    51 reg  ram_ack;. z& N6 ^9 z/ g8 r$ `3 j5 V! }
    52  / {/ w- B, g' ~5 E+ I. o
    53 // get request signal/ K' x4 j' t, a
    54 assign request = wb_stb_i & wb_cyc_i;
    ; y+ y& a" u7 ~ 55  % g. m; C; E+ e
    56 // Internal Assignments0 @: B+ d7 i( s# `( L. U
    57 assign is_read  = wb_stb_i & wb_cyc_i &~wb_we_i;6 H$ R7 A2 x0 G  y" @" G; r8 X  [# O
    58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;
    4 V3 }0 o0 K+ D9 S! ]1 u3 Q3 k) d 59  
    ! F6 _# }8 H4 y  |% M, m 60 // Output Assignments& K5 g' M) `3 H4 W; N2 C; ~
    61 assign wb_data_o      = SRAM_DQ;
    * P: Z3 z! C) F5 U( V9 v% u 62
      W7 W- s# p6 o 63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;7 k! h2 `6 Z) D  o, t6 P
    64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz;% W; |* [3 z+ q. h8 v$ c
    65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;8 \- ?" \+ {5 ]4 @' `
    66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;1 R+ }0 ^' i9 |, ]. w* ?" b7 @5 Y: |1 x
    67 # ]9 z+ j! f+ L! H3 K' u9 S
    68 assign SRAM_DPA     =4'hz;
    5 q8 f6 k7 ]/ ^/ I5 g) @+ d) c$ F 69
    - N! |  o* l: x0 C7 d# M# n6 [ 70 assign SRAM_CLK     = clk_i;
    * u. L5 H/ H5 y$ \( [: J% P+ s! J6 A 71 assign SRAM_A       = wb_addr_i[20:2];
    8 m5 Y9 z% j" i$ @- m- S2 j 72 assign SRAM_ADSC_N  =~(is_write);# ^4 @, i+ u! L4 M
    73 assign SRAM_ADSP_N  =~(is_read);
    8 u, Z) z7 v# R, {# n2 T+ f 74 assign SRAM_ADV_N   =1'b1;
    8 M( a& T, Y2 B; D8 R) f; R 75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);* q4 M, y2 n( D& w; t; W2 {+ ?
    76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);
    " B! X5 Q/ Q% l/ S 77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);
      D$ S0 l) F% V9 h: k# U 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);
    / l* I* C  N2 q$ ?( m. b1 I) w 79 assign SRAM_CE1_N   =~request;
    - r) t! w( V  s9 g4 l& L 80 assign SRAM_CE2     =1'b1;
    : X3 D8 u# y9 }3 d9 D9 n 81 assign SRAM_CE3_N   =1'b0;# L, N/ s- {. [0 d$ p
    82 assign SRAM_GW_N    =1'b1;
    2 ^+ `4 }$ J9 ?/ A; m9 m 83 assign SRAM_OE_N    =~is_read;+ D6 v/ |. g) r# `7 c
    84 assign SRAM_WE_N    =~is_write;
    - [8 r6 n0 ^; }7 h 85  
    ' n& q2 s9 K# o& p; P( E 86 // get the rising edge of request signal$ D' w9 j7 a0 U' M4 g
    87 always @ (posedge clk_i)% z: P$ Z, p7 a3 t7 ?/ \4 I
    88 begin. W/ k- \% A# @! d* N# ?- q  L
    89 if(rst_i ==1)
    , B+ r  c5 r# \3 n; q 90       request_delay <=0;, \/ e4 h. N5 w; K6 `* H
    91 else
    . \  ]) F+ N6 z+ O 92       request_delay <= request;
    ; f' L+ I4 [* ^8 P% N 93 end
    ' M; B9 R" z1 p& {4 k9 W 94  
    0 [% k* ]5 s5 q) @+ D* ^0 j7 c! i 95 assign request_rising_edge = (request_delay ^ request) & request;
    4 F" }( r5 o& ]( T. Y1 n. V$ e 96 , P1 Y) v' i& D9 H: K) u* [: Z! ^
    97 // generate a 1 cycle acknowledgement for each request rising edge
    6 {8 Q+ w/ L" b5 @4 a0 ~ 98 always @ (posedge clk_i)
    ; {, P% T9 B# r4 g6 N$ i 99 begin" d, h( d' c9 \' c/ J! T
    100 if (rst_i ==1)
    " S" E  Q/ @8 W3 c101       ram_ack <=0;1 _! u4 _0 Y" |2 F5 l5 T
    102 elseif (request_rising_edge ==1)8 _/ d- g) q- D3 ?
    103       ram_ack <=1;
    + g% _2 j9 g: U) o( A6 ]104 else
    5 d9 o2 Z# A6 s8 F! i$ Q. s' c105       ram_ack <=0;
    4 N6 G: ~6 s, P  M9 V( E& |106 end! h$ Y9 Z4 I5 i$ M6 w! s
    107
    ( O" }! M" Y( d) ~4 d$ e. v108 // register wb_ack output, because onchip ram0 uses registered output
    ( f$ B6 [% l7 v! h: B4 M109 always @ (posedge clk_i)% @6 k& Y% r& P7 r
    110 begin
    ; i8 x. ?' p2 p$ x/ C# P) Z111 if (rst_i ==1)1 s- k! v3 G6 N* q& u, _. {
    112       wb_ack_o <=0;
    , z7 }4 y" `4 {. |/ k! t113 else$ l# C2 V# ]  Z, L! l
    114       wb_ack_o <= ram_ack;
    " a" Z. o0 Y: {115 end6 v  _1 @& T% ^3 g
    116 3 b% X3 X  D' d6 n0 h
    117 endmodule, E- K9 T% |! `& y. n
    ! l, P0 v, X' R4 V# y: K

    % k  S4 m$ e1 k8 S  o6 I) C并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
    2 |9 {( S: D! N* O% V  t8 a8 _4 L3 [# ~( W; Q8 G1 b/ w. j
    源码可以在这里下载
    6 X0 L2 U* \) I6 E0 C, _" u% h& u( c7 m) W3 t& N% p
    稍后。。。
    # h5 v/ O: R. u' u4 [To Do
    - o. K- W% t6 _+ k6 G
    2 O0 ]& a3 f* _5 c% h用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
    8 r4 P9 u3 @6 J9 a' Z2 `修改以下用所写的sram_wrapper移植到DE2-115平台上
    # Y/ v3 \9 Q9 q& E/ S: ?& rTo Do--关于opencore,or1200的soc平台
    8 ^+ Q, z* y4 W1 U# l& x3 d# g' u
    ) q4 Q# A8 }2 i5 Y6 I9 y5 wOR1200的引导方案设计(基于硬件或者软件uart控制)0 O! |: U+ q( h0 ?( w
    移植uc/os II操作系统) E5 R9 i6 h9 t: U5 R0 T: F
    驱动起来DE2-70上的网卡  v: E+ l$ d3 q8 r" t# m8 K5 l' K
    加入jtag模块
    " P" S8 [, c7 O" H+ i移植u-boot
    ' m0 M1 R5 ]  q移植ucLinux! S) A. u: k3 F5 r+ V/ P3 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 21:44 , Processed in 0.203125 second(s), 23 queries , Gzip On.

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

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

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