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

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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    ; S6 [/ l! e. i! ^5 U
    Ø  DE2-115和DE2-70的存储器配置
    1 u; \; H+ c" A/ c* {
    1 }6 a# D0 }; ]. }2 y6 RDE2-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之间反复转换。8 }* l/ q6 y  x5 g& v

    " x$ Y0 @' z" N1 l3 k8 L2 dØ  Sram控制器的3中验证方案
    5 @2 @7 R! C# G% p9 D" g( I5 `$ W* S# N
    本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。
    6 `" R2 L2 H& O! \! X* S9 k: d$ L* K3 h& e
    7 A$ h1 x$ ?! [* \) j! y7 v

    ; s; }: T4 X% S8 b8 c  M以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。  z9 l7 V% ~+ _7 g( e) `1 R3 ~4 f

    ! F: w) w3 n7 ^: m" U我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?
    - v# E3 Q; K" W5 B  P$ z" [* v7 }2 U1 y5 O. }
    Ø  DE2中sram控制器的时序要求& t* a! P4 I" n) V* f

    ' T% h1 N' G5 q* q0 }5 d) FIS61LV25616的一些常用引脚的功能2 G; Z- m8 k, ]  T+ ]% m2 h3 Q

    1 W5 O, h" |4 n; ~; L* ?- K9 d6 ^0 O- i
    / q8 L* [# y: ]% {' r* O6 }
    7 u4 V1 y9 o# Z3 H, v! m; Y& d4 H读和写时序按照参照datasheet中所介绍的这两种方式
    / j$ }. R( \! r; g1 @% O1 P) S$ R3 @* f5 j
    1 R: T1 F( l/ o- P
      \3 x0 g; q# A$ C; t1 `

    : X3 K  n5 |1 P( F/ d3 Q/ A" T% @, U% m# B0 x# N) B
    在wishbone接口中需满足途中的基本时序要求。1 m) O9 g- r; w. _  g5 m$ b8 X) K

    ; G3 ?" i: s+ e3 P7 iIS61LV25616的verilog model在网络上很容易可以找到
    1 B  u& z" @" z0 E- H( S( K5 {* b$ p0 A, t- p
    % w* J5 X5 `8 f( @7 B; B
      1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.8 m; j. ]7 d4 }
      2 // Note; 1) Please include "+define+ OEb" in running script if you want to check/ E$ u4 K& G3 p. j" e
      3 //          timing in the case of OE_ being set.3 ^/ m# e" p! |$ o4 x) h! ^* n
      4 //       2) Please specify access time by defining tAC_10 or tAC_12.( B1 ~6 x6 r) T% s1 A$ G
      5
    8 S% O! Y1 b( `, ?  6 `define OEb/ f9 R; a3 c6 H' }' v2 Z2 C5 {
      7 `define tAC_10     //tAC_10 or tAC_12 defines different parameters5 u0 d$ ^9 M  `
      8 `timescale 1ns/1ns$ t! p; |- S" C( O* |- \
      9 0 i" ]1 u' n  P, \; i5 F$ H3 I
    10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);
    2 J7 l0 A# S& \ 11 ! m9 [5 C# G) i1 F; E3 Q0 a
    12 parameter dqbits =16;
    7 q4 k$ m7 U5 h/ X2 y 13 parameter memdepth =262143;8 r6 h' A1 P5 e" g4 ~; r
    14 parameter addbits =19;- S; `$ q3 Z% ^/ h5 e
    15 parameter Toha  =2;) K/ n7 ]- ^* ]9 j' F7 W5 i2 C
    16
    " M; Y  C9 v) L% u& d- J- n 17 parameter Tsa   =2;% o$ X8 ?. r- @$ p
    18 ) B" R/ s5 {  e& y& ]' B8 k
    19 `ifdef tAC_10         //if "`define tAC_10 " at beginning,sentences below are compiled
    6 O# t7 e0 _9 j% D! r) t 20 parameter Taa   =10,
    * Z/ }. y: H4 _2 z5 A' _ 21             Thzce =3,
    9 t! V; e$ e5 g2 G' z* H% q" R* |9 J 22           Thzwe =5;
    % c' U' |+ ^4 w) u9 R( a0 O! o9 ]. o 23 `endif
    6 ]* k2 \" Z' A: h/ S5 h2 \ 24 9 K. e0 F! U9 {. E: i' n
    25 `ifdef tAC_12        //if "`define tAC_12 " at beginning,sentences below are compiled
    . o6 T' P. P  i 26 parameter Taa   =12,
    5 J8 k" s5 u. v- L% S 27           Thzce =5,
    " q5 R* j1 {4 ^. s; a' m% a  { 28           Thzwe =6;
    - Q0 D) R6 `+ u  t6 J- I* P1 P; h 29 `endif
    $ U; N5 p/ A: x& A+ B3 Z 30 * o" H7 A" ~) Y- _
    31 input CE_, OE_, WE_, LB_, UB_;
    ( b  @# P+ ]8 t) t1 n, u 32 input [(addbits -1) : 0] A;
    ) ?5 y8 b$ M: Q% N; R 33 inout [(dqbits -1) : 0] IO;5 Q5 n- P7 F( t; _- V
    34  % V8 _& c/ J, I8 o- P2 E
    35 wire [(dqbits -1) : 0] dout;
    : C3 v) _9 B, L' Y1 j 36 reg  [(dqbits/2-1) : 0] bank0 [0 : memdepth];
    , R/ k7 w5 e6 z+ y6 e! z 37 reg  [(dqbits/2-1) : 0] bank1 [0 : memdepth];* R( i/ b$ T4 I9 m0 B$ k- a. Q
    38 //array to simulate SRAM
      G) g" O4 A& X! R" }/ I* T2 A8 x 39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};
    , y! S4 u8 q/ p  t' \ 40
    # a9 n2 e. f" L 41 wire r_en = WE_ & (~CE_) & (~OE_);   //WE=1,CE=OE=0 Read% u( @! X1 b" B. c+ w
    42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write& w; Z$ r# @& j& n
    43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; + x3 |/ T0 e) V) m. e, W
    44
    1 o" k  U3 e- o! q  m; Q  }& L 45 initial1 j; k% v" O# E) O* d, j$ r
    46   $timeformat (-9, 0.1, " ns", 10); //show current simulation time
    % u8 {. V& g! j. ~/ ^; E 47 $ R+ R7 h6 I8 c1 H
    48 assign dout [(dqbits/2-1) : 0]        = LB_ ?8'bz : bank0[A];. f& C% u, L( B& Z
    49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];
    8 ~# C0 Z& }/ z5 f% { 50 1 @( ?1 _9 |: c1 X$ T  P9 t
    51 always @(A or w_en)# ~5 k; I6 J' g: W
    52 begin: F6 R2 `) f3 J. v3 g5 l4 L, t/ C
    53     #Tsa    //address setup time7 R+ G7 o( H3 n8 t& w) _5 l& F0 ]1 l3 m
    54 if (w_en)
    9 ?9 ]9 Y( H/ c/ u) P5 X 55       #Thzwe3 s4 Q% n- u5 O1 y/ X
    56 begin
    8 Q( G! H: G' l5 _ 57  bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];& p' \( ?0 k& I# x
    58  bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1)   : (dqbits/2)];* ?3 L/ L6 r  y# l
    59 end
    $ g! q, y; p0 f$ g5 T* j; N 60 end1 @7 |1 d" X$ A" K
    61  1 {6 k' i' J: q) h; r6 m
    62 // Timing Check
    6 o+ F  _2 a0 p, ?4 v5 q$ N 63 `ifdef tAC_10
    8 X+ T5 V% S' o- I: f4 Y7 c% _ 64 specify//sepcify delay& Q1 d- L0 U/ \6 p4 S* d. M
    65 specparam! G3 `4 i' Z* N
    66       tSA   =0,
    2 C) v) T7 n$ b) ^6 P9 r+ ~ 67       tAW   =8,' }* T; P2 S% X) r" m) S. k8 M+ W
    68       tSCE  =8,( e5 u1 J; g* z, L5 G
    69       tSD   =6,
    # O" w/ h4 Q/ n  w2 w. ?( J 70       tPWE2 =10,$ }5 ]( n8 {! {
    71       tPWE1 =8,% I8 E' N& _1 q7 |
    72       tPBW  =8;
    " J/ d- C0 L7 u8 a9 E- K! } 73 `else
    9 p- i: q" \% L2 v8 F# } 74 8 i4 ~( O* T: `* y# H0 e# Y, O7 {
    75 `ifdef tAC_12. ^- C, e( ]& P* I" g2 V" C* U0 m
    76 specify
    & r. i$ @+ [* f; O3 { 77 specparam
    * m. o) E. J/ L+ S  b4 o 78       tSA   =0,
    4 x7 g1 \$ z: p# `1 u* S. G 79       tAW   =8,0 c1 A$ ~8 ?" j9 d0 e
    80       tSCE  =8,) u6 i5 x/ g9 {! Y3 c
    81       tSD   =6,8 l8 W  k# m( z" O: a- j
    82       tPWE2 =12,4 W3 p% _' I3 R+ K$ Y& C1 ~0 j
    83       tPWE1 =8,
    * [- h; y2 F. w6 {4 Q2 ?& r 84       tPBW  =8;
    3 C! e7 q( L. g' l4 |( k2 p 85 `endif
    5 F4 Y. G: A' O 86 `endif' a( _" Q- t+ U/ _6 O/ e, n) T
    87 4 L4 ~: I8 t, J
    88     $setup (A, negedge CE_, tSA);2 A( O( x0 @& x5 N
    89     $setup (A, posedge CE_, tAW);, o( b7 L" M5 P6 b' z0 a
    90     $setup (IO, posedge CE_, tSD);! g' |! ]  t2 |3 f* h- L
    91     $setup (A, negedge WE_, tSA);
    * {6 u+ h7 G; K/ [0 n6 g9 r" c 92     $setup (IO, posedge WE_, tSD);. a1 K! b8 t. v* }9 x' |7 }
    93     $setup (A, negedge LB_, tSA);
    3 {( C3 G3 D# _8 W 94     $setup (A, negedge UB_, tSA);
    . G# ^: ?$ w/ L+ w' |- ^ 95
    ) w. d3 D1 A+ B) X) D 96     $width (negedge CE_, tSCE);4 T5 J0 E) c  D# E" a) m" ]
    97     $width (negedge LB_, tPBW);
    ) ~. F/ ]- N; n# J. l 98     $width (negedge UB_, tPBW);8 N" Y8 ]9 y& P( S9 r3 F6 W7 ~2 s
    99     `ifdef OEb
    3 z2 z8 a/ q4 m1 p: E: D8 U100     $width (negedge WE_, tPWE1);
    ) W* M3 p2 K5 j6 [6 |101     `else8 l/ x- n- d3 k& w) [. I7 z
    102     $width (negedge WE_, tPWE2);0 h% R$ I5 x8 D
    103     `endif
    2 b) X3 O+ D' Y, G  |  f3 H: |104
    1 g$ \  K, c# m, R. s105 enDSPecify* I  J2 u3 Q* j, g3 p3 u$ t# k; e
    106 / ?& \3 [9 K% z  ]1 T9 \
    107 endmodule
    2 L4 |0 N& C# I) H+ M, S
    8 G) n/ U* ]7 E5 C8 Q* s9 p* l3 z4 ]+ d/ u# X
    ) S% A6 Y0 c0 K* D) J% `9 z' h- d

    - Q- O; I/ {5 `Ø  Sram控制器的设计
    7 O3 X' {' }$ S6 t# G# O' P6 L& _. Z7 X
    Sram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。
    + G) X+ V! n9 x: Y# A* g& |' J& \% T' i' k2 s2 M
    Sram_wrapper的源码, ]4 R6 m& b# t2 J' P/ p
    5 _& R/ b* h+ S2 x
    // Author(s):
    & g: n: S' z4 |; U// - Huailu Ren, hlren.pub@gmail.com
    / h3 n1 m: q- w# k& F0 H" W& n//; w& o3 M. S0 }. R$ J# ~& G
    ' j. J; S9 m2 j5 e
    // Revision 1.1  16:56 2011-4-28  hlren
    % H! T; l: W8 P3 ]// created
    & @; y6 r5 g$ n* b3 G//
    % K; H% l7 _! f( Z0 t, P* s% Y# X8 h( C  h
    // synopsys translate_off/ Y; ?* e8 @+ Y9 M& h! B
    `include"timescale.v"
    2 V. Y! K* i) i- ~// synopsys translate_on
    % E4 O. z* W' u) H  W. ]
    6 z' p1 x3 q! ]: I) }/ p1 F- tmodule sram_wrapper (, E1 ]) @: n* [0 V5 z' h8 y7 I
        wb_clk_i,
    ! P4 s# ?$ @  ?; H9 S* V    wb_rst_i,$ P! h* y' h) h0 _& D! x2 d
      R- P4 {* b/ ]) A/ o
        wb_dat_i,
    ) U% \- \6 P8 b: w. D! Q3 V# o    //wb_dat_o,
    , @0 Y2 i: n) V( v    wb_adr_i,5 }4 B" \6 ]5 I# N5 |0 q
        wb_sel_i,
    ! F6 o8 E7 \* c0 k5 [$ s1 x; p    wb_we_i,( |0 @# O; O2 o( ?5 ^
        wb_cyc_i,
    . J3 e& ?5 z, c9 O8 e. r1 i    wb_stb_i,
    4 b% d7 E8 M( h/ E+ E, ]' s' G1 r+ N, i6 t& R# F
    ; F  ~7 w8 t5 F. P* Q
        // Bi-Directional
    . E, E0 ^- m) g! M6 _' t* T: n    SRAM_DQ,. j4 c: v- T% i* ^, I; L

    2 M; U. e: k- t+ Q5 {8 N: J& v    // Outputs5 O. K, ]) B) d* q4 T
        wb_dat_o,
    8 d2 D8 t# z7 i* [: Z3 `" _* q    wb_ack_o,
    & B) g/ G0 K' R. {    wb_err_o,
    / r' e. a' w: Y+ L   
      H2 _" t$ Q4 A    SRAM_ADDR,& m: M3 M/ j& k- L8 Z3 v  F4 Z  Y
        SRAM_LB_N,
    , B; _% i4 W+ ?4 `% I2 g* ^    SRAM_UB_N,( X3 r, D& z2 b  p/ C
        SRAM_CE_N,( ~* f( t7 e/ p" }
        SRAM_OE_N,( n' K4 F5 K4 q+ m! s6 ?: ~
        SRAM_WE_N
    / b$ x4 Z2 z3 l; \4 F8 T; t);
    1 c  J; v1 _! [0 F, V
    2 N  \* j, S/ X0 M9 f7 c//
    ' W+ r0 M# m% L8 O: x, B// clock and reset signals* W( @7 s3 c7 z# ]+ g( t/ r
    //% z- }7 v# {2 Y7 |
    input         wb_clk_i;
      O) b7 P. E9 A: ^) K  input         wb_rst_i;
    # j& I  D4 J/ H, @3 Y) K//
    4 A$ V! X9 t8 v+ ?* k' S" Z// WB slave i/f$ d# G% X' D" H  y, G  t. X/ ~
    //
    - T1 v: v8 b5 P5 I+ j+ u9 ^input  [31:0] wb_dat_i;
      X0 }* v7 G3 J  output [31:0] wb_dat_o;
    * b( b; ~& `5 t. j5 w% O0 B- z8 }7 ?; V  input  [31:0] wb_adr_i;/ c# S; S7 u" h; P9 A
      input  [ 3:0] wb_sel_i;
    7 C, H4 D; l* l2 G$ R  input         wb_we_i;
    1 V6 [: u5 O( |4 S( O  input         wb_cyc_i;
    & B2 y, G0 i% V0 A/ T. x7 u8 t  input         wb_stb_i;. A0 X) m0 F( B+ d$ A1 |. _/ X& o+ |
      output        wb_ack_o;
    $ X$ ^; o. n% E/ @$ ^2 r$ |" S  output        wb_err_o;* G6 ?! l/ V. M* l3 E8 t" d0 g8 f, ^: O
    //
      b0 [6 r5 K5 a3 P0 P0 H// SRAM port
    ' m* M5 o1 h0 h7 d( d//
    # H3 ~9 f) Q$ o# pinout  [15:0]   SRAM_DQ;    // SRAM Data bus 16 Bits& t1 W0 q' W$ J- w
    output [17:0] SRAM_ADDR;    // SRAM Address bus 18 Bits5 z6 P% b- A: {  G! O% }
    output        SRAM_LB_N;    // SRAM Low-byte Data Mask4 C* T$ h# y8 v' z1 L9 u
    output        SRAM_UB_N;    // SRAM High-byte Data Mask( F0 k1 w$ R8 ]5 D- W# p
    output        SRAM_CE_N;    // SRAM Chip chipselect" f1 h0 H$ V. i
    output        SRAM_OE_N;    // SRAM Output chipselect; r+ V) T' n5 b6 X7 l0 m
    output        SRAM_WE_N;    // SRAM Write chipselect! e# S3 I) O0 z. X6 R( T
    7 a* A! T9 I; j0 `1 S  o
      reg    [17:0] SRAM_ADDR;
    0 I, J9 X2 H8 l: ~) m  reg           SRAM_LB_N;# T% v/ q- M7 _* T
      reg           SRAM_UB_N;
    ; `% E- w, R# L* s1 y  reg           SRAM_CE_N;% z; i2 f9 }. l! H" f3 Y' O4 a4 n
      reg           SRAM_OE_N;3 @2 Z8 H# O0 Q- @7 ]
      reg           SRAM_WE_N;/ z) k2 u- g: B6 q  Q& v* k3 }" J# t

    " [8 p) ~: F& B+ h3 R  reg [3:0] state, state_r;4 u; }8 o' a) p7 d
      reg [15:0] wb_data_o_l, wb_data_o_u;
    ' m; Z+ q2 }9 H, w: O/ S4 j1 N1 r $ W& S) p$ l: h4 e
      reg [16:0] wb_addr_i_reg;
    . ]* f' H3 _8 b% p  reg [31:0] wb_data_i_reg;
    ' q8 C* _4 L- d$ l7 |% _/ o% k  b  //reg [31:0] wb_data_o_reg;4 E* _" N2 i& `# X3 ^, m
    reg [ 3:0] wb_sel_i_reg;5 o. L" Y0 O9 G9 c

    6 r% ~& \; F, j( t7 n' d+ m+ H  reg ack_we, ack_re;" c- E- b4 u& e' F
    // *****************************************************************************' R1 p' w( O/ l5 s4 h; F$ o. h
    //  FSM2 J+ L1 A( j; u; f: Q5 J4 g5 @+ `0 p
    // *****************************************************************************3 @3 w* e- [) V
    localparam IDLE =0;
    9 @( Z, P! |  `3 h- u9 o5 i5 k  localparam WE0  =1;% Y6 M' b: o. U! g
      localparam WE1  =2;- ]9 J) g# {* p# M! B
      localparam WE2  =3;
    : c. k/ U6 m$ @! z% a' o  localparam WE3  =4;
    % |6 h0 H9 o4 V8 {  localparam RD0  =5;
    , T7 E- _6 A$ W+ ~5 h; G  localparam RD1  =6;
    ! @9 E1 n9 m- v' [  localparam RD2  =7;
    - _/ t# y# z) M2 t  T$ l  localparam RD3  =8;
    4 s2 Y5 R1 u, [. _$ f+ T( }6 j  localparam ACK  =9;
      D" @* b# W3 ^' C8 s* `3 q% I : v7 G2 [; D4 I3 \5 ~$ p+ @/ X
      assign SRAM_DQ =  ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0]
    $ \- N* [9 E) n; g9 A0 m                    : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]
    : x8 e; ^# s. b. I) ?3 k                    : 16'hzzzz);* |4 v3 ]. ]2 J% i" W1 l. ~. m
    assign wb_dat_o = {wb_data_o_u,wb_data_o_l};0 ?8 }' }$ }+ @' D. I& X1 s4 Y0 \

    4 U) D  M( C8 t+ |  assign wb_ack_o = (state == ACK);
    1 \% Z; q  U& g  M3 w7 i# Q  assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);
    . V* x/ R9 \4 [- v6 U* X: k
    ) k5 ?8 G  H1 k0 o  T" ~5 Y  always @ (posedge wb_clk_i orposedge wb_rst_i) begin: X" Q' S" b" \" q
        if(wb_rst_i)
    ; i& n% G6 a' v' e5 s" k      state <= IDLE;' I7 p) K2 L& `
        elsebegin
    9 G2 o. S5 I* e) f" D      case (state)
      k+ W: \" O( N3 q3 Q        IDLE : begin
    ) f2 q8 J* g/ y/ H* D0 z; G- z6 y. T          if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)
    : n3 J1 b" p% x- @- ~            state <= WE0;" ~7 \* V% W& e6 J1 Z/ q
              elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re): v" _- O' C  u& S; j
                state <= RD0;4 v! ^, D/ r, ~: h/ I7 ?/ m4 v
            end5 d9 ]: q- I. v* C7 }
            WE0 : state <= WE1;! s% J1 I* |! {" k
            WE1 : state <= WE2;
    . \0 K4 j! m" _# r* U" d        WE2 : state <= WE3;( e- N+ |/ ~  M! @. m
            WE3 : state <= ACK;0 o+ _4 h' e$ ?4 O: w
            RD0 : state <= RD1;3 j' n  e& n2 ]
            RD1 : state <= RD2;
    ; r1 m9 u" D) }' n: _# `" w( h        RD2 : state <= RD3;% P7 p; ^1 C$ |) J! u; z
            RD3 : state <= ACK;$ J. g. ^4 E- K% A4 _" A1 [: ~
            ACK : state <= IDLE;) F5 h* j) @& ?
            default : state <= IDLE;
    8 u1 |  f* n2 G' i      endcase
    & E$ G5 G( {' N) b4 o7 H5 s3 l% I6 M1 m    end
    5 ~8 O! Y! U' v$ @( f, s  end
    : r6 q& L2 S3 K+ p* G& N
    & L4 y0 {- M1 Y; f  M! p$ l  always @ (posedge wb_clk_i orposedge wb_rst_i) begin  [' j0 N* U$ L
        if (wb_rst_i)
    0 _* k" A# i& m7 E' E5 x8 r      state_r <= IDLE;$ K& M9 k* e$ Z) ?
        else& u7 @: ^. _  x. ?& b5 }2 S5 |+ ~
          state_r <= state;
    7 G. N: \( X. }# V6 D7 M6 R  end, Q" O  s5 G) k$ Z7 w
    //
    $ \* N) p" F; v9 M// Write acknowledge
    % p% L: `2 @$ X0 S- |) r2 [# Y//
    - [. R' Z4 H3 ~7 N$ v: O7 palways @ (posedge wb_clk_i orposedge wb_rst_i) begin
    . M" }3 ]& C6 {/ E% a! K4 r. D    if (wb_rst_i)+ r4 K& D5 Y( w& U7 ^0 }
          ack_we <=1'b0;, U, c6 [9 f' Q. ?9 T0 P; I& d
    else6 }" o( Z+ D, w! ^( k$ `  a
        if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)2 K( L( H# G& l3 s  p: Q7 X
          ack_we <= #11'b1;
    * m- K, Q+ E! a" o) Oelse* x6 o( r) K' Q; d/ |* y" g, A
          ack_we <= #11'b0;
    & J5 {( k) [! L" E  ~% Jend( J/ P! v$ Y' I% U. t+ E- y, C; R# c

    4 d5 n5 p3 w, p//! V; X/ o$ j0 P" _4 i- `
    // Read acknowledge
    6 O# O3 M# L4 a8 G8 M//3 k5 k3 U* {' W, N* T- {$ {  ^
    always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    1 e  Q: L6 _- n5 \" m6 C3 t    if (wb_rst_i)
    & e1 c+ z2 @( b      ack_re <=1'b0;
    ; y) H9 w5 W  \2 u( p8 Uelse
    ; X; T" \" [; x3 G, `    if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
    / k( j4 z# f  f4 |      ack_re <= #11'b1;) a0 Z' t$ i1 @+ K2 _
    else) A2 z4 c2 c5 A. q! H. C" e- B0 ^9 |
          ack_re <= #11'b0;1 R; M" s& h+ `* q6 r$ ~7 R+ O( i7 e
    end0 W$ Y! U0 v) [) T! }  z2 J
    8 z4 ]) S% F0 D: k
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    7 d9 O3 h( I% _    if (wb_rst_i) begin  b) z4 f# u$ u/ @/ I3 i
          wb_addr_i_reg <=32'b0;
    3 ]& k2 q' A1 N      wb_data_i_reg <=32'b0;5 A# h8 f8 G/ O. |( v* b# N
          wb_sel_i_reg  <=4'b0;. d4 p7 Y1 i/ N2 p
    end
    + [0 g$ l* Y5 u' F+ |$ D    else
    ( N' S8 y) r( e+ b! \8 r  T0 [) @    if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)% a! Q7 J& k4 G1 H/ {# @# h
        begin# u7 t( |0 R' U- K
          wb_addr_i_reg <= wb_adr_i[18:2];
    , O: f, {/ W% ?      wb_data_i_reg <= wb_dat_i[31:0];
    , s5 ~: Z- W0 R( N- v9 @4 r      wb_sel_i_reg  <= wb_sel_i[3:0];
    ( u$ d6 C" L- t  @3 d5 _! I    end
    7 p' S. U; v- M+ u2 t# f  end2 U  o; ^* G. @7 a& Q

    $ l7 v3 ~+ S: }. P+ E9 [" c5 v  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    & z! W' }0 e/ m& `6 [) e    if (wb_rst_i) begin
    1 y1 ^5 u! c( S% I      SRAM_ADDR <=18'b0;
    / p- P7 w+ W9 c, o4 k/ k& |6 ]! Eend
      l7 Q: j) x6 r. N$ v    else7 |0 |2 s. Z' E
          case (state)
    . w& X* w( g" O. [        WE0, WE1, RD0, RD1 :
    7 }' i9 h$ p# j  u" z4 W, ?! k          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};6 @7 D2 M7 W$ H. r) R
            WE2, WE3, RD2, RD3 :7 x% J/ v- t7 @
              SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};/ C. D8 r, @3 B6 z5 C+ l
    default : SRAM_ADDR <=18'hz;
      S& }3 a0 ]7 r/ f3 T  Jendcase
    9 N5 i7 L- h2 b6 A+ ]  end" K$ ~! X- p3 g8 y& L
    + X: `( g& e+ j+ `+ \
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin0 k8 w# z. E/ M# C9 k! g7 b
        if (wb_rst_i) begin1 T1 M% Y- \2 W6 E5 e9 c
          SRAM_LB_N <=1'b1;
    $ |7 q' a6 {+ N* ~- c. a. m% u: Cend
    % ^; f: E( P; ^0 m2 r    else2 t, P! M) P/ _9 `
          case (state)
    % X" [$ k' D1 M3 Z        WE0, WE1, RD0, RD1 :- q$ o( B! u0 k7 }* Z2 B0 K( W
              SRAM_LB_N <=~wb_sel_i[0];
    ' q6 L  L6 i' z+ D: v7 m# B8 V* d; Z. Y        WE2, WE3, RD2, RD3 :
    4 X$ y" O+ y8 ?/ ], k  ?          SRAM_LB_N <=~wb_sel_i[2];
    1 r2 F0 q! U8 Y) j$ H3 y1 M+ x( B        default :- r6 G0 N% p  {! {2 t. n8 n+ l5 M2 d
              SRAM_LB_N <=1'b1;3 a  B! i9 [8 W0 R% @/ p6 s. K
    endcase* m2 [5 V. p1 Z8 F
      end
    9 L% ~( V0 A" D8 k+ Z. V# C1 E
    ) ~7 \  C' b$ W! U8 `( \" B  q" R  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    ) U5 r1 o  n% e  r' H% I    if (wb_rst_i) begin( y* v/ O- `2 e  _3 ^$ L% R
          SRAM_UB_N <=1'b1;2 f; n- N! s2 N( ?3 N+ J2 w
    end4 j$ p$ S2 C/ ]( |/ s. K. S
        else% l! p% M* {  b! q! j9 n1 |
          case (state); m* K: h* F& K9 @
            WE0, WE1, RD0, RD1 :8 G2 k" x* v: T
              SRAM_UB_N <=~wb_sel_i[1];
    * O+ A& ]- z" K; l7 s. d        WE2, WE3, RD2, RD3 :
    ; G; ~! E" `2 E( u. l" V          SRAM_UB_N <=~wb_sel_i[3];
    ; P5 E$ a* G+ G5 X0 ]# v0 R! ^! h        default :9 f2 b7 r# K1 \  \' s! R
              SRAM_UB_N <=1'b1;
    & R5 {9 v! }- x0 r3 P* a  l9 ~% }endcase( G  R4 _  R4 `( d
      end8 o( F' R* e9 N

    $ `# z. H- o- _" k: }9 A  b: p  always @ (posedge wb_clk_i orposedge wb_rst_i) begin; z  m- R4 i; m( e2 h5 T
        if (wb_rst_i) begin/ e$ E4 N& f" }' b1 \3 s2 }7 d
          SRAM_CE_N <=1'b1;
    2 O6 I8 U2 J" @' L& Z5 G! Uend
    2 W" y3 s2 z( f4 P    else/ X1 K, a/ T# K3 F: ?3 f/ g. p- d
          case (state)- X  s- C5 [0 ^4 X0 C- E- S' c
            WE0, WE1, RD0, RD1 :% y, q# B. I" o; U* o3 Z
              SRAM_CE_N <=1'b0;
    . F9 A6 s' i" g/ T# @. O* t; v  Z& n        WE2, WE3, RD2, RD3 :
    / j/ w% f+ a  O3 D( n          SRAM_CE_N <=1'b0;
    # M7 z+ ^9 \: ?, hdefault :' q  ]+ m; A  I" g
              SRAM_CE_N <=1'b1;8 o* M' F& \# a/ E8 ~; W  L
    endcase
    6 i& D+ R6 `4 t* Z# N( I# v# Y! ~! x  end: Q- \1 n6 O+ G5 ]8 c
    ( Y% y! K  h2 H' U
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    . W0 u- {) a$ @, T    if (wb_rst_i) begin4 Y1 {4 n. ~: G5 _6 i7 u
          SRAM_OE_N <=1'b1;
    / F+ H- ]6 ?/ W8 hend
    1 Z3 ~6 r  n1 W" ]    else
    , ]2 P* ~) m, i' P/ I      case (state)
    ! r# j/ h/ c/ j) J) n8 ]9 i% g( [        RD0, RD1, RD2, RD3 :
    % X5 _1 G2 V" y8 C          SRAM_OE_N <=1'b0;
    3 `4 j: v; F6 ?8 }, o, d- E+ S* Wdefault :
    9 M% h! t. b0 }3 S! G1 s          SRAM_OE_N <=1'b1;
    # m( k+ d4 X) d6 W% u+ o$ n3 nendcase; @; D+ Q1 A6 }7 U0 ~# I
      end
    0 t* R% x: V- Z: d. R $ Q4 n8 A; m1 q  ~  T. r
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    1 N% h% J( ~( F1 p: G- p% I    if (wb_rst_i) begin/ ^, x: z( J+ \) L1 T: p# ]
          SRAM_WE_N <=1'b1;
    " L7 ~: {* ~: r6 ^: X: cend- E( a4 S5 o% _6 @
        else0 j8 l: ~9 _4 u2 X
          case (state)+ x9 e+ N. ~! X# l# u/ H8 J2 u" R
            WE0, WE1, WE2, WE3 :) t1 B) {, W  L8 G* L' h5 e, W! V* p
              SRAM_WE_N <=1'b0;
    , e$ z5 m* L# v) ~$ K$ `- W3 udefault :4 f9 |7 v- k/ f2 T! T* f/ g
              SRAM_WE_N <=1'b1;
    3 K% [; g) y3 N& _- J: C' xendcase. q# K% M! }. E! X+ O& f1 V; Y' c* o
      end1 q* l. R; C, t* K2 B
      //* L6 s$ s& t" C
      // assemble ouput data
    ( ^) Z6 a! l, a$ j) Z; Y' X* a  //
    % S" n; i7 M/ ualways @ (posedge wb_clk_i orposedge wb_rst_i) begin" t1 z8 W6 G. k# R- K$ G
        if (wb_rst_i) begin8 e# H8 J  j! w" a9 l
          wb_data_o_l <=16'b0;6 S# Q( K5 ^% P& S& X
          wb_data_o_u <=16'b0;
    2 g' o. m. q5 a' ?. Eend
    ! k2 ^! q# ~' ?- C5 _9 v    else, B, {9 F6 _7 ~# K) ^/ d
          case (state_r)
    + L0 V7 p6 m: S7 [/ ~9 j        RD0, RD1 :! r; R) \! ~& a" k8 A1 U
              wb_data_o_l <= SRAM_DQ;
    6 [5 H& T% a9 b0 A0 s- a        RD2, RD3 :' S. Q( B$ l0 _7 P, a
              wb_data_o_u <= SRAM_DQ;& O& w$ \9 S, K/ @  S0 `! @
          endcase; _+ ^( {# U# B4 [
      end1 S' @. I; T' M. M% \+ x9 g& U
    endmodule& l: o, h# e7 e& y; x8 K6 B7 X- V
    - q# k3 b; N  D, I# s3 h
    ) V9 C5 |) X# I& h2 v  Z8 q+ y
    Ø  Sram_wrapper的wishbone BFM验证
      X+ {( I4 H/ Q2 B
      q( J! e. c# a* z6 ISram_wrapper的BFM验证的testbench代码如下:
    % z' N* r7 S% `) [) A5 D) V. P: I: U* g* }! z

    + O2 r9 g/ _+ ^1 A  1 // Author(s):* i4 j8 m7 b7 y, _! w" N
      2 // - Huailu Ren, hlren.pub@gmail.com' T5 [# S4 I4 Y6 V4 J
      3 //" O5 m4 z2 ^2 ?' ]8 V" x
      4
    . `" K. \& z; J3 N2 M! F  5 // Revision 1.1  17:45 2011-4-28  hlren* G7 p5 A- }3 [
      6 // created
    8 n8 b$ X* Z8 V8 ~9 N7 R  7 //
    * K. k3 }7 u3 X, A6 g  8 2 G4 ~7 t2 j$ T8 A" C( e; k: n* b
      9 // synopsys translate_off
    ! Q' e8 ?' {3 ?' d0 w, u. ` 10 `include"timescale.v"
    . s" E- Q4 a; Y* c 11 // synopsys translate_on
    & p) \8 z1 c: ~' d  y' H 12 : R, v. Z0 y) W
    13 module tb_sram_wrapper ;9 D( @- k; ]; @4 C- C- p/ V, L, G
    14
    5 Z3 u2 N8 s; H0 Z) x$ g1 O' g 15 //
    $ K- q& o& j% P7 M, w4 u: Z4 O 16 // clock and reset signals7 z  s% g; W9 [7 S- k: Q
    17 //! N0 f$ d( d6 P9 ~- X7 v* ?4 J" X
    18 reg         wb_clk_i;: @; M& w# _/ G1 l
    19 reg         wb_rst_i;
    ( l6 a/ P# D, M1 ]) z6 o, r3 } 20 # b5 V' r3 ~; n3 g- C: }& I
    21 // *****************************************************************************
    8 W& g/ t* y& U/ s. g4 B  Q; c 22 //  wishbone master bus functional model
    / L+ k! y5 D: v1 ^ 23 // *****************************************************************************
    2 C3 S( F7 A8 w6 J' M 24
    $ V3 ~- V- k3 Y2 v+ n 25 wire [31:0] wb_din_w;
    + d7 C, z& O! u. p 26 wire [31:0] wb_dout_w;+ R* {7 ~' h1 Q3 t& v# f7 ~$ b# }" C. F
    27 wire [31:0] wb_adr_w;1 P0 q. ~: M; |' e: C1 u
    28 wire [ 3:0] wb_sel_w;
    9 c2 e' X0 a, n% X. V1 ?) Z' Z 29 wire        wb_we_w;
    ) S% l, C& ^6 R5 j6 G! p$ U( a% p1 y 30 wire        wb_cyc_w;# f9 V' U) b, Z; \. ]
    31 wire        wb_stb_w;
    ! P3 w6 o; L% D 32 wire        wb_ack_w;
    7 Q% B+ d. W- z) ?8 x 33 wire        wb_err_w;# C( I" B2 C3 N+ m+ [* _- K3 t
    34    ' |. h1 F+ z0 ?
    35   wb_mast u_wb_mast(
    / g6 q8 H7 q% L7 v9 K 36     .clk  ( wb_clk_i ),
    ; ^( m) J7 l3 L" ?* F 37     .rst  ( wb_rst_i ),
    6 P6 X; I; f. s; D8 \! n 38    # E2 d2 x- i) U/ K* q
    39     .adr  ( wb_adr_w ),
    8 f5 S5 I, Y5 C9 u 40     .din  ( wb_din_w ),
    . \( p( b) G4 E, F' O 41     .dout ( wb_dout_w ),
    9 U; q7 a8 ?8 _7 T; C5 k$ f3 x( h 42     .cyc  ( wb_cyc_w ),, W% `+ U; ?1 `5 @# s) C
    43     .stb  ( wb_stb_w ),% H0 j" w8 `3 z" p/ `+ w9 O
    44     .sel  ( wb_sel_w ),
    # e8 g) ?, `/ |: `6 }2 I0 F 45     .we   ( wb_we_w ),
    9 @2 \! {+ z0 u1 t  i 46     .ack  ( wb_ack_w ),
    9 ^" Z( o/ `+ e- t" |. U+ @ 47     .err  ( wb_err_w ),
    + n- A- A4 G0 O6 [2 K$ G" G 48     .rty  ( wb_rty_w )" b! \1 c) Q; a9 M5 ~" l1 c) I  o" Q
    49   );7 w# n  |! _/ ~4 ]
    50 * n; B) ?; `9 j
    51 // *****************************************************************************
    : I3 Q/ F8 t. s- J 52 //  sram controller' d+ [, ~, n2 @. M) g8 f
    53 // *****************************************************************************
    % L8 Q" U) G  i4 r* K 54 / h0 z/ z$ s- v/ o; \6 e
    55 wire [15:0]   SRAM_DQ_w;    // SRAM Data bus 16 Bits
    9 S! x. H( |* S+ ?  k 56 wire [17:0] SRAM_ADDR_w;    // SRAM Address bus 18 Bits
    / Y4 Q% z" c; S7 M6 R, k: U 57 wire        SRAM_LB_N_w;    // SRAM Low-byte Data Mask5 k, z6 e4 k! K7 q7 i3 J3 D
    58 wire        SRAM_UB_N_w;    // SRAM High-byte Data Mask7 a, d. w( C0 Q6 ~. l
    59 wire        SRAM_CE_N_w;    // SRAM Chip chipselect! K% @# R7 ]  R/ P2 _/ {! z
    60 wire        SRAM_OE_N_w;    // SRAM Output chipselect
    - X7 T. K3 h1 _- S' [; ~+ A* ^ 61 wire        SRAM_WE_N_w;    // SRAM Write chipselect! |' Z2 f- ^8 @; e; v; P: j
    62 3 H8 U0 m3 O2 D6 ~% Y+ P' N
    63  sram_wrapper DUT_sram_wrapper(
    8 q! Q6 T& O) C3 v* \2 W$ \ 64     .wb_clk_i  ( wb_clk_i ),
    * J; G# ?" p2 R* Q( } 65     .wb_rst_i  ( wb_rst_i ),  M( E, X- ^( s! c6 k* X
    66   
    # b8 i4 b4 R3 H, a! U$ x+ s 67     .wb_dat_i  ( wb_dout_w ),
    - B! P5 T! n$ A% J  R 68     .wb_dat_o  ( wb_din_w )," p! Z8 p# {1 k: }
    69     .wb_adr_i  ( wb_adr_w ),
    8 T5 X( X8 ^' y( c! r" ]" R/ J 70     .wb_sel_i  ( wb_sel_w ),; D/ S, t2 b  X, F
    71     .wb_we_i   ( wb_we_w ),
    3 C4 {# K, E( c2 X% \ 72     .wb_cyc_i  ( wb_cyc_w ),/ @' X0 [; k, k1 S8 n& W! \, y6 W: m
    73     .wb_stb_i  ( wb_stb_w ),( d' k, v! Q2 N) f+ E
    74     .wb_ack_o  ( wb_ack_w ),' Q6 J/ G, k0 W& O* Q1 _1 v
    75     .wb_err_o  ( wb_err_w ),/ M& _" d% {9 Z; Z) U: X' R* m
    76 ; i& `3 p+ b, `; o
    77 // SRAM, O0 I: Z* C9 x7 p4 {0 D% A5 F% i% t
    78     .SRAM_DQ   ( SRAM_DQ_w ),3 p* ?1 u/ A, |* D" j, W
    79     .SRAM_ADDR ( SRAM_ADDR_w ),0 v, h" L0 t2 t% q7 _
    80     .SRAM_LB_N ( SRAM_LB_N_w ),
    8 }% b* a! W; ^9 L  g+ s& c 81     .SRAM_UB_N ( SRAM_UB_N_w ),& a8 K# Z- }( Q+ Y( f. L6 A7 R* n: x
    82     .SRAM_CE_N ( SRAM_CE_N_w ),
    7 p3 F, J. i3 n 83     .SRAM_OE_N ( SRAM_OE_N_w ),
    + d- C# C- |( V: e- l( S 84     .SRAM_WE_N ( SRAM_WE_N_w )5 {2 t0 s$ ]; M( D2 N) a/ j
    85 );" x9 H2 \2 u4 b) W
    86
    ' J2 E  @7 Y" x2 J4 X 87 // *****************************************************************************; g5 a" d$ E/ v0 w8 a" P
    88 //  sram model
    ) [* |  S" F- j 89 // *****************************************************************************
    / y9 f1 O4 H1 f- \: l+ k1 F 90
    ( E5 c9 m- x* l 91   IS61LV25616 u_sram_model(
    5 M. _* k6 q! U) K, Q6 v 92     .A   ( {1'b0,SRAM_ADDR_w[17:0]} ),: ?3 N# W! Z' t, U
    93     .IO  ( SRAM_DQ_w ),
    / ^: V& R  F* Y% a  @ 94     .CE_ ( SRAM_CE_N_w ),1 B  Q5 q. `+ [1 H$ p, ?
    95     .OE_ ( SRAM_OE_N_w ),
    " u9 V4 v* l4 x- l0 W 96     .WE_ ( SRAM_WE_N_w ),
    5 @4 G- W! @# [* U& R* M 97     .LB_ ( SRAM_LB_N_w ),- x, A- O/ F8 G  R$ s
    98     .UB_ ( SRAM_UB_N_w )
    , ]- W8 m9 B9 l- A 99   );6 F, d1 W' B6 @8 v0 W. B" z4 F/ I
    100
    # J/ A  G6 M* K7 O' B: @101  
    - p5 x, ^' }& F* |  h& P2 }) K) q102 initialbegin5 u0 M: V2 m( O5 q5 ~/ |
    103     wb_clk_i <=0;
    $ h8 g2 U) ~. N' J! S, W) p) h104     wb_rst_i <=0;# W/ j( y' c( B1 _, e# J$ T6 {
    105 end
    $ n4 U! W# E6 f' d. R106  
    # ?- L. e8 a' `! H- J107 always@(wb_clk_i)  begin
    7 f+ ]1 o( R! W/ _. J) `108          #10 wb_clk_i <=~wb_clk_i;  U4 h9 j- m& t9 m- n
    109 end8 @5 T* \3 |5 F9 ]0 m0 {* t4 G
    110
    0 U/ R* _2 Q0 e2 R111 reg [31:0] tmp_dat;
    8 x( w% g) G& x" E112 " |7 Y: z: N( M3 f/ z8 m
    113 reg [31:0] d0,d1,d2,d3;4 R8 b% T$ y7 M: Y$ ~
    114
    1 _/ l9 C4 j, n: j115 initialbegin
    % h  V4 W% c1 W1 Q- [. S116 repeat (1) @ (posedge wb_clk_i);. k- c0 X6 p6 p
    117       wb_rst_i <=1;
    . ?- w0 E$ c1 e/ s7 J' R* Z118 repeat (3) @ (posedge wb_clk_i);
    # f: Q9 V0 G7 u; `4 B9 q/ g119       wb_rst_i <=0;+ j4 z  |' p0 ~. {, X7 z2 F7 E
    120 //write your test here!
    + G7 u* @' H9 k" L! S4 u& P121 repeat (1) @ (posedge wb_clk_i);# a* [6 D' Z; o" ^$ B1 {
    122       u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);
    ' z0 q- v7 p1 h0 F6 Q123       u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);
    + M9 x9 ~! L+ X( \, q! P' J124       u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);
    ! \% S3 O/ b  H; ?! [125       u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);' l3 B  b- P9 r
    126       $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);" l5 J3 r9 J' d
    127 //adr,adr+4,adr+8,adr+12
    " x. F( A, e+ L8 \- }, U! j128       u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);- l# v% v/ s$ \5 E0 H' N3 z
    129       u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);
    2 M8 C6 W, m. O5 y9 ?130       $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);3 D; W7 l9 V, w2 b( c
    131     #1009 I; g, N( E/ |0 I+ U
    132       $finish;
    - u& Q, H; U/ N5 F0 J4 F- m133    " y$ M  G4 E7 X3 Z
    134 end
    , o) k8 l% t; V135  
    7 \. }$ R; m" l1 Z1 Z( K136 initial
    " b9 S7 y5 C1 o- q( z- Z* L137 begin2 @+ s6 R5 m6 b5 `
    138       $fsdbDumpfile("sram_wrapper.fsdb");0 @7 F& t" }  j' D% e( b
    139       $fsdbDumpvars;* U2 Y8 L' `0 v
    140 end$ G, U# ]" N9 K
    141 endmodule
    2 B' D! n) D+ W2 [+ ?3 N: o0 h& l8 {* q1 s; i

    " ^& q+ C2 Q1 `* s7 g/ C  l仿真结果1 j5 r& Z7 K; T4 u  |3 r& k
      n7 k8 w, P; B6 j- _  X
    # INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)5 s: C) r4 ?2 M  @% j4 T
    # # e8 ?+ t6 @$ z  F" o0 V# T( H
    #                  571 readfrom 00000000, value = ddccbbaa# ~/ g  t/ B/ d. g  \
    #
    / g7 Z  i5 K7 d: G6 ?5 X#                 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 00000004
    + g: ~8 k2 T8 X7 Z3 a#
    # o6 a% N4 N3 U  J9 A. r2 t! }2 F6 u
    9 u, l3 |. z; V0 D  c* w& q  g# e没有错误
    4 Q: w/ c, K. l/ k. P3 C; R: M" p% v
    Ø  Sram_wrapper的soc系统仿真验证
    * o1 k1 \0 R: \9 [+ {
    ) Z# A! u9 N) w1 e加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示, u3 O0 }6 ]8 B' z: l0 ]4 @0 k& z! T

    0 V3 |6 k# I1 ~0 t. ~9 _6 T 1 #include "orsocdef.h", p/ C; k3 V" l
    2 #include "board.h"; h0 ~) _! p+ ?5 r( s( k2 ^( e% B, J
    3 #include "uart.h"" n, r' N$ r& |. }- a% V1 G: t* a
    4 7 p. x# U3 w+ {% p+ v; P
    5 int& o  g2 Y) [# O/ R% S% L7 P
    6 main (void)
    . `0 M! f7 A2 [4 ~" G" [- V) K1 h. q; I 7 {5 _3 [6 y( V( N/ w' g# f0 j9 `8 B
    8 long gpio_in;* s4 I3 Z0 Z4 n' _2 B0 O# d
    9   REG32 (RGPIO_OE) =0xffffffff;  J7 Z6 [6 W/ V; Z& @! O( f1 g2 H
    10
    : G0 R" _: v, O* M  w' r11   uart_init();
    $ v6 n5 b7 w! m( N9 |( k12   1 g# }  r  C. n8 ~+ z& Y
    13   uart_print_str("2Hello World!\n");
    % A; U1 y) L  |  y/ m- B14   
    * f& P0 K" Z& h* o: V15 int i;: z6 m$ ~5 O( }& Q- E" i5 q
    16 int t0, t1;
    $ L  l) [2 `' L! D# S17   t0 =0xaabbccdd;; ^: r& _1 r: u  C* w( v
    18 for(i=0;i<10;i++){/ L+ c( i# T+ p6 W/ a+ F7 E
    19 //REG32 (RGPIO_OUT) = t0;/ m( |6 g3 }) }" @0 ~0 A* b
    20     REG32 (SRAM_BASE + i*4) = t0;) N& H) p# i) Z: s5 G
    21     t1 = REG32 (SRAM_BASE + i*4);' M, [* g" P4 ^3 M( _
    22 //REG32 (RGPIO_OUT) = t1;1 ^1 K; L" v8 B: `+ f- N; _
    23 if(t0 == t1)
    5 H; \5 C7 ?2 o, t. _# v* Z% _24       uart_print_str("correct!\n");
    1 m7 G# @+ A* u0 r25 else
    + w, [5 \! D# D% R26       uart_print_str("error!\n");( A3 `. f# j8 {! \5 H
    27     t0 = t0 -0x01010101;( R9 _" N2 D+ N" U; t
    28   }
    ( b- ?8 l" P0 I' _29   * y3 X8 ]& I& I- U9 F/ H$ g- V0 Z
    30 while(1){
    6 b6 i* f  l+ V( o31     gpio_in = REG32 (RGPIO_IN);
    % S/ B& K8 p9 x0 X32     gpio_in = gpio_in &0x0000ffff;4 I; a$ x4 n$ ^7 A# W- a
    33     REG32 (RGPIO_OUT) = gpio_in;: @+ G: @4 M! _9 Q6 r
    34   }6 |" y) P, i. C1 u' ~
    35
    7 `4 N% q: ^+ \36 return0;
    4 n. a  p2 p; q1 Y8 c! z! D37 }3 t& z/ B6 G9 q8 E  m$ M
    9 Z% M! z+ b% N

    7 [. R2 f: }% z) C6 Y- ?仿真结果, f: T/ m4 [) j4 J% k0 J
    " P: q! l$ \% T- {, j" N3 I
    # 2
    5 I+ l  X4 s$ B5 j2 s& L# H, k. r$ N) W" N5 j1 u' T
    # e
    * f% `7 U+ v( m* F( ~1 [0 w# l* q+ R3 G% ?- U; ~
    # l! `( R$ D/ s7 I+ s1 f
    # o
    , T' G% f8 @  v#  
    9 l7 P. C- ]8 A4 p/ m! N* X5 f- v# W: D' i* h% _/ p9 w0 l
    # o
    . p) z) @/ @; W2 M4 z# r9 d+ N# k) q, Z1 r' P9 f/ i! f. W
    # l/ A+ o4 U/ O/ c: a$ L; z' |
    # d
    1 m3 V% l4 @) H# !/ \' T0 X" A, @6 a1 G
    # % R- ?3 t0 w- ]  i$ V, q) O) m; v
    #
    & G5 M0 D* ^$ g! f+ S6 ?% f1 L8 t#
    7 F6 l8 G1 Q, T7 j3 ~% S' f, D# $ I) J: @7 w/ P) @8 c0 @5 T
    # c
    . e1 d) i8 _1 y* Y" a# o' c4 U; _- C. g' z1 l7 x3 F1 A
    # r. G$ o+ w+ v7 J9 D% L
    # r
    / V; x/ @+ o3 G# e
    * D* V0 r& o# V" f! k7 D# c& w* x- r1 y) s# B8 R& F
    # t
    $ u7 L6 G) c# M0 ]# !) w9 O+ g9 r/ A8 s
    … …
    8 D7 c# V. f$ h, _, K  K) `
    7 ^' v/ z# }8 O  j在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。
    $ Z5 k+ q# P6 b
    " y6 }4 E2 ~1 C/ W+ `Ø  Ssram控制器的设计与验证
    ; B: F7 [7 M8 ^$ @5 U4 _. {7 n% u* M8 `
    Ssram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。
    % L( }% u/ [4 B8 O' |
      w1 A+ b" A; `7 p8 b关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下/ V: d' E  Q# b. E% \4 b
    : c  O, ^! b/ _: ]1 N7 [+ \
    & d" L  o* P4 r$ @! n. k
      1 //----------------------------------------------------------------------------//2 Q/ o1 m( g6 `- E$ a) L
      2 // Filename       : ssram_wrapper.v                                        //
    ) Q6 |! a6 I# w. @0 S% q: k3 c& @  3 // Author         : Huailu Ren ...()                                       //
    ' F' K. d4 b: u3 l$ _  4 // Email          : hlren.pub@gmail.com                                       //$ T3 l/ }3 T' K( u) s) n& d; N1 l
      5 // Created        : 23:54 2011/5/17                                           //
    : c) F) U+ z2 ~: K# I  6 //----------------------------------------------------------------------------//
    ' W+ m* E) ^0 ], I( X  7 // Description    :                                                           //
    * d7 }5 L/ X( c  8 ////. G; S- G% Y) o2 m; _
      9 // $Id$                                                                       //. o+ p6 v# d9 ~' U0 M( z6 g
    10 //----------------------------------------------------------------------------//$ T+ @: Q, K; t7 n+ r
    11
    $ S4 C8 Z+ V. _% z. p7 k% _. K 12 module ssram_wrapper(
    5 U& y1 h/ r9 S& ?1 T6 T 13 input              clk_i,
    3 r) R& ?$ J" Y9 g9 j 14 input              rst_i,
    9 k% G, }8 L0 `' _# Q; U 15   
    . ]2 g  c+ A) d( u 16 input              wb_stb_i,
    ; @* }, N1 {0 e5 o 17 input              wb_cyc_i,. d8 @; v/ A( v, m7 A# S
    18 outputreg         wb_ack_o,/ N5 v6 K7 [& q$ T( |
    19 input      [31: 0] wb_addr_i,% u( z  k9 n* O( d0 J# V& Z& D
    20 input      [ 3: 0] wb_sel_i,5 W8 Q6 I0 g0 l5 K7 }
    21 input              wb_we_i,
    # N; Y. s/ B% \4 D$ {. B 22 input      [31: 0] wb_data_i,
    ( V: i8 M4 ]* F  K+ } 23 output     [31: 0] wb_data_o,
    / M( O9 B% c. N3 w 24 // SSRAM side6 O6 U0 N( n1 S& Z, S, O4 }
    25 inout      [31: 0] SRAM_DQ,     //  SRAM Data Bus 32 Bits, b8 Q2 D/ Z, d! ~
    26 inout      [ 3: 0] SRAM_DPA,    //  SRAM Parity Data Bus/ t" \: r+ H% I/ S
    27 // Outputs                     
    ) `4 S/ E5 B( B) T 28 output             SRAM_CLK,    //  SRAM Clock: R* S6 V7 N. d2 v) w3 Y; j
    29 output     [18: 0] SRAM_A,      //  SRAM Address bus 21 Bits- u6 v# D* [, l8 d
    30 output             SRAM_ADSC_N, //  SRAM Controller Address Status  
    3 o8 U9 a5 R! Y5 E' n( }. h  t- y 31 output             SRAM_ADSP_N, //  SRAM Processor Address Status
    # r/ e4 i+ K8 q, ~; K 32 output             SRAM_ADV_N,  //  SRAM Burst Address Advance! X6 R& T7 t& q7 I7 Q$ E, u
    33 output     [ 3: 0] SRAM_BE_N,   //  SRAM Byte Write Enable
    " }6 ?/ @) y+ h, ] 34 output             SRAM_CE1_N,  //  SRAM Chip Enable. O+ b! \* Y5 b3 t3 g3 O; D  k
    35 output             SRAM_CE2,    //  SRAM Chip Enable7 G: r4 d/ L, ]' C; ^4 c) R
    36 output             SRAM_CE3_N,  //  SRAM Chip Enable$ a. I2 p4 w& }4 L* }9 @: Z$ X# Z
    37 output             SRAM_GW_N,   //  SRAM Global Write Enable* U3 S4 T/ D3 i3 d0 j" K
    38 output             SRAM_OE_N,   //  SRAM Output Enable
    1 g4 \  [2 `, g' z 39 output             SRAM_WE_N    //  SRAM Write Enable
    2 M4 G" L  D2 J' U' |# z. k 40   );
    - @# B  {* o4 f3 [$ u 41
    $ K2 {& c. m' K& ^+ w! N% ? 42 // request signal
    . S/ R! E) R& _) w+ O 43 wire request;8 d) X, P3 x' Y) p
    44  , a8 K. D& X, R! w9 r) C, f: P8 P
    45 // request signal's rising edge
    & U# D# k% |4 L4 K) g9 W4 h0 w6 `& w 46 reg  request_delay;1 |9 I* S6 s, I
    47 wire request_rising_edge;
    % w5 e" `) G0 t 48 wire is_read, is_write;
    0 w! O7 G1 _2 B4 ] 49   M( o+ w4 `3 o4 y
    50 // ack signal  o( P6 B" ]9 ?/ p! H
    51 reg  ram_ack;: U  z8 g- }# [. S; }7 c) }/ W7 \7 a
    52  3 V9 y4 b3 n/ t- x) C% t
    53 // get request signal- A3 [; W  T+ I1 _6 G" g$ ^
    54 assign request = wb_stb_i & wb_cyc_i;
    ( A" K& a7 i; R6 A 55  
    ( K  D* I) D7 Y' P 56 // Internal Assignments
    3 G' R4 l1 F1 L. p2 ~& G/ P 57 assign is_read  = wb_stb_i & wb_cyc_i &~wb_we_i;
    & _2 e; i+ l' o7 I  t 58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;0 d3 [2 O" N4 o, y4 s6 ^! }
    59  ; w+ ^9 Y! n% F+ M! d
    60 // Output Assignments
    ( k2 s, j3 k6 I 61 assign wb_data_o      = SRAM_DQ;
    3 c, o- R) D0 t" E# \+ Q" f 62 1 ^* J+ n( h4 _+ Z4 \& |4 D
    63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;5 I" X8 Q6 ?- I$ H
    64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz;
    9 C5 {: |! e1 c7 E- A1 J 65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;
    - d" a; U) L0 S" @ 66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;
    7 J+ }, @4 B- e- n& T4 v 67 ' d4 P9 N2 U7 p# W6 f0 `
    68 assign SRAM_DPA     =4'hz;
    - V- u9 c5 J$ ?! [( v 69 ' x0 V2 |/ {6 m8 A2 R
    70 assign SRAM_CLK     = clk_i;7 y/ f* v; T- r  X
    71 assign SRAM_A       = wb_addr_i[20:2];
    9 _+ F" ]! t7 V) w2 }: Q, b9 D9 L 72 assign SRAM_ADSC_N  =~(is_write);
    0 L% m% z: D5 {* Z. r 73 assign SRAM_ADSP_N  =~(is_read);
    4 X6 I% V* }. b* t" }: e 74 assign SRAM_ADV_N   =1'b1;9 V$ J( T% {8 e
    75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);
    ) o3 \+ o9 ~  G7 T' k 76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);9 S( k, F& Q, O/ g7 M2 Z( u  Z. ^
    77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);
    6 }) t, H  l1 s% {  c 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);
    ; ?5 G  P" w) Q" v% q1 U 79 assign SRAM_CE1_N   =~request;4 ~3 ]  n& {! o
    80 assign SRAM_CE2     =1'b1;( K5 `7 J& C2 u, U  G! J
    81 assign SRAM_CE3_N   =1'b0;
    * h! ~2 x+ e* S& n8 K( h) t* } 82 assign SRAM_GW_N    =1'b1;
    ' A$ x% p( z# Z0 X- J 83 assign SRAM_OE_N    =~is_read;7 k7 r. [+ g% `# p5 o7 U
    84 assign SRAM_WE_N    =~is_write;
    ' y- j2 k/ r  |- | 85  
    $ x6 K- ~+ o- G: ?( O 86 // get the rising edge of request signal; `2 ?9 T' Z! |4 \, w3 @
    87 always @ (posedge clk_i)
    6 Q. w! \$ X" M6 i& D1 D% ^$ j! `; K 88 begin
    7 G* i! q, Z; j0 Z% o8 I$ V 89 if(rst_i ==1)
    ) V4 Q1 Y- [) p 90       request_delay <=0;
    & i# ?8 g8 E, {0 q 91 else, r: T, e2 E; n8 E
    92       request_delay <= request;
    1 S+ |) n" \% H. y& |9 @' P0 c 93 end- W; i1 D2 l5 }6 ]/ G$ z5 o: [
    94  
    & N6 I* M2 j& V 95 assign request_rising_edge = (request_delay ^ request) & request;
    , ]7 c1 t4 r0 ?3 @5 V$ T6 }0 P 96
    $ C, K% ~/ a. |/ s 97 // generate a 1 cycle acknowledgement for each request rising edge2 n% l( W; e; _" o5 _% l( u, E5 H$ E) J
    98 always @ (posedge clk_i)
    " m& v  A" U/ j3 W 99 begin  z, @' m% g0 e3 d4 B8 o; m
    100 if (rst_i ==1)
    7 k8 _4 u0 Y) B$ x( L101       ram_ack <=0;
    # H$ l; n7 u- `( _* T, ^7 X102 elseif (request_rising_edge ==1)
    $ k$ g, @! ]) F103       ram_ack <=1;
    1 q8 d' W# I3 L$ V6 j9 T104 else
    3 `9 v- ^& G1 z0 l$ T6 L" L* {105       ram_ack <=0;. o9 l. ~6 _( O: L
    106 end  _* [8 I: ?9 t+ ]+ |( l1 W5 q% c
    107 + t5 K/ Y/ d9 [) x$ v( Z
    108 // register wb_ack output, because onchip ram0 uses registered output
    ' u) r  \' u8 [* t9 v$ p3 i109 always @ (posedge clk_i)/ T* S6 ^' r+ W& c$ c
    110 begin
    + M' m( l8 R: o111 if (rst_i ==1)& M* h! ]. }5 w0 w. [" U. [5 E$ [
    112       wb_ack_o <=0;
    " ]: U/ S6 O4 ?8 T113 else' i& ?6 s' n7 r' @5 ?, c/ |- u
    114       wb_ack_o <= ram_ack;
    6 s+ Y" c2 O+ U% i) K  M2 ~7 ?115 end
    3 X4 G% v; K5 b3 h/ R116
    - P* k+ P; V. J( K& K  y117 endmodule1 t" }) D8 F$ X- d

    * g' w7 j* N* V4 |# ?; f. t0 ^  `4 i. `% y8 p
    并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
    + t) c3 y% ^! r: T
    6 f/ h0 \* P' J. D( m源码可以在这里下载
    ' ~5 U2 ~5 q2 G/ R6 S
    4 Q; @8 B7 X4 O0 I! M$ Y( w6 j稍后。。。
    8 g+ E/ D4 v( q4 g: R2 A- iTo Do4 y7 ~* N, m6 C- v, F' q0 s

    : ~! F  ]- L* m- I, ]$ ^) `用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
    6 s- J: c4 H7 D( u4 d8 t, f修改以下用所写的sram_wrapper移植到DE2-115平台上
    " _# R- j0 W2 I7 Y$ w. }To Do--关于opencore,or1200的soc平台# k. I3 l$ M5 L8 N

    / r# v$ x" g5 G7 k+ jOR1200的引导方案设计(基于硬件或者软件uart控制)
    2 b! Z( G/ h3 [; n, e. _& f移植uc/os II操作系统
    + ]" I& ?/ S7 j1 Y# O驱动起来DE2-70上的网卡
    # }$ R7 a8 Z  m) B加入jtag模块" r4 \& H7 ~! Y- I; m
    移植u-boot; Q; y6 b" I) z1 \/ \% f! A( w+ Z
    移植ucLinux
    # e7 ~* y3 E9 k" Y, @' {  G' e+ I……
  • 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 14:51 , Processed in 0.203125 second(s), 23 queries , Gzip On.

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

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

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