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

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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    2 z7 l4 X! M7 e4 F; A6 O- O  J
    Ø  DE2-115和DE2-70的存储器配置
    2 P/ W( k  j; s& `
    ' P( i8 |, X& p) d4 BDE2-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之间反复转换。: E2 l4 i  g* I/ l/ N6 A. y5 q6 O' J

    . B6 S) R. ^  B2 R  k# ^1 [- JØ  Sram控制器的3中验证方案. R( {  T: B$ \5 |( ^' f: l
    $ d0 C9 u5 P* h+ f
    本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。' r2 I4 B7 r9 {9 }$ b
    % U3 u7 r. Y+ O3 p0 H5 k
    + k4 ]& k9 K, a) {) W

      g' Q, k9 q) W5 g+ t" T& G以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。
    2 c6 }/ _, A4 U) n$ J% Z7 i# f9 u" L3 j+ X
    我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?' q7 n# |. K) o  I  v

    6 x/ P4 w( ]8 F* X" h" GØ  DE2中sram控制器的时序要求
    7 g) H2 c3 [: }: G: |9 K0 \
    : \: H- B5 m* E6 XIS61LV25616的一些常用引脚的功能
    ! c' d' |+ r  L5 y5 Z
    5 V  P/ T/ l8 f# \; ]# m9 t/ d: v2 y: i! O4 L$ e/ I
    8 w; W4 F" h3 a& C5 T! F) L
    读和写时序按照参照datasheet中所介绍的这两种方式2 N' E- [+ n( Y, B
    1 K" E/ p% w$ |: |( H0 M% |
    " B5 w3 v4 M) t# T
    7 x# J1 g' l6 }& J) S

    ; R& B( u, W  n# W
    / A1 `0 c% b, }在wishbone接口中需满足途中的基本时序要求。* _( W0 R9 ^$ i- b

    # G, _( v. Y7 |5 ?9 Q& AIS61LV25616的verilog model在网络上很容易可以找到
    8 h/ J! m9 E' C7 @, p0 N
    7 ^5 }3 E9 N  N+ G7 _( ^) M! k# x$ g* @( e3 u
      1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.
    " j$ N. s6 u7 {9 W2 |% W  2 // Note; 1) Please include "+define+ OEb" in running script if you want to check
    ; R0 [9 `( F% W$ E: x% t% u  3 //          timing in the case of OE_ being set./ f8 {+ A' t) W: e, g: V/ u
      4 //       2) Please specify access time by defining tAC_10 or tAC_12.. ^8 V' F+ h) e+ T
      5 ' i7 E# ^1 ?3 w- S+ Z1 l
      6 `define OEb
    % F1 B2 s: j# o9 J( W: q  7 `define tAC_10     //tAC_10 or tAC_12 defines different parameters; d8 E/ x0 u' \* i  j$ C
      8 `timescale 1ns/1ns
    8 j- Q% S+ g9 O/ A- F3 b# K  9
    * b/ o2 @! U. d5 W2 u3 D5 {4 l 10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);+ F! C$ K* U! u
    11
    ! O! ]0 a! p# m* U5 K+ C( V" \ 12 parameter dqbits =16;7 @! o9 v6 b8 i7 E' ~& P
    13 parameter memdepth =262143;
    : ~) e, D( @2 g 14 parameter addbits =19;
    3 l. g$ M$ N5 P 15 parameter Toha  =2;, B4 _4 S5 L+ C" B" P' e
    16
    . R4 W9 t- s2 I$ R: L; W 17 parameter Tsa   =2;, B6 f+ |. B0 z! l! \6 ]+ V
    18
    6 q9 t0 Y3 q7 ~1 g 19 `ifdef tAC_10         //if "`define tAC_10 " at beginning,sentences below are compiled3 ]' n! K& U- Q4 @& |
    20 parameter Taa   =10,
    ! f7 l1 u' C: y! X 21             Thzce =3,2 e% D4 x; |0 Q- {! F' g
    22           Thzwe =5;
    , `. {. W5 C  y 23 `endif
    - ^& Q, u/ s( h" I, z8 s% K 24   T& _0 F$ u2 u& E
    25 `ifdef tAC_12        //if "`define tAC_12 " at beginning,sentences below are compiled
    # q) V4 d" w' ]( |2 h 26 parameter Taa   =12,
    , |5 F- H, N2 b1 e) U( n% j 27           Thzce =5,
    # A/ I# y, t# a% J: B; y: N0 I 28           Thzwe =6;- O% K) e  B' O$ o7 S: V
    29 `endif1 j4 {$ p# a! q( q0 P( v
    30 / Z9 t6 U% u8 O% l; ]5 {$ r9 y% \
    31 input CE_, OE_, WE_, LB_, UB_;- X* S1 m% [8 }6 `
    32 input [(addbits -1) : 0] A;( S9 [- z7 }8 @1 E# D
    33 inout [(dqbits -1) : 0] IO;6 h* H: X+ s! A6 U. E
    34  
    ' \- {  ]+ _% P: y 35 wire [(dqbits -1) : 0] dout;, ]0 P; h8 `: T, \5 \
    36 reg  [(dqbits/2-1) : 0] bank0 [0 : memdepth];
    % W3 Q1 [- v1 @* T. c, R+ u  m 37 reg  [(dqbits/2-1) : 0] bank1 [0 : memdepth];; |, z  v; X' q8 D- K, M7 j
    38 //array to simulate SRAM9 S6 ]/ [  q' b/ R1 r) v2 w+ K
    39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};+ r8 H8 k) _8 b0 l5 ?+ C0 I2 e
    40
    ! w( C9 U) {3 e0 D8 v5 Y 41 wire r_en = WE_ & (~CE_) & (~OE_);   //WE=1,CE=OE=0 Read. W9 M- m  I2 w( L; v5 x
    42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write2 `6 h1 I: ]7 p- }
    43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; 2 l: D. F" e% ~) z: u$ W
    44 5 s$ e, l4 i$ ]% D: a; s
    45 initial
    " Z; w6 D+ P; b2 M/ Q( e8 G- P 46   $timeformat (-9, 0.1, " ns", 10); //show current simulation time* E. y8 M" `/ e/ K# z% g
    47
      w0 j4 i$ h, g0 _' y3 X! s& y 48 assign dout [(dqbits/2-1) : 0]        = LB_ ?8'bz : bank0[A];
    7 k* i  T! q+ m/ s4 K0 K& t 49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];& Z' j4 W9 t$ O
    50
    4 l9 @& a; d: @ 51 always @(A or w_en)# \' `4 V4 S8 _$ I
    52 begin9 c* U( W! @, s
    53     #Tsa    //address setup time; [+ |5 I! q; q
    54 if (w_en)
    ' D& S9 ]6 }4 h8 Y- {0 K9 J! z: V 55       #Thzwe
    8 S6 ^2 d, Z4 S0 }7 i/ ` 56 begin+ Y0 b5 e7 _0 j( u$ J
    57  bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];' x* q5 @: _1 G4 n! b/ ?
    58  bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1)   : (dqbits/2)];/ r2 ]; ~, ^7 J- E' @
    59 end) h  O2 l( E, e1 ]. k
    60 end! D6 j0 G% w2 C) T
    61  
    & M1 [6 ^* N9 [* i 62 // Timing Check. A. u9 d) o, Y5 J3 ^8 H
    63 `ifdef tAC_10/ L. g/ b6 [+ R7 ~6 D2 f! A# _! ^& I# n
    64 specify//sepcify delay9 \& C7 a0 R3 h$ }4 T4 E1 V1 B
    65 specparam
    ! o; z4 t/ B4 k: l7 ~ 66       tSA   =0,2 h) x) U$ g7 H
    67       tAW   =8,: o8 M+ @' J9 D+ u7 `
    68       tSCE  =8,: W8 K1 K/ B1 p9 W* P
    69       tSD   =6,) }+ B% q0 r- d$ \! \$ ]
    70       tPWE2 =10,
    1 U! K% X3 g. s4 \6 Y 71       tPWE1 =8,
    . D) a' }4 d% m6 F( V 72       tPBW  =8;
    - N1 G: U+ v: o+ D: f4 i 73 `else
    6 H9 Z9 I1 c7 [$ a' b$ @5 g  L8 C 74
    " n) g5 r& Z1 G 75 `ifdef tAC_12
    " U! g) G' y  u, J, p3 S 76 specify
    ) q: ~; s3 b: N; c" C% L2 |  s) x 77 specparam6 q/ Z+ Z; r4 @0 g& ~% Z6 Q3 V# D6 m
    78       tSA   =0,
    ) I, P* t5 }& w 79       tAW   =8,% n0 p7 a7 i+ H
    80       tSCE  =8,2 ]( O3 w# N# |/ I0 }9 \  ]0 y6 V% P
    81       tSD   =6," \2 N0 j1 \0 c  Q: i0 Q9 @
    82       tPWE2 =12,# K4 _2 r. P8 G6 h7 E* g" q; \8 f
    83       tPWE1 =8,
    7 _' f/ E8 ^- \- y 84       tPBW  =8;
    " u+ Y: \/ a/ [9 Z! u' B4 ^! M4 G2 ~3 z9 H 85 `endif) T: V5 G5 B2 [7 s
    86 `endif
    & P& s" A. ~2 h% @ 87
      |$ ?6 ~6 z) O9 V/ Z6 W) x: U3 B 88     $setup (A, negedge CE_, tSA);
    # a( L3 ^" V( ^9 O 89     $setup (A, posedge CE_, tAW);
    * S/ {0 R, F- o  s" T 90     $setup (IO, posedge CE_, tSD);& r$ j  o4 W8 @3 O/ ?
    91     $setup (A, negedge WE_, tSA);
    & Z* |" n; Q0 A3 \ 92     $setup (IO, posedge WE_, tSD);; L9 q+ ]) z" ~- X) `2 o% g
    93     $setup (A, negedge LB_, tSA);! I& g$ x& x: ]5 X
    94     $setup (A, negedge UB_, tSA);
    # O6 h2 `& u% { 95 / a) e4 l) q5 o& S) P
    96     $width (negedge CE_, tSCE);4 u- u* T2 D! K* D
    97     $width (negedge LB_, tPBW);) F6 z5 A4 B! E% B9 n4 s  S
    98     $width (negedge UB_, tPBW);6 g  ^( ?; `) V4 G+ G
    99     `ifdef OEb+ X- G  {8 B8 E- {+ O
    100     $width (negedge WE_, tPWE1);2 R6 v' Y  D7 M
    101     `else
    ' g. K) o" t, U5 B102     $width (negedge WE_, tPWE2);4 Q+ n9 e4 A. z) m5 \" H1 x, W
    103     `endif
    % Y- ^/ H# P+ m! t$ y: ]104
    5 F; c' W& ?- V" d4 e0 Y105 enDSPecify
    % b* ^4 i2 w/ [7 A% S; W106
    + [' y2 L0 }' ]5 K107 endmodule
    6 d( x1 \  x7 c! l  G. o* Q% V, q2 u' r* X2 M' S6 C
    ; ^9 {, K  @: R7 e, j* p; g+ }

    " s* r! Y" x6 {0 d+ f- N" ~+ {
    Ø  Sram控制器的设计* w6 V8 F: v5 d' X7 @
    ) B% A7 S& l3 t' _4 m# n
    Sram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。
    6 [1 A8 \5 G) @) D! W2 o+ L  a8 G( n8 C. y3 t4 E, Y6 v( J( y
    Sram_wrapper的源码
    / Y1 j6 k0 c' |8 h# ]" Q. T2 M  t: i* v& F* {; V# Q2 G, h( M3 ~
    // Author(s):, d& ?9 n7 y& d  q' ?
    // - Huailu Ren, hlren.pub@gmail.com. g6 t5 x+ \( x' U7 J! `8 h: x
    //
    * b% t$ }; p1 `+ r( }6 h9 r
    . ~- F/ i' g+ y% e3 D// Revision 1.1  16:56 2011-4-28  hlren
    , }2 Z& U; z& H6 ~# s2 ?// created
    0 j4 m7 y) C* q6 U' D  k& I! M//4 ]: G) q" C8 D

    : }' b$ ~/ M8 G) E" w$ p// synopsys translate_off5 C2 R' w1 e0 N4 o4 j0 Y: v/ G$ b9 a
    `include"timescale.v"# \; Y3 Q% z+ ]# a2 s+ |! ]7 g
    // synopsys translate_on, `; u: a/ m0 {2 Z5 P( a. K! C# b$ m  B
    , Y4 M# ]0 J# W8 L" }2 Y+ [' U8 V
    module sram_wrapper (& |* O" _$ x5 h7 E' i. D
        wb_clk_i,# r! ^! ]- L) s! V2 N
        wb_rst_i,
    ! X8 j0 \2 l2 j9 F2 E* Z/ T% g$ Y3 p
        wb_dat_i,
    ; f8 j1 n% G7 @( K    //wb_dat_o,
    1 B1 @: y0 T2 n; F. F$ W, n    wb_adr_i,
    # g  B4 c: l7 ]7 f3 c4 |5 g    wb_sel_i,' T8 ~. {1 x5 r, ^+ _0 `$ O
        wb_we_i,
    5 _2 i, C$ D( N7 ^1 j4 \- W( p    wb_cyc_i,
      j5 f( t3 x9 G: S7 X    wb_stb_i,( O$ [  [: ?1 {0 a8 {; w

    , p5 c: g0 X* T$ `! g! i4 K$ z9 }4 Q! T  l. T# r& I$ M3 W$ D
        // Bi-Directional1 I; J. j3 ^" \8 A
        SRAM_DQ,
    # D/ j9 y  @9 n8 z, Q5 \% \
    , b, ^) Z" z$ p+ g0 a; x    // Outputs9 m8 w" C. x" p  M2 b3 j( t
        wb_dat_o,0 F: Y0 ]; @. R: ?% `/ J* j  g
        wb_ack_o,- c2 Y( {$ y! ~: {1 {4 ~5 c
        wb_err_o,
    7 l7 S  V5 t0 {7 l4 m  S   
    ) J; U0 J1 y8 \7 i    SRAM_ADDR,
    ! p0 @( K" @! g9 }+ ^    SRAM_LB_N,
    $ r% V* X3 |7 W/ r0 A    SRAM_UB_N,
    7 t! S$ X; g4 u' @7 J( C4 W4 W    SRAM_CE_N,
    / O: A$ C! ~) w" b! n/ E    SRAM_OE_N,
    2 U9 b; x! A7 m  Y1 V* `) F    SRAM_WE_N
    - l4 ^0 a1 J7 c# |);$ x  ~. S! a2 @& Y8 Q* @

    + J, z" n* R4 [8 W//
    , w, H4 l' I% a' i4 A// clock and reset signals8 @( x* x8 c2 \/ R. A1 F! N
    /// l5 c( `$ W9 `+ r: s1 v) {
    input         wb_clk_i;
    6 Z9 L' s! m" t% h1 M  |$ A& g% f  input         wb_rst_i;' F4 ~" u! H2 Q) o( z0 \0 ^* K
    //; ?  ~8 z$ X; c$ p; [/ {4 g. E
    // WB slave i/f5 }, }' U  p/ z' p; |. i5 [$ y) T3 D
    //
    / u# |8 v& E! |+ H) Rinput  [31:0] wb_dat_i;1 W+ J  n. ?% Q" d4 F4 B3 V
      output [31:0] wb_dat_o;. f( c7 s9 }/ H
      input  [31:0] wb_adr_i;
    " g( }# o5 \4 d$ x  input  [ 3:0] wb_sel_i;
    0 V& P! D* h# N' I  input         wb_we_i;' D  J0 e, {. t  S, ^, o+ Y6 j6 Y1 Y
      input         wb_cyc_i;
    / q+ P! w! k* P5 E$ A$ i- U  input         wb_stb_i;9 H5 H  _1 k& i, A# D  D( P) C
      output        wb_ack_o;
    2 p2 j1 Y* z. A" A5 M/ w  output        wb_err_o;! M+ a- Z5 y# S) }: Q
    //* d+ B, I+ \( x! Z, v
    // SRAM port5 c" A: Q+ ^* M$ Q
    //
    $ N( I+ }9 R, A2 R/ Linout  [15:0]   SRAM_DQ;    // SRAM Data bus 16 Bits8 M0 U, P" J" L$ T1 O# Q# P8 w/ k/ X
    output [17:0] SRAM_ADDR;    // SRAM Address bus 18 Bits
    4 I0 P, s% x7 n2 }output        SRAM_LB_N;    // SRAM Low-byte Data Mask
    ; v# n$ l# F- ~- I  O2 \4 V- ~1 }% Coutput        SRAM_UB_N;    // SRAM High-byte Data Mask
    6 ^4 Y) P. H8 U/ N( Qoutput        SRAM_CE_N;    // SRAM Chip chipselect
      j$ ~: k: G& Moutput        SRAM_OE_N;    // SRAM Output chipselect8 f$ Y. Q1 J$ t  D1 f. x
    output        SRAM_WE_N;    // SRAM Write chipselect. r( K2 q9 ]7 T& V9 k
    3 {# E2 i9 t9 c. F' s
      reg    [17:0] SRAM_ADDR;
    ! B+ Z2 d; o: l6 x! p3 C  reg           SRAM_LB_N;2 h1 B+ x7 B& Q# ]* O+ [& k! g- \
      reg           SRAM_UB_N;: @, j7 ]) e4 @- E* m' x4 Y
      reg           SRAM_CE_N;1 O5 i6 L* ]1 ~1 W3 f
      reg           SRAM_OE_N;
    & m% G/ b  E# P  j% _. k  reg           SRAM_WE_N;. B; x5 \/ Q3 u: p( E9 T' X
    # l6 _* \( p& B! l9 \
      reg [3:0] state, state_r;
    ! P! Q7 h2 B- N! W% @# |' x3 f  reg [15:0] wb_data_o_l, wb_data_o_u;
    6 @, }+ ?4 s" T8 S5 E0 { # G9 G+ f! m% O* G( M
      reg [16:0] wb_addr_i_reg;
    5 D: _; [2 |* |) r$ Y" i* u0 r9 v  reg [31:0] wb_data_i_reg;9 L, A4 ]9 H- j" Q. @6 Z& t8 F
      //reg [31:0] wb_data_o_reg;
    1 h* h* O; x1 V; greg [ 3:0] wb_sel_i_reg;
    6 \" r& T: {* |( i3 `
    8 R: R% S7 Z* ^; _  reg ack_we, ack_re;% q" x0 [) {& z  ^0 i, `
    // *****************************************************************************' B# E+ Q9 P8 I# G/ N  e
    //  FSM
    ( M) q! l6 Y6 s$ f// *****************************************************************************! }) f# K1 N* X$ n3 [2 f
    localparam IDLE =0;
    7 {8 S" s6 x, j  localparam WE0  =1;
    - Q7 f! O: [7 h2 w  localparam WE1  =2;2 }9 k, t# R' f- H* N1 d
      localparam WE2  =3;% W) ^" S4 _. J) q; ?
      localparam WE3  =4;
      e! i/ N  m- E% Q: I% P7 K3 D! u$ K  localparam RD0  =5;
    6 _$ M! w+ P# @% Z4 ~- @  N  localparam RD1  =6;0 ~8 c3 x7 G$ C$ Q4 W( k( ]
      localparam RD2  =7;
    2 u2 P# G; M. m# ^# i+ `" p; e/ P  localparam RD3  =8;# E, o  h- q: m- a$ a. t4 p3 r- N
      localparam ACK  =9;# D5 H6 t. @7 v! g0 R4 _/ N0 m8 e' \
    0 Z' |( {* X4 Z: N) K2 f
      assign SRAM_DQ =  ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0]
    2 `: p: J1 A' D6 d7 G9 ^                    : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]
    0 p+ d9 c  h7 b' J& }! y1 `  N6 x                    : 16'hzzzz);
    8 s  L1 j) ~* ~: I# `4 _: @+ kassign wb_dat_o = {wb_data_o_u,wb_data_o_l};# ~- d( g7 e" C

    4 n/ O0 U8 {" ~4 g  assign wb_ack_o = (state == ACK);4 m! I0 k! c# G- h, v0 M
      assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);
    5 z! a! H0 v2 } + K8 a: v$ s3 e" W9 ]# O
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin7 g4 Q3 y' c! T0 q& |0 z1 j% d: ~' p
        if(wb_rst_i)1 P* ~, Z: t5 j1 n/ L- j$ X
          state <= IDLE;
    3 o$ a# A1 |, j$ L/ i    elsebegin
    + w: `+ P! D8 `4 g  Z( X      case (state)
    & |4 z/ c8 A! T. K% g# p0 g  w9 |# z- z        IDLE : begin3 `7 @6 ^6 P, A' T+ Y( K' K6 M
              if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we), _1 |, C+ U2 J- n+ @
                state <= WE0;1 x% U0 _0 r! t+ P+ V, `( U+ s6 X
              elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re). \9 ~0 E+ b: c8 |* ?$ F- e
                state <= RD0;
    ) p8 x8 P7 ]7 d  e        end
    # f9 A1 R$ b, Q8 W) _6 ^/ `2 e. b; j+ N        WE0 : state <= WE1;
    , r# _# N8 s. F* S  q        WE1 : state <= WE2;
    $ |$ ~& l6 q. Q: h; y; ], n        WE2 : state <= WE3;
    $ w$ K& t' K# ~6 \! i7 C        WE3 : state <= ACK;' N& Z6 P* G, F2 W
            RD0 : state <= RD1;# s! ~1 x& X1 A- o4 P0 Z
            RD1 : state <= RD2;9 _" ?9 ^4 m7 L+ }" u, C/ q
            RD2 : state <= RD3;
    : S) w0 s% c  S1 \1 E/ a! m' Q! w        RD3 : state <= ACK;6 H- `' d: s  ?: z  H
            ACK : state <= IDLE;
    & A/ V( v8 V" t0 Y: h+ j1 f) O        default : state <= IDLE;
    / E' R8 @7 }, E0 ?( X2 p& ]      endcase# k7 g1 R6 ^7 j8 H/ E( f
        end
    1 N) ?3 o  I- G  end
    ( E$ }& D  M, Y/ v8 z
    9 X, g* c/ b; h2 W0 t+ R# d  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    7 |1 r, L1 v# o5 a. Y! \5 g& A3 S    if (wb_rst_i)
    2 v3 x1 R* Q4 i" ^' J      state_r <= IDLE;
    4 p7 a7 Q! W# Q8 l% r! C    else1 P* y9 ~& @/ i
          state_r <= state;
    0 K# a) g+ f1 M& N  end
    9 X) z7 Y* ]( s; O+ z% g- {//, }( \  {" h2 T' g9 C: {
    // Write acknowledge1 }7 Z7 B+ A% k5 ~* U9 f
    //$ D, C# y2 e. ]- K7 v7 M+ E
    always @ (posedge wb_clk_i orposedge wb_rst_i) begin1 Y- |$ d( a* ]: c8 Q- ~
        if (wb_rst_i)1 m; Q+ b# h/ L" r8 E
          ack_we <=1'b0;" [3 }: D2 t( p" m
    else
    ) g- J) @9 r# U: F. X, ]' p) g9 p    if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)
    + G" M) o6 k9 q% d: \  Q+ C      ack_we <= #11'b1;
    * v# s; W+ d' c  p- o3 Y3 X/ S- belse2 p) f7 A# y, v4 o9 Z0 Y) O, B
          ack_we <= #11'b0;% ~% Q  D, u0 `8 h# G) T3 E
    end) v3 w& L2 Q1 z$ p; D% z

    3 t$ U, m/ ?. H% w/ I% e//! U: O& k1 _+ j1 D/ h' j
    // Read acknowledge. p: ?2 j& j; k* O' H" r
    //
    5 L; i5 ~. R3 k% W7 malways @ (posedge wb_clk_i orposedge wb_rst_i) begin
    6 A! A. V3 A7 D3 Z3 ?' C    if (wb_rst_i): i9 X$ m( |; `& K8 i. u
          ack_re <=1'b0;
    ( P  F( K# l" ^, l1 Zelse( |7 l9 Q/ q5 C. a& e
        if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
    , \# y- y# H# Q- x      ack_re <= #11'b1;
    ! y4 Z% ^* n' B+ r9 F8 j8 ^9 V& m* yelse% H3 ]) A9 Z3 E, R% v# ?
          ack_re <= #11'b0;6 P! S4 N7 d4 {7 C- t
    end
    2 N1 I) k+ l( {# d" Y) a & u6 J, I- t7 A2 N5 R
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    9 z1 O4 v* t3 Q. K# F    if (wb_rst_i) begin
    3 f! Y, r5 U; j! u8 v" s5 }      wb_addr_i_reg <=32'b0;- u# n$ H+ ]3 O% z4 }0 h
          wb_data_i_reg <=32'b0;& f+ e' k  s5 Y5 D# i9 m
          wb_sel_i_reg  <=4'b0;
    ) A0 V3 i% ]$ T4 n4 vend
    ; W6 `* ~: ]( ?, r  h+ U7 p    else4 Z  ^! L2 f0 t6 X# ]
        if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)- Z- _) s& R/ u7 q4 v' e0 \" g3 q4 k6 y
        begin
    7 s5 M7 {6 D$ J4 P      wb_addr_i_reg <= wb_adr_i[18:2];1 W0 v4 J5 a) v7 Z. |1 C
          wb_data_i_reg <= wb_dat_i[31:0];
    % |9 c4 G2 w+ k# r      wb_sel_i_reg  <= wb_sel_i[3:0];( e+ f2 w) p! K5 n2 ], L
        end
    1 n" `5 o1 U* @% c  end, C& y% ^  V% V$ v6 Q) S) Y
    # |* s  b5 h2 [4 ^7 ^( m8 Q2 U
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin$ |1 ^8 N5 x& z: g2 J
        if (wb_rst_i) begin
    - H4 h3 L* f7 b( F) v      SRAM_ADDR <=18'b0;$ z! F- I  v5 r. c. z, w  l
    end
    9 w* A* ^4 m. m9 F6 b" p7 m    else
    3 b# O$ ~5 p% H8 i6 }      case (state)
    & G/ @0 M/ G- Q) C: n0 \        WE0, WE1, RD0, RD1 :
    & \1 |4 S2 B# R8 N4 t/ E; V2 @" T          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};8 G$ k, j0 |& Z* P! Z" o
            WE2, WE3, RD2, RD3 :
    # t1 [- O0 i4 i4 {( n2 R          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};
    * s) }; n, g  y- C: Q  V- U. v. ]! edefault : SRAM_ADDR <=18'hz;/ I1 d, F  U( s( [
    endcase5 D/ v7 A6 W2 W6 n& ~  t
      end
    7 X: {8 i  ^% _+ H0 w' Y- U " f' U9 I- M! U
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin) M9 o2 r- A/ G. w/ Q- I" J" Z- f
        if (wb_rst_i) begin
    8 \  X. l4 R2 ]  E. q; W0 J6 q9 n      SRAM_LB_N <=1'b1;* j5 z- r! ?& W. j7 ?
    end
    + {- `3 Y' T$ V+ S$ N" o! d+ T    else
    - ^  U) v4 G  N# g      case (state)
    4 j0 m5 w' K7 f7 n& k; E8 s4 `        WE0, WE1, RD0, RD1 :- K6 c2 m9 [6 d& t4 U) i
              SRAM_LB_N <=~wb_sel_i[0];
    ) R$ a* B" {$ [& Q, y! e/ T4 x8 x- {        WE2, WE3, RD2, RD3 :
    4 `  }. o2 N+ y# P: c5 ~4 H! l. c          SRAM_LB_N <=~wb_sel_i[2];
    6 I/ U! L5 P+ R7 Q$ [" g        default :; ^+ ?  t; }( u0 e
              SRAM_LB_N <=1'b1;! K$ E/ u" E1 T2 h+ K7 X
    endcase
    3 e! k% ]6 [6 Y% W7 I/ [; i7 }. l1 m  end; f. Q2 ]1 J" ?$ K* Y* Y

    " J4 X, ]# R3 G& Y1 r' l  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    / ]6 B( t4 u+ x; K) P# l' A" Q    if (wb_rst_i) begin' n) |& z; T$ u' O3 k
          SRAM_UB_N <=1'b1;8 A$ D" h* \% a* u7 `/ D* P1 o9 v4 T
    end* s. o5 p- Z* {/ N4 ]+ l
        else: |+ F  d. Y! \( \
          case (state)# ]: \! k" K) f/ @. |
            WE0, WE1, RD0, RD1 :
    $ k5 H# X" Q7 n( t9 ?9 G8 r6 H1 @          SRAM_UB_N <=~wb_sel_i[1];
    $ v, p; a7 X' P8 p/ }7 |        WE2, WE3, RD2, RD3 :: F, w3 m. ?0 Q5 Z
              SRAM_UB_N <=~wb_sel_i[3];
    9 T! I( q# q" c/ w- o! Q        default :. W5 d! @. a& C* J5 t" ^
              SRAM_UB_N <=1'b1;
    & i' b, ~' O* Bendcase
    - x2 C) U$ W/ F' K- `  end
      }6 n! n. T3 c" Q& Z5 n2 r
    5 ~& a# U* N0 z6 b7 Q  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    # Y  B2 d$ [% U' g( D    if (wb_rst_i) begin
    , X# K2 K6 [$ j      SRAM_CE_N <=1'b1;* `# l8 k. z. S" e
    end  |( Z3 C  C5 _$ s9 C# u, J
        else
    ( G7 [  B9 S/ D2 X      case (state); X+ ~% d3 @# @7 l. I, N3 ^" M
            WE0, WE1, RD0, RD1 :) |8 @. W; B+ k* j, v8 u
              SRAM_CE_N <=1'b0;
    + _# S, H$ U0 M: H        WE2, WE3, RD2, RD3 :
    8 W% H8 L/ [. b) G5 G2 G/ T          SRAM_CE_N <=1'b0;
    ! A/ t; B. L) ?$ D" d; ?1 e4 C, X! _default :
    ! v7 h7 a2 F  k4 x0 }. s' I, t          SRAM_CE_N <=1'b1;8 y% T: Z$ M5 R* d- d+ Y' i
    endcase
    0 I; e! G( d. p' D9 l  v8 Y) P  end- [5 X. @5 d0 d, _- [
    ) C/ r; k! H4 M& c
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    1 F# o; d6 ]$ |+ a    if (wb_rst_i) begin
    9 K$ E6 U! L0 N, H0 d      SRAM_OE_N <=1'b1;
    : J& |! d  f! B5 j0 M# cend4 G: `0 e7 w" r7 u; T5 s6 W5 i
        else
    7 H& g- Y- ^+ `      case (state)
    ' B+ C; T3 l- Q' k! V        RD0, RD1, RD2, RD3 :/ v0 `; P7 b" j7 M' _& B
              SRAM_OE_N <=1'b0;4 \7 O' v5 W3 w: r* l( }$ Z
    default :
    $ U$ G0 f+ d; V. u% c6 e. N          SRAM_OE_N <=1'b1;' ^6 F0 e# ^& w! e! a' t/ t2 w) d
    endcase
    ( H% q8 _  ~9 b0 [: N  end
    . u( p+ Q) ]1 E% S) a( p9 m ( y/ Y# v) q! s. C( H% [) |
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    / s* X- @+ ^) d4 H) j    if (wb_rst_i) begin
    8 y- a; T# B5 w" _8 p: R      SRAM_WE_N <=1'b1;$ o' m- _' l) [7 z/ b" @2 r
    end2 F5 M: n6 z# l2 ^8 J! G& u/ {) E
        else
    6 v) `4 I1 Y" q- B: s& G      case (state)
    ' s) c6 _5 g" }0 d4 z7 n        WE0, WE1, WE2, WE3 :8 W. E# A/ B( ]$ J2 T' K- B+ c
              SRAM_WE_N <=1'b0;
    : Y2 Q8 {7 N* t" {3 Ndefault :
    ! _2 `3 T$ h4 M3 w2 B. Q' Z. c          SRAM_WE_N <=1'b1;
    8 k# e4 I" r5 ]' A- U9 Kendcase1 {( z; C; F7 x
      end+ z# ^. ]: ?& Z5 H
      //
    % `3 i  V! a( E2 ]8 E6 b6 V; F  // assemble ouput data
    ) O, W' l) V- @0 \  //
    - u+ D/ Z/ |" Oalways @ (posedge wb_clk_i orposedge wb_rst_i) begin
    3 \4 i. S* q! i1 Z9 _( D6 v    if (wb_rst_i) begin
    / l' `  Q* I3 l1 Y      wb_data_o_l <=16'b0;* R9 ?: d* b% w2 B9 H5 M9 Q- h
          wb_data_o_u <=16'b0;
    ! s3 S3 {. a) }, h4 Nend
    6 E- y$ N( u2 O1 N8 W    else
    ; I/ e" [: r9 q3 J) u! X) ~      case (state_r)
    2 M8 P6 n$ l* |0 g        RD0, RD1 :
    . [# M; k; g, d2 m% K          wb_data_o_l <= SRAM_DQ;% C) O; R# k1 u4 y
            RD2, RD3 :
    + s! o  D" _2 z6 n- ?( B3 @. U6 t) Y          wb_data_o_u <= SRAM_DQ;/ A3 Y  Y3 |0 ^8 ]) K7 p' @
          endcase1 d0 Q/ ^" m# j, }, J: B
      end
    6 u7 K: |& i% Z8 q# o2 `endmodule
    2 ~/ \4 A8 d; B
    4 K; Q( `5 `$ ~$ k
    ! G- s* m6 P2 [Ø  Sram_wrapper的wishbone BFM验证3 T) ]; k( i4 v) G
    ( }0 `9 S" f9 ~' A' y6 C% N
    Sram_wrapper的BFM验证的testbench代码如下:
    1 D3 C% z; ?" m9 m8 ]2 {  A
    9 o' n1 A4 F# q+ A! D4 Y0 ^
    - z: {9 f) O1 H. E  1 // Author(s):! b3 H  g" f+ n( V
      2 // - Huailu Ren, hlren.pub@gmail.com
    7 }- t0 B0 k% u$ E( [, M8 ^$ |  3 //
    # _0 B. A; b/ Y  4 0 ^7 ]9 d, m+ O
      5 // Revision 1.1  17:45 2011-4-28  hlren6 g, h5 V: m' k! C3 x
      6 // created
    6 ~/ v# o! L( e2 f0 u/ t- d/ O/ [, t  7 //) F6 P, u7 X& ?: y3 S1 r) U2 q: P; o
      8
    $ t# P0 s9 P* q" y, A; x( {  9 // synopsys translate_off6 C: h# y2 d% b5 D; p% }
    10 `include"timescale.v"5 Q! u7 l) Y( G8 G4 [6 y
    11 // synopsys translate_on
    2 ^2 z# m, m* F) o. |4 D4 k3 h+ q 12
    4 |% C* A0 j1 z7 c  B% g, f 13 module tb_sram_wrapper ;
    # ~5 F( I2 i' o$ {, g7 C9 I/ u 14
    : A" w4 C- W% O& m! t& \: B 15 //
    ) C8 ^  \/ Z$ ]& ~! T  O 16 // clock and reset signals
    + F+ t/ \$ u: s1 n 17 //
    6 Y( {% k, s5 } 18 reg         wb_clk_i;
    % h. h$ g* _& }9 G- ^+ p, a% ? 19 reg         wb_rst_i;9 a7 E- u. f; f$ b" g. l
    20   ]0 O* k7 Q, Z0 s. [! C7 U
    21 // *****************************************************************************
    3 |  f" T# z# j 22 //  wishbone master bus functional model
    + ?# a  w  s2 v  Z 23 // *****************************************************************************
    * k: I9 Q5 N4 O0 r7 l* M9 d6 E% d 24
    / t' w$ Q  Q' f 25 wire [31:0] wb_din_w;
    ; ~* H) w6 z" F; m+ g# P( s 26 wire [31:0] wb_dout_w;. w& ?$ k/ h' o8 l+ S: a/ L; ]
    27 wire [31:0] wb_adr_w;. _8 |! I6 w- f) @& F
    28 wire [ 3:0] wb_sel_w;
    # v! T/ u9 x/ C 29 wire        wb_we_w;  q8 w% c2 g: g9 z( N
    30 wire        wb_cyc_w;  U. f/ G6 }6 o! g! O7 l7 h
    31 wire        wb_stb_w;
    & h3 V8 L% w7 N+ Q* q 32 wire        wb_ack_w;
    7 h1 ]: A9 R* X9 m5 i5 T0 L 33 wire        wb_err_w;
    ! L. `6 S$ l' r8 ]& \! v: J 34    , d. e3 Z& h! @- \# E7 b
    35   wb_mast u_wb_mast(; @$ J- `0 y* Z6 d% ^
    36     .clk  ( wb_clk_i ),: k. u& N$ {/ i" J
    37     .rst  ( wb_rst_i ),  Y, C4 }" A8 z
    38    ; ]$ I. r1 |4 m3 p# c" K$ _
    39     .adr  ( wb_adr_w ),
    # h* l, ~& T6 E 40     .din  ( wb_din_w ),0 o% x5 c: c; x' b$ P
    41     .dout ( wb_dout_w ),
    # [& w: R3 K5 @% E; R# N) r1 ?" o 42     .cyc  ( wb_cyc_w ),
    1 M+ H0 z7 l) Y, ~1 Z 43     .stb  ( wb_stb_w ),
    ) o* [! D# w# s8 \ 44     .sel  ( wb_sel_w ),
    9 A3 S4 C7 Q- A1 d1 Y! G4 w 45     .we   ( wb_we_w ),6 x+ ?4 F- `1 G. q/ [  ~( Q: s- V: y
    46     .ack  ( wb_ack_w ),8 T, W. N% |  B. u5 F+ y0 d1 v" |
    47     .err  ( wb_err_w ),
    + X. Y; t- b7 c1 }/ Y7 A 48     .rty  ( wb_rty_w ). ~$ c  o9 y5 m3 D  \: z+ v
    49   );% C2 v7 Z% ]$ L. ~, v
    50 7 Z! ~9 d4 ]1 z% `4 ]/ i
    51 // *****************************************************************************1 ~- b$ @. x* O! c1 L, }: s+ u; g
    52 //  sram controller9 L( P% ^3 m, g( E0 G' W
    53 // *****************************************************************************0 y$ O+ l2 R! C) x( S
    54
    7 B4 F8 p  }- T1 ?( o 55 wire [15:0]   SRAM_DQ_w;    // SRAM Data bus 16 Bits' S+ w& Z+ [+ k9 n/ z; L
    56 wire [17:0] SRAM_ADDR_w;    // SRAM Address bus 18 Bits* C  {. _; A" b1 }( H# f- w
    57 wire        SRAM_LB_N_w;    // SRAM Low-byte Data Mask# Z# m( `1 U" O5 R7 V" \- N% g6 \$ N
    58 wire        SRAM_UB_N_w;    // SRAM High-byte Data Mask1 x- s* p" a& B. p+ |
    59 wire        SRAM_CE_N_w;    // SRAM Chip chipselect5 K; B1 s% k/ u& E9 |- z& F
    60 wire        SRAM_OE_N_w;    // SRAM Output chipselect
    ; t4 I/ m2 n* W5 J# P& r4 } 61 wire        SRAM_WE_N_w;    // SRAM Write chipselect8 K0 M+ J3 o( G1 F' Q
    62
    * b) N4 K; W1 _5 m, ]( _! t4 U* Q 63  sram_wrapper DUT_sram_wrapper(
    + x3 ~4 S' t) w) r) K 64     .wb_clk_i  ( wb_clk_i ),
    : j) a, h/ H5 E2 E7 n" p' |2 k/ d 65     .wb_rst_i  ( wb_rst_i ),
    % `% J" {* \" M8 u9 }4 Q 66   
    ! W( c* `2 a8 e9 {: u4 Z 67     .wb_dat_i  ( wb_dout_w ),6 Q* Q4 L, x* ^' b8 t/ O1 x
    68     .wb_dat_o  ( wb_din_w ),7 _  @/ R1 m2 o# x) U" e
    69     .wb_adr_i  ( wb_adr_w ),  C4 J4 q. `5 ]: R
    70     .wb_sel_i  ( wb_sel_w ),+ @% o) ]3 Y2 T/ Q' G1 w8 r# k
    71     .wb_we_i   ( wb_we_w ),
    9 ?# O( W$ G/ t 72     .wb_cyc_i  ( wb_cyc_w ),8 _. e! B4 [. L) V# [2 G0 F1 c
    73     .wb_stb_i  ( wb_stb_w )," R. p1 I! X0 ^8 @- ?
    74     .wb_ack_o  ( wb_ack_w ),
    3 o3 d: ^# b9 @4 R 75     .wb_err_o  ( wb_err_w ),
    5 A% N4 }! Z. `2 Y 76
    5 Q; X( [: r# b* O- w+ d 77 // SRAM
    1 K, f' O2 C# _; F1 x 78     .SRAM_DQ   ( SRAM_DQ_w ),. r% B* Y' J, P, X7 a; p8 t
    79     .SRAM_ADDR ( SRAM_ADDR_w ),6 n( I$ _3 b8 E& r$ a
    80     .SRAM_LB_N ( SRAM_LB_N_w ),
    0 Y  ?! I$ B% n: N 81     .SRAM_UB_N ( SRAM_UB_N_w ),
    & k3 K  \8 P' w  I' x. d 82     .SRAM_CE_N ( SRAM_CE_N_w )," N5 c  h9 f8 H0 k
    83     .SRAM_OE_N ( SRAM_OE_N_w ),
    ' f/ M  ~4 D5 X" e8 P 84     .SRAM_WE_N ( SRAM_WE_N_w )
      H/ X0 ]3 O7 C- W4 Z# q 85 );
    3 E4 [) B. ^, S% d5 z1 A1 w 86
    % i% S4 M0 V' k  B7 j' r: Z 87 // *****************************************************************************
    1 U  a5 M3 |$ q1 Z 88 //  sram model9 s  v3 h# C% A9 x) p  O* W4 C
    89 // *****************************************************************************& i  o8 a8 j( \  h4 V8 T
    90
    . F  a1 I  s) r' y 91   IS61LV25616 u_sram_model(- i" ^. V* Y/ E  e6 h  p  K6 G
    92     .A   ( {1'b0,SRAM_ADDR_w[17:0]} ),& V% |. G9 o) K& N8 M. a
    93     .IO  ( SRAM_DQ_w ),
    + D/ b% B* c$ l$ o9 z9 w  r, ~! S 94     .CE_ ( SRAM_CE_N_w ),
    $ R# k; |6 K5 ?5 K 95     .OE_ ( SRAM_OE_N_w ),( A4 S3 s0 S$ _; \" W+ t/ x
    96     .WE_ ( SRAM_WE_N_w ),5 ~/ U1 `, ]# l5 X  O2 P# q% T
    97     .LB_ ( SRAM_LB_N_w ),
    . U- s7 S' ]/ i: H6 C5 W& j 98     .UB_ ( SRAM_UB_N_w )7 m& o8 p/ u3 q+ \
    99   );" b% Q+ J5 Q$ ^# p5 X
    100   }: j: a& r* B& G' p
    101  3 f. T9 Q: T4 L, v, P
    102 initialbegin* r; y/ w" T0 O6 D0 i3 ~6 }( i
    103     wb_clk_i <=0;* @+ K: W( l' P  b5 D
    104     wb_rst_i <=0;
    ; }6 E, R! {9 t# {+ N105 end8 ?, f) c& A+ `' ~0 _
    106  7 n: @: H+ ^9 j1 U) a! v0 f7 b* f
    107 always@(wb_clk_i)  begin; d8 r, i" a. y. }7 c3 u& Y; E
    108          #10 wb_clk_i <=~wb_clk_i;
    1 m1 W5 X0 e  ?109 end
    ; r( v, g  p6 d: H: {* H110
    - I- Q; A. W, k: m. V+ b7 p111 reg [31:0] tmp_dat;: o  k$ W1 G. l- _
    112 2 _8 e  ~, g3 \3 a0 Y" W4 U
    113 reg [31:0] d0,d1,d2,d3;
    : l8 _$ c/ X# U5 O114
    ! ]3 d: I0 }% P  q% P' y% s115 initialbegin6 R5 A* l( W2 `; R
    116 repeat (1) @ (posedge wb_clk_i);# c2 T2 N# [' G: a4 r
    117       wb_rst_i <=1;! t# o4 r2 T4 L' c+ ]; L& c6 G" r8 N
    118 repeat (3) @ (posedge wb_clk_i);- s7 z9 d: }- r5 S# U
    119       wb_rst_i <=0;
    9 |1 g2 C: A& w0 n5 W( @120 //write your test here!
    0 R* n6 K; B. k& p: }0 e121 repeat (1) @ (posedge wb_clk_i);) @! F5 p2 ~& F
    122       u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);  L; ]4 M5 ~  G( V
    123       u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);# c, k6 k* F3 k5 R- K
    124       u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);
    9 i5 C3 F; r! y125       u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);) O# |: O5 N. ?+ H* Z+ v7 b+ v. h
    126       $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);+ q# T2 R" F/ X9 H8 g
    127 //adr,adr+4,adr+8,adr+12
    3 x+ R- r0 v' O$ P& s3 t* Y128       u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);. {) y- p1 D0 j0 u- x8 m6 t
    129       u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);
    % B# U& O" X: V* K130       $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);# F# Z% W9 o, P) z9 g% r3 Q
    131     #100
    * T! p/ [" X4 e8 U, }  H& ^132       $finish;  B$ c9 ?) ^2 h$ G
    133   
    " n. v* [, ]9 e2 ^134 end: k9 Y0 Q6 M- _, k6 w& [
    135  
    ' a3 g( K  O8 L136 initial7 h$ I0 c# h7 ^' s4 }. i  S* Q: }
    137 begin9 @+ K% f( J3 j! x7 a, e6 H
    138       $fsdbDumpfile("sram_wrapper.fsdb");: }0 b8 V& Z, o: Q' ^3 `
    139       $fsdbDumpvars;% p  N& E2 M: B# x( q4 F
    140 end
      Y( w& H/ ?7 K0 [; g6 a141 endmodule. H& f  ~6 S1 g9 [9 W; M- c
    $ L! Z! j1 r& z
    + m; t1 w6 w- E2 k0 {
    仿真结果5 R- W, \4 A. A6 T- }& p
    ' G+ ]4 ]0 |" t. @2 |& N/ k
    # INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)
    ( G6 L" C; l9 R0 T#
    ! E! {3 S, P. |% R$ @+ f# x2 E#                  571 readfrom 00000000, value = ddccbbaa) m9 M/ O; R0 {  C# O  p" o1 F
    # 2 Q9 J2 o- u; `$ j
    #                 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 000000047 m! ^& x( |/ D) R9 _& Z
    #
    8 f  I9 O1 J3 a7 W" P* r4 A& @1 l6 b8 t5 P! x
    没有错误
    + x; v2 G6 ?9 a4 z( `, o
    1 y' I: Q7 I7 ?; d0 wØ  Sram_wrapper的soc系统仿真验证
    % r" f! m0 g* J6 R8 }7 o- n+ `1 W/ C1 X+ I9 X
    加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示9 h3 e: O1 A4 F7 I' L  u; M
      B6 K) n1 ?: w. G# u2 k
    1 #include "orsocdef.h"
    ; t' L2 z7 T, i, W 2 #include "board.h"
    $ S* ?  E/ x% Q7 B8 E( r 3 #include "uart.h"
    3 v# \% O% F: _ 4 ; ~, v: |+ \  L
    5 int
    " }3 I: [4 Q: I2 d/ b& f3 R% M/ N 6 main (void)
    5 O% N: b% Q; f4 a 7 {
    % I3 O8 ~$ v( l% v 8 long gpio_in;
    9 s- z# E* @7 w7 I; }" e4 o 9   REG32 (RGPIO_OE) =0xffffffff;' v/ R, \) y) v  J
    10 ' V9 V8 m& {4 F
    11   uart_init();
    - z. @- t1 M" ^- n$ V1 E1 ^12   
    8 Y, p8 X0 L. H. S; |13   uart_print_str("2Hello World!\n");
    7 u  \+ T4 r; F" @14   5 h" ~6 |& P' j6 u, ^. T
    15 int i;/ b" C/ N6 K! {. F- z( I! f8 P0 J
    16 int t0, t1;! E, ~( h, @: Q
    17   t0 =0xaabbccdd;+ S' x7 a+ ^% t: @: F$ @( }7 e% g
    18 for(i=0;i<10;i++){) b. U! N/ M( G  R; v
    19 //REG32 (RGPIO_OUT) = t0;
    1 [5 G7 O& p2 Q+ }* r* a20     REG32 (SRAM_BASE + i*4) = t0;
    9 f$ q$ k4 L& n: j/ ^; v21     t1 = REG32 (SRAM_BASE + i*4);
    ; u& H9 u( f& _) _22 //REG32 (RGPIO_OUT) = t1;
    * ]: J4 I' f, u! e% x# N2 K* j23 if(t0 == t1)% V4 `$ n, h0 a/ P) n# m2 H
    24       uart_print_str("correct!\n");
    + _# c" j8 l) S' b25 else
    2 Z/ c. k3 ~% ?- ^) C! J# @" Y8 O26       uart_print_str("error!\n");
    - l3 y( \4 o0 S: Q5 e27     t0 = t0 -0x01010101;
    4 W0 V9 _0 |5 d$ y, n1 [28   }
    5 g2 a) d% a! t' t9 ]& t29   
    , R9 y6 ~; w% F6 j30 while(1){
    ' B2 q# J4 _" L6 Q) L* T7 r31     gpio_in = REG32 (RGPIO_IN);
    ) g" e4 a( W5 q. e32     gpio_in = gpio_in &0x0000ffff;
    6 v1 \1 _- @. {0 b+ q# e7 q33     REG32 (RGPIO_OUT) = gpio_in;
    8 t1 a2 Y1 A& Y! G) x34   }$ G6 z" }/ t0 W7 x% R/ T1 j+ Z" B
    35
    " x8 w$ @) l, @* ?1 l0 i, ^. ]5 S36 return0;2 e* V  _! g6 g7 J# T4 B
    37 }
    6 Y0 S$ I6 v0 d, Q% }' w1 ~- ^# o& l; @

    ( }8 ?% B, ?( _% e8 k8 M仿真结果3 i( }( h6 s% D8 s

    $ k6 `, P2 ]9 g  V! q/ E& w5 h# 2
    0 D8 b1 X6 N% `! w: U, Y' D( e# H
    : Q  u. j* ?. E' W# e- T( P8 O4 F* }3 t
    # l
    $ }% u9 c* C* q; q2 r# l
    & P# O# l) K- Z; `9 L7 R9 B. e# o) W4 B( K6 t& \) b# M! j+ b
    #  , K; Z2 B: {6 b! L
    # W4 H7 C2 U0 A: l6 `2 h
    # o
      J3 y# z" z+ g& C2 {# T) G# r7 ~' x% y1 u4 p1 @( t% q
    # l3 P- w) C0 e4 L. B
    # d
    3 ?6 }2 g" X( J* G  H6 \/ f; i# !7 N8 F9 l+ d0 ]0 i9 f: {
    #
    7 K; x- _+ U) L& D#
    9 T& E  M: m% J! `4 b#
    3 Q' r4 h, J3 }+ C# 8 q, t" l: a& @9 r
    # c
    # H; c9 c9 V7 @# o1 e4 @, r# J8 {. I! O! l
    # r5 g6 t! H, F' o% o/ Q% A. }4 l
    # r
      Z* @+ g. I. C- G3 P9 m5 o" d6 a# e
    * o* Q% K8 U$ T( @# c4 T* B, k) B! `. Z3 i5 I! U
    # t# R4 |- N; S! @, g+ R
    # !
    4 D: t! q" W; ?  R( K… … ; z: b) M, T9 B( C& `

      W' \% s# c4 @9 s在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。2 N1 s* r6 r+ R# n; b9 ?
    " Y( Q, r* R2 M. z. ~" b, {
    Ø  Ssram控制器的设计与验证
    # f. p4 B+ }1 |0 c, O9 \, s) K7 {" }+ H$ f
    Ssram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。
    5 V' F. j$ u* i0 [: k% N4 f
    $ u% Q0 c: A6 F- t关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下
    1 t( L" p0 r- d. C7 B  n7 c5 ~: U) M

    : S6 `  R) o! X/ s* L  1 //----------------------------------------------------------------------------//
    ( |0 o" h- Y! Z+ @: |5 {7 P  2 // Filename       : ssram_wrapper.v                                        //
    / D- O0 ]" u- N- C: P* `, x% ]* s9 R1 q  3 // Author         : Huailu Ren ...()                                       //
    9 v* K9 O, ?1 X5 y5 A. H6 M  4 // Email          : hlren.pub@gmail.com                                       //
    ' V7 g( T7 o, z# `% ~0 C; L2 ~' T  5 // Created        : 23:54 2011/5/17                                           //" l' R& A" }9 }8 B# q
      6 //----------------------------------------------------------------------------//
    # v8 _4 \; ^+ k( D! b, x) S) F  7 // Description    :                                                           //: z: \: v7 x/ W+ }( f& j2 c* W8 X9 x
      8 ////
    ; o0 _% |, p' |7 A7 M& F  9 // $Id$                                                                       //: e  b& f$ z8 w
    10 //----------------------------------------------------------------------------//. a& a7 i1 ]9 {( h) M1 w
    11
    2 D- S; y% W2 P9 I* a3 H) ^ 12 module ssram_wrapper(
    " _$ g+ @! y& H( J2 m0 o 13 input              clk_i,
    , t6 ?7 E: F* y 14 input              rst_i,% ]2 \4 r7 E: j0 `9 L
    15   
    9 c. G& p) t) D& W 16 input              wb_stb_i,  d- w+ A5 v" [" K0 H8 s0 ?
    17 input              wb_cyc_i," y; H& b- }: r* E$ o
    18 outputreg         wb_ack_o,) |( x2 U9 v5 u- O
    19 input      [31: 0] wb_addr_i,
    $ _8 J6 q; z$ i7 u7 i# U 20 input      [ 3: 0] wb_sel_i,6 y! @7 v4 E& w; k/ ?
    21 input              wb_we_i,
    . z9 [  {8 ?* V' x# I, ?" z' _( P 22 input      [31: 0] wb_data_i,: p. Y; F) M$ z8 p6 y2 D) u
    23 output     [31: 0] wb_data_o,
    ) N& ?# z$ M  Q9 o+ t! T 24 // SSRAM side
    * Y' m. _& g2 m6 c! u0 G 25 inout      [31: 0] SRAM_DQ,     //  SRAM Data Bus 32 Bits8 I, ]  L+ Y& {5 q; C
    26 inout      [ 3: 0] SRAM_DPA,    //  SRAM Parity Data Bus
    , O4 T6 @* S8 J 27 // Outputs                     
    4 _( c- f3 v/ T+ h! q3 s 28 output             SRAM_CLK,    //  SRAM Clock6 S, Z( J# o- A5 d7 F
    29 output     [18: 0] SRAM_A,      //  SRAM Address bus 21 Bits
    ' g7 K( Y3 d( {2 r' @/ W. U8 M 30 output             SRAM_ADSC_N, //  SRAM Controller Address Status  
    4 l2 n+ Q8 ]: h$ P 31 output             SRAM_ADSP_N, //  SRAM Processor Address Status2 d2 d- Q/ B3 f- [( z
    32 output             SRAM_ADV_N,  //  SRAM Burst Address Advance
      r) h' U0 Q8 [- v" e1 ^4 K( }9 H 33 output     [ 3: 0] SRAM_BE_N,   //  SRAM Byte Write Enable
    2 U, q5 P" \6 g# M, s 34 output             SRAM_CE1_N,  //  SRAM Chip Enable' |8 E6 J& Q1 S
    35 output             SRAM_CE2,    //  SRAM Chip Enable
    - g3 D4 B& R' n$ \, y( M3 H9 C 36 output             SRAM_CE3_N,  //  SRAM Chip Enable( r! r* u& j& p: b
    37 output             SRAM_GW_N,   //  SRAM Global Write Enable
    $ K1 L! j4 `8 J/ J9 _4 Y+ t( @* \3 n 38 output             SRAM_OE_N,   //  SRAM Output Enable! K$ R+ o0 {/ z6 G, L0 [  g0 b
    39 output             SRAM_WE_N    //  SRAM Write Enable9 S" p% |/ e, {$ r( E
    40   );
    . T  V& O5 |" [; O1 f: P 41
      o% s# n% L4 B$ f 42 // request signal8 d! `, S+ @+ I8 M9 O
    43 wire request;7 k1 ~- P4 X+ P
    44  
    0 H3 ?! Y/ E& T# q) w1 V4 o 45 // request signal's rising edge$ a  G9 s. p: h7 Y, ^" y1 B
    46 reg  request_delay;
    ( D8 D) q  Y" B# H 47 wire request_rising_edge;/ s, M: m3 u6 `' H3 W
    48 wire is_read, is_write;, _4 m4 o- ^; {/ m4 L; e
    49 . @. w/ n0 l& k* b  P0 r  ^
    50 // ack signal
    : x# F; [+ |( M) M- d1 `- ^- }! L6 V 51 reg  ram_ack;
    8 |+ |9 o% R2 g 52  
    6 a) e; O& w+ p 53 // get request signal
      E1 R# x) B$ @4 x9 a 54 assign request = wb_stb_i & wb_cyc_i;
    ; _! X; }- F$ c% B; m) g0 K/ ~ 55  . i+ m( ^5 D& `! ^; \- ?, E
    56 // Internal Assignments
    , m  O4 A3 X3 H 57 assign is_read  = wb_stb_i & wb_cyc_i &~wb_we_i;3 a' `. I+ m! }+ w5 c
    58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;) E' ]# {) L& m* j# _9 e
    59  0 g5 m& x: B3 h2 H1 S9 x
    60 // Output Assignments
    & g) Q7 C* d2 ^1 Y3 \9 B4 L5 T' x 61 assign wb_data_o      = SRAM_DQ;9 u$ ]4 g' ^% x" }
    62 $ ~! j% x4 u1 ?8 b5 B0 W6 k, Z
    63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;
    7 a$ g) \9 F  W3 f2 V/ ] 64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz;  u; f" F) ~# F- S/ O3 X% B
    65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;
    : G) `3 M$ p/ _% C8 U# J6 D 66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;6 c( P! h- m3 d" s  l% l
    67 / w0 ^2 b0 N1 ]
    68 assign SRAM_DPA     =4'hz;
    2 V; l+ e% x5 y/ b" S) t 69 , t% Y& c, M! O# X& B
    70 assign SRAM_CLK     = clk_i;$ x1 d6 v) E) Z" e
    71 assign SRAM_A       = wb_addr_i[20:2];  ^7 b' ~0 @& Q0 c  U' _. x7 x
    72 assign SRAM_ADSC_N  =~(is_write);
    : ?2 h4 h" c: j! s- I7 c5 q 73 assign SRAM_ADSP_N  =~(is_read);
    0 X5 I, A1 ?# I) |3 c* F2 A 74 assign SRAM_ADV_N   =1'b1;, A4 Y- B* a3 x+ {  N  j
    75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);
    ; t" O, i6 v% F" q2 b8 ~ 76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);$ t5 ]: @) r5 r
    77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);
    * G; t( z2 x9 s, t 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);0 z# D# f, @2 J6 {" y1 D* X
    79 assign SRAM_CE1_N   =~request;2 s- h3 W, m( T: R+ I8 T
    80 assign SRAM_CE2     =1'b1;8 P0 ~( G$ s" P. ]( O; `
    81 assign SRAM_CE3_N   =1'b0;- N* q! v" Z$ r8 \
    82 assign SRAM_GW_N    =1'b1;
    $ \8 N& ~8 Z8 f5 t 83 assign SRAM_OE_N    =~is_read;* s8 _, a) o. v" L$ G- A
    84 assign SRAM_WE_N    =~is_write;0 p: i4 a3 E7 @- _- p% W+ U) K  w
    85  
    4 ?1 ?7 J& F5 i2 Y2 D  [ 86 // get the rising edge of request signal
    . F3 |5 [# W7 p3 b 87 always @ (posedge clk_i): X) Y. D7 l" E
    88 begin4 `' H2 e1 t- [6 P. |, S, b
    89 if(rst_i ==1)
    + H: m: g% _2 K. q. z 90       request_delay <=0;
    + Y3 p8 L- W, X% v 91 else. Z, _1 E7 _4 R4 G1 O
    92       request_delay <= request;5 H% ^3 J$ Y1 g' r1 u6 R' l
    93 end* P$ M$ D" P4 ]# V! r! t
    94  + y( |7 N- k. q& W/ ~! ?4 }+ W
    95 assign request_rising_edge = (request_delay ^ request) & request;% [) [+ w" B  {4 G6 A/ {8 N
    96
    0 c* B( z1 [! J- Y 97 // generate a 1 cycle acknowledgement for each request rising edge" A# x! j. P9 K
    98 always @ (posedge clk_i)1 }6 ]1 J. g. K; A' f
    99 begin3 [2 C. ~2 }6 j/ d
    100 if (rst_i ==1). y) r1 {) u+ x  B# q& l7 U- a
    101       ram_ack <=0;4 M6 o1 H+ K4 _6 ^) R
    102 elseif (request_rising_edge ==1)8 {0 Z. B/ u* r
    103       ram_ack <=1;
    : u. F& a6 |2 C; |104 else' Y* ?0 P% M$ C, ^& U* P- W
    105       ram_ack <=0;
    ) D" m6 p+ y# P2 \2 Z6 ^8 ~7 a4 E106 end- y/ @" D3 p5 e. N; l  p, n
    107 $ A, J& F; Q: A1 p+ b: K
    108 // register wb_ack output, because onchip ram0 uses registered output
    % l1 z: G1 E: `  m3 T" T109 always @ (posedge clk_i)3 S5 e/ B% l1 u; A5 _$ a
    110 begin
    ' X/ E( w( L4 @  t111 if (rst_i ==1): p$ S  V' B# W; V4 ]# B; _  }1 _
    112       wb_ack_o <=0;8 K$ b3 W( M6 V( f/ [, |+ g
    113 else
    , i/ `+ \( `  G114       wb_ack_o <= ram_ack;
    ; J  ~* S( W; N& ]! G" ^; ]: F115 end5 W* G3 v" p' e: d7 O1 B3 j; @9 ^/ C( m
    116 5 G* {; G1 `: h8 ~" Q: R
    117 endmodule
    " w. v. R* }2 x1 |0 r! \# h9 q' f0 Z2 q/ e* a# _
    + ?  E; ?7 M/ I2 m4 ?; u+ `) h
    并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
    0 B. F/ x1 H+ v; ], f  K
    ( G9 _# T; H* m) _; f! F' \) j源码可以在这里下载
    ; |$ L- Q/ `- O+ h$ P& i4 }% L  J$ n/ b3 k
    稍后。。。' W( J: \! s6 e2 J: M% c6 n: h
    To Do1 k0 M: O* `8 A2 y
    " @) L5 h7 e* l3 K) G" x) W7 f
    用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
    4 @* C0 T3 O- [! {; e0 [, h( f$ Z7 Y修改以下用所写的sram_wrapper移植到DE2-115平台上
    ' M( q$ Y, u+ q% ]7 V) `9 OTo Do--关于opencore,or1200的soc平台9 q, L5 f; z: }6 ~( |" X/ k
    " ~* U7 Z7 }2 {+ X" C
    OR1200的引导方案设计(基于硬件或者软件uart控制)6 n# Z3 @' ]$ R. k* {& J
    移植uc/os II操作系统7 T: m" K! g; L! g7 k
    驱动起来DE2-70上的网卡, E) n; k3 Z" ~. _4 ~2 {
    加入jtag模块
    7 J, r8 Y% g4 U! j1 F移植u-boot) {1 v: {! ~; E
    移植ucLinux
    2 M2 x0 l) L" k& f) Q9 ^……
  • 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-6-24 09:42 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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