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

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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x

    . W( H" e' r6 G) fØ  DE2-115和DE2-70的存储器配置0 y  j* s* `( S) a  ~

    - L0 L% s+ a4 V& T$ X5 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之间反复转换。3 d  y. T! W3 c/ t5 m

    3 ~6 t9 X% O& T. p  u! o: ^+ `- CØ  Sram控制器的3中验证方案: D3 M4 l7 j0 l0 z9 Q( V

    ' P9 w* l/ H4 ]) N  v8 o本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。
    # }1 j/ b' Z) `2 z8 K. {0 l1 o+ \/ L

    1 H0 h9 k; B: [/ Q* Q
    4 m, x2 a. q" P# l5 Y$ {以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。
    ( q  N# @. t; M$ f1 X; i+ f/ C7 O
    ; O- Z2 N2 v+ j* _我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?" |/ M, M) n+ U* M6 S5 \$ n: o

    : f* i* @9 h. F( i& i1 G5 `Ø  DE2中sram控制器的时序要求. E5 I& C% N) I: z" G
    7 m9 [" t: P* D# q  ]3 z" w
    IS61LV25616的一些常用引脚的功能0 M# `3 r2 a4 j
    7 b# A. V2 a6 y" k) k
    + E* U+ s, n" v
    ! H9 M1 @9 d; m& d7 ^! N
    读和写时序按照参照datasheet中所介绍的这两种方式. o$ ~* Y7 N! ?- E0 r4 ]

    ! E- N7 P0 }# N2 A$ y
    + y/ c% g3 D# Z. K: t1 Z- B( K5 B" B
    % ~" B. U- Z, C) ]3 g
      D* H3 B4 n' H* x: d7 ?) y: S$ t/ [
    在wishbone接口中需满足途中的基本时序要求。
    2 K1 j2 T  R$ y- ~3 |! e
    / v2 j2 h7 i% D0 D. vIS61LV25616的verilog model在网络上很容易可以找到
    # @$ }7 G0 v% ?! m
    * s: m4 Q# G5 u2 Y! X: I; O: m) N# G7 u# ?7 j* a1 D1 Z
      1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.' g  T) y  q# s0 {) |" o& E
      2 // Note; 1) Please include "+define+ OEb" in running script if you want to check" F/ u/ c9 X8 \  N' g& L
      3 //          timing in the case of OE_ being set.) ~* q) \1 U4 r( w+ J/ Y5 U1 b; G
      4 //       2) Please specify access time by defining tAC_10 or tAC_12./ [/ c0 a) N7 g" t  J+ z' I/ k7 F
      5 & `# {/ Y( C% J" d
      6 `define OEb
    1 O3 ]" P2 C: Y6 P, F  7 `define tAC_10     //tAC_10 or tAC_12 defines different parameters8 @+ S& a2 a* F$ v' z$ t4 q
      8 `timescale 1ns/1ns
    ) G1 y# l+ |" i8 A2 e4 x- r! [" ^  9 2 k: M- U9 N* t1 y, x; l
    10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);* j* r" r1 o7 ~7 }! c
    11 % K8 T$ t& C. s
    12 parameter dqbits =16;, y) b  w7 j7 l5 r  p2 k
    13 parameter memdepth =262143;
    4 U: J; l. x$ Q 14 parameter addbits =19;
    ( x8 z3 d3 [: q+ w* }5 W 15 parameter Toha  =2;
    9 l4 v# i/ `1 c; `. {# X- j 16 . p; S% X- y2 N) O% l. [
    17 parameter Tsa   =2;6 x: h; _* n5 D
    18 4 V4 C* i! b. Q1 ~
    19 `ifdef tAC_10         //if "`define tAC_10 " at beginning,sentences below are compiled
    + @4 m7 T' A2 W# M7 J# q& }% G 20 parameter Taa   =10,
      x; }0 |3 j& @  v6 `$ z2 n  F 21             Thzce =3,, T2 k4 w1 [0 C. M6 V
    22           Thzwe =5;/ q# ~7 b3 z, \
    23 `endif: Z! ]( C) s# ?/ r* o( y# \
    24
    6 y' i0 u& u; k8 X 25 `ifdef tAC_12        //if "`define tAC_12 " at beginning,sentences below are compiled/ M5 }% F% J; R2 G
    26 parameter Taa   =12,
    * c; k$ \$ O2 n, C5 z3 t. l) i' c+ U% I 27           Thzce =5,
    : }: a$ k9 l0 x; r! e 28           Thzwe =6;
    5 e# |- k+ m* w+ c% q/ E 29 `endif2 G, H7 @- {( [3 A, R) K; v
    30
    . ~( N$ _4 Y3 M& F$ ? 31 input CE_, OE_, WE_, LB_, UB_;1 k# U3 I/ ]! u$ u% L6 F
    32 input [(addbits -1) : 0] A;. n, _; F  w; M
    33 inout [(dqbits -1) : 0] IO;! E* B7 u) m5 h8 o
    34  * k5 {2 Y& k. W! k5 H: f( l. ]1 U( m( T
    35 wire [(dqbits -1) : 0] dout;
    + K4 Y8 l8 o9 Z( t 36 reg  [(dqbits/2-1) : 0] bank0 [0 : memdepth]; ; q. E# y% U) D* z8 B
    37 reg  [(dqbits/2-1) : 0] bank1 [0 : memdepth];
    ) L! L9 T, a( {) s4 D9 M% P$ B& Y 38 //array to simulate SRAM& V* }2 i' }! K' }0 a7 R) E
    39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};0 r# ]  r7 }* i, r9 @% f& A- K
    40 5 M) O; Q* T( u- ?4 C  Z2 l
    41 wire r_en = WE_ & (~CE_) & (~OE_);   //WE=1,CE=OE=0 Read- R2 G' s2 [2 w# i8 U- I4 o! @
    42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write/ O: E. ]' H$ x0 J  F
    43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz;
    & |7 d: R3 q0 d 44 6 w; m2 B2 v2 e( K$ a
    45 initial
    ; K# d2 ~2 S( \; Z 46   $timeformat (-9, 0.1, " ns", 10); //show current simulation time( k' r5 H: k. Y
    47 * ?; S  x5 V; C/ g' O
    48 assign dout [(dqbits/2-1) : 0]        = LB_ ?8'bz : bank0[A];
    3 [; ~9 H% \  B, D7 W 49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];
    8 a1 N' ~3 O. X- o& l7 q4 W6 y5 v 50
    ) A8 `, ?$ i  ~  P3 L1 S. E 51 always @(A or w_en): o6 `% ~' q8 [! L1 i  X4 D
    52 begin
    5 \4 {( a3 _( H  u. X  @ 53     #Tsa    //address setup time
    ! D, ?7 s! m( n 54 if (w_en)
    / ]2 s3 h8 Y& G 55       #Thzwe- p8 [) s9 U' q& i/ Q" p5 S
    56 begin
    4 L6 g8 z- Q& m: g0 {/ k" Y7 @5 R 57  bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];: a6 j1 ]$ v" e2 l6 @9 a$ p3 B! y
    58  bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1)   : (dqbits/2)];" l7 H/ e  v% T
    59 end
    7 @! N9 y6 Y5 Y8 e, K' O 60 end
    / v0 W( Y9 q/ c4 y+ S 61  
    4 n, \) C1 o3 } 62 // Timing Check
    5 m' x( t0 ~! u6 y8 [ 63 `ifdef tAC_10# F0 l+ }7 P! A7 h% e, ]
    64 specify//sepcify delay
    3 b, u, N% [# I6 P 65 specparam0 F& R8 u) J$ f' V% {
    66       tSA   =0,
    5 P1 |, V# Y1 }1 [: ~) j 67       tAW   =8,- E1 D7 E. S! n" U. D1 X% n$ u
    68       tSCE  =8,
    " K2 @- l/ H6 l& }5 ` 69       tSD   =6,
    2 l8 F6 X5 G/ `7 M# o  I 70       tPWE2 =10,5 g7 F5 {$ Z6 E
    71       tPWE1 =8,
    / O7 v3 |# V- p# W* \ 72       tPBW  =8;
    - y( G6 u) o& r# s" W3 R" a6 A 73 `else
    : Y4 Z! |8 q8 |8 \7 V; l2 N 74 & t: l0 r) `3 m6 d7 \0 z
    75 `ifdef tAC_12
    + t( s: ]5 Q9 y3 p7 G 76 specify
    * w/ \" A' ]2 ] 77 specparam3 s! s: _) \( b' u
    78       tSA   =0,
    ; C% g, }' G- t9 \3 d) N6 c 79       tAW   =8,& D8 R3 c+ v; d
    80       tSCE  =8,+ ]. N! h6 i) T
    81       tSD   =6,
    ; z' j  B8 v! _8 x 82       tPWE2 =12," [& q5 z8 E4 f
    83       tPWE1 =8,: D; z  r9 }- _7 j- `6 d
    84       tPBW  =8;" X& S& s. Z* q# |
    85 `endif
    ' ^( N$ a5 o4 u6 v4 V1 M 86 `endif
    2 F- {, F0 S; t3 _5 g' b* _1 v) g 87 5 |% L6 ~4 _! y, P+ m9 a
    88     $setup (A, negedge CE_, tSA);
    # r( }# U6 H$ Q 89     $setup (A, posedge CE_, tAW);
    ; V# a$ t5 S1 ]/ E* l& w( b5 o. I0 @0 r$ M+ c 90     $setup (IO, posedge CE_, tSD);' e' l! i2 E" W  K
    91     $setup (A, negedge WE_, tSA);
    8 T, P+ L  f, A$ I. I 92     $setup (IO, posedge WE_, tSD);& u. X) c4 M4 T! A4 h& H
    93     $setup (A, negedge LB_, tSA);# T3 g; [3 O/ \. U# u7 p$ X
    94     $setup (A, negedge UB_, tSA);- |+ B% O7 {' b/ F* q7 o( N( k
    95
      j2 B$ x; \1 ^+ n( C 96     $width (negedge CE_, tSCE);
    - U) E# H' A+ a: {' B 97     $width (negedge LB_, tPBW);
    * {& D  O+ j$ h- a0 H" r 98     $width (negedge UB_, tPBW);
    . O3 e( J& @" j 99     `ifdef OEb% Z% T# _; ]0 A( |' ~8 k
    100     $width (negedge WE_, tPWE1);  J0 _2 y+ G8 P
    101     `else0 _4 a, b0 f5 J4 S6 Y0 h
    102     $width (negedge WE_, tPWE2);
    7 ^8 k2 p6 a; Q' F3 U103     `endif
    7 B) V6 A6 r% Z4 n104
    : d7 B+ B: s7 n2 `0 {* q105 enDSPecify
    6 @9 F, x5 V& f+ ]106
    # J  @1 \2 a" z* \1 }( h; N, M7 ]1 G107 endmodule8 F7 f# i0 k, \7 ]& q. d

    / T8 n) T; B' X; f" k5 A& D# ?
    ' I' \- c( _  Y3 Y$ `$ a; T
    : u# l6 [( |: l- S: R% f8 T  Z
    2 O& a6 @. k7 y( qØ  Sram控制器的设计8 w7 Z0 t% z) g% f/ L2 |9 @

    : u2 e  c5 D2 j6 O2 m( a9 GSram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。
    ) t& {2 ^+ l, h3 T  W5 z
    5 v# o. g: o2 W5 X+ B7 Z/ rSram_wrapper的源码
    ) H/ J# D2 i  q- J& K) |
    & F0 q( W3 H. z7 k2 o4 f6 ?% d// Author(s):2 S1 _1 c& X5 B" q+ o- l2 n' e
    // - Huailu Ren, hlren.pub@gmail.com
    4 I! @5 R3 i, T6 W- L; D//
    8 a" p+ A) A7 N/ x4 s7 G1 b  W: F' w# m  c
    // Revision 1.1  16:56 2011-4-28  hlren! S/ a, r  w& o2 d3 `* A
    // created
    1 i( k0 b) ^: X0 y, b/ P7 P//
    : ^: g+ U& {) Z: i, S+ t* T  R, ^
    // synopsys translate_off$ w# w$ A0 y/ O9 Q. R  [* d
    `include"timescale.v"
    & C5 Q8 w2 P- |) D3 M// synopsys translate_on+ ]/ {/ k# u% W+ W

    $ p8 W4 o, R0 p  w" U3 R3 Umodule sram_wrapper (
    7 U9 c) ?) J5 o; t) A6 O. i    wb_clk_i,0 W% K$ o/ \5 w6 m
        wb_rst_i,
    5 p& A' `- A' A: n: ?$ t2 `$ j; _5 e  F
        wb_dat_i,  w0 z: p3 X/ c
        //wb_dat_o,  `' T( i+ e" d( c2 H$ p9 K1 a0 e" `" J
        wb_adr_i,2 A3 b1 `" Y# l! k3 X/ U
        wb_sel_i,
    $ [2 l3 h, D3 V0 H8 z, I    wb_we_i,
    # e4 G+ |; s& Z8 x5 G# F8 H1 K    wb_cyc_i,
    7 B7 }2 U0 I$ c4 I  Q6 O+ i+ `' e    wb_stb_i,
    * F, r6 N/ k; p! A1 T! N! \( [' x" A8 ^9 e' n' Z  ?/ [0 |
    " v0 y& p9 p- q9 P( p. ^- l9 `
        // Bi-Directional5 }% ~9 r$ v; W0 c# h+ W
        SRAM_DQ,
    ; K- C+ ?9 m8 X0 }4 e4 p8 [6 A  x0 S) E6 Z5 L( f' l
        // Outputs" t) x/ ~. E" p+ |$ U
        wb_dat_o,
    % ?4 K- }& _7 ^4 t" e; m    wb_ack_o,
    8 \0 C( b, [, A$ x( S+ U    wb_err_o,/ K6 }1 Q) h$ f
       $ L  o! `$ d7 w) K% r
        SRAM_ADDR,
    % e+ F" u! k% w. Z( l; ]    SRAM_LB_N,, q1 A9 @* ^! z, p, A$ A
        SRAM_UB_N,+ m7 R9 Z2 Y. M9 `4 D/ `, c8 d  W
        SRAM_CE_N,
    9 |8 I1 m' v+ a) C5 w: j$ v9 B    SRAM_OE_N,: L/ c: R7 t3 w& T% l2 G% r% z
        SRAM_WE_N/ K7 B3 T8 K8 w, W
    );
    * W' d. E& R7 o% H" Y4 V; o# L& q2 q7 `9 U% ?; o0 g3 u
    //& l' o5 x* q' A5 y: {- n
    // clock and reset signals
    3 H+ I; y/ Q  y, }$ h' i: m//# V$ U; j. f0 ~3 O1 N
    input         wb_clk_i;
    + x9 V' Z; X; A4 I, }# p6 G. M  input         wb_rst_i;  q) j! s$ ~2 B6 Q. S; \
    //
    $ i- d" h4 g0 A9 W// WB slave i/f
    , ^! U- c& T; ?+ p: \' b//
    9 o2 P; O/ {) v& c6 cinput  [31:0] wb_dat_i;: H, K! K, n- y, J
      output [31:0] wb_dat_o;$ l: e. e9 p- v/ X5 Y% c
      input  [31:0] wb_adr_i;7 T! _. C/ m5 P: X
      input  [ 3:0] wb_sel_i;! _1 k% D. m+ u" D+ V8 l; Q* M0 x& c! @
      input         wb_we_i;
    3 Z8 T  I+ }$ e, [  input         wb_cyc_i;
    0 a/ j. w" R- c* Q* y8 M  input         wb_stb_i;
    ) F$ H: Q" ]- A1 k$ j) x6 D/ f7 O2 y  output        wb_ack_o;1 x% N6 d5 p& I
      output        wb_err_o;" c( j% H3 C0 h
    //
    " f; B5 p$ q4 }7 q8 a// SRAM port
    ' k" l; {8 G. `1 z2 p) e//
    ! C) n& n" D* ^9 {, finout  [15:0]   SRAM_DQ;    // SRAM Data bus 16 Bits
    : M8 Z) d- g7 x& Y4 soutput [17:0] SRAM_ADDR;    // SRAM Address bus 18 Bits
    # h  y7 h; N2 S; [8 koutput        SRAM_LB_N;    // SRAM Low-byte Data Mask' e6 F5 Y- b' T# u& z9 Z
    output        SRAM_UB_N;    // SRAM High-byte Data Mask  {: Q) ^. P+ Y1 O- r: T; ^( ?5 W( `
    output        SRAM_CE_N;    // SRAM Chip chipselect6 F  m. L6 K& C7 C+ |: T
    output        SRAM_OE_N;    // SRAM Output chipselect
    - H$ k9 y2 R; b9 Routput        SRAM_WE_N;    // SRAM Write chipselect, x4 a9 c' J" N+ q8 A/ P0 d1 y( @0 @
    . Q& G9 _8 E5 c! R6 |
      reg    [17:0] SRAM_ADDR;
    + T4 c4 U$ f9 h  Z  reg           SRAM_LB_N;
    : b9 @2 U" C& m# u6 l, }  reg           SRAM_UB_N;
    " U" [. G: Q& b* L! C, I  reg           SRAM_CE_N;
    8 G, o* V! a5 Z6 h0 C4 u& s( r( Z  reg           SRAM_OE_N;
    ( `3 k; m. `6 C1 M( _, z# c  reg           SRAM_WE_N;, ]: d; r9 P* _* o% R: ?
    8 ]4 Y1 ]2 F9 f& R8 k
      reg [3:0] state, state_r;
    5 k& H: h+ G& h  reg [15:0] wb_data_o_l, wb_data_o_u;
    6 s* d$ a7 f4 y9 H
    ; ?0 Z, _8 F# R0 L* S$ a6 Y; \  reg [16:0] wb_addr_i_reg;
    4 R5 T2 k" t8 r9 i/ I  reg [31:0] wb_data_i_reg;/ B- |) R6 U1 o: l4 l# u" s
      //reg [31:0] wb_data_o_reg;( P  ~7 G- t& ?( e( w+ p
    reg [ 3:0] wb_sel_i_reg;: z4 T( q" f6 o: x4 `0 O8 Q
    6 S. i2 s. v' u# q
      reg ack_we, ack_re;
    / C8 b! X. b, |0 F// *****************************************************************************8 z1 Q9 O, c" X& X7 f8 J: b
    //  FSM+ A8 r) z9 }! W) c
    // *****************************************************************************
    * J% u9 D; V! b* f- e- E5 Dlocalparam IDLE =0;3 i6 A. e, ^+ b+ o
      localparam WE0  =1;. s6 O) c3 y* v8 |8 M6 O3 z
      localparam WE1  =2;5 j0 S! G5 {/ Z7 L- [
      localparam WE2  =3;
      m( `4 n5 _1 [# t; s! B3 r7 R. c  localparam WE3  =4;; E3 [+ b6 ?! X$ g6 Y1 O$ W
      localparam RD0  =5;
    , u, u9 H- g& D# x  localparam RD1  =6;
    # b5 W( `) s4 c# m1 B. P  localparam RD2  =7;5 H' _# {! N6 S6 \. q: e
      localparam RD3  =8;
    ) O# D: G) t4 O" y; B  localparam ACK  =9;
    % B& ?  H( }: i2 d6 o5 T ' K" `) t9 W4 S8 @$ {: O) B- T
      assign SRAM_DQ =  ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0]
    : k& D5 y% p. z# }$ R$ ^* G; u6 H                    : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]0 \0 H! W) y% W7 Z
                        : 16'hzzzz);
    ( y) y3 D: L* i, |3 \assign wb_dat_o = {wb_data_o_u,wb_data_o_l};
    ' V) G. K, k# ]- |4 v/ C 0 q+ u  A2 U- D% ~& O9 e5 K1 \
      assign wb_ack_o = (state == ACK);
    ! ~0 r; Y. K4 [) n  assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);- m7 w% b" x3 T5 b" {( _/ y
    9 c0 X0 ^1 @* N1 Z
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    " v! L( h1 b9 Q    if(wb_rst_i)+ X- V, ]$ A$ g  h# {1 m
          state <= IDLE;
    * e2 Q. G- s! t* o) Z    elsebegin$ Q$ K! |1 Q# I0 ?
          case (state)
    ; U% @: p; w& `9 B+ r% l        IDLE : begin
    6 c# B! ]: Z2 L; U+ I          if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)" o% R7 N0 ]+ N' h5 U. D
                state <= WE0;# {/ h  l* q6 h5 B% i, m
              elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
    " ^1 l9 }$ C! _" d            state <= RD0;+ y% L; T5 W, Q8 G
            end
    8 s: I$ s4 y; W3 a8 ?' n        WE0 : state <= WE1;& D' h  p  V. k# `1 `- ^
            WE1 : state <= WE2;% W; l) a0 S6 T3 y8 Z/ \) |
            WE2 : state <= WE3;
    $ G' v& e" o7 @5 ^        WE3 : state <= ACK;4 L1 j* s) N  A1 P/ t# o; f
            RD0 : state <= RD1;
    9 g1 [( W; q: Z        RD1 : state <= RD2;4 m, ^5 A/ G  a$ x# q, G; k
            RD2 : state <= RD3;: {# u" ]8 K6 l- u! W% M
            RD3 : state <= ACK;
    # O" r8 C+ c+ ]7 b        ACK : state <= IDLE;% I9 T1 q* X0 U# n( k8 W# E' q
            default : state <= IDLE;: s3 X: C+ a. f9 O4 ~
          endcase. l# }0 [# J0 i4 Q
        end$ N5 X1 O' u8 Y( ]4 r5 D
      end8 w  w- x/ S. |( c

    $ K* G: v. `3 o! @% k& b( k  always @ (posedge wb_clk_i orposedge wb_rst_i) begin# j' @3 o1 c7 R# {- t
        if (wb_rst_i). H# g# V: Q% V' u# z& E6 q
          state_r <= IDLE;
    - S8 v; ?( G. C. i0 W( q! r! k    else
    & X9 v* t! @6 E/ u6 k2 C' a' _      state_r <= state;$ Q3 l( k. {0 \. `: {
      end
    ( p% B( W8 i; [( g//) z! ]1 S% S1 m
    // Write acknowledge* A, i) m; `4 \3 w4 n& T
    //
    9 W& D- b8 J2 N! }always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    # l8 Y, H: O- a" C, m2 M5 `  C7 c    if (wb_rst_i)
    + U! ^: l% _) I1 M3 C3 s      ack_we <=1'b0;+ U# n. I+ x; [% I4 X
    else
    * d" d/ @0 a' i    if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)* o6 R9 H  l3 p  ~5 O5 p. t- M
          ack_we <= #11'b1;
    - [& M  w; c0 o( R, @  ]% Jelse1 V4 [9 @& s6 W8 [, K: m, A
          ack_we <= #11'b0;
    / }* j6 k; W$ {7 u5 Send
    " F# ~, F/ o. |3 Q: x, u% Y ) m' Q6 G! I5 P- p: `: \
    //( O% w+ H! c  B  B  D9 t
    // Read acknowledge
    3 m% `/ Q  k/ A5 V, ~9 {3 M//
    0 u5 [! Q5 q  k2 Malways @ (posedge wb_clk_i orposedge wb_rst_i) begin' E# g! ?& F7 v) Q4 G" G7 H* G
        if (wb_rst_i)
    3 z0 r: b9 F7 D( S      ack_re <=1'b0;& h# c. V0 e9 b8 J3 d
    else
    + @, E' [' I" Z! ^/ \    if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)3 L( D+ Z3 U! K( x1 N
          ack_re <= #11'b1;
    1 J* e+ n9 Q: |2 delse
    6 e: @  Z) v! Y' v, t5 N! m% W' b      ack_re <= #11'b0;/ r, ~) S6 l+ ]: X
    end; p& Y: e! U7 o) c, ^
    % ^3 Q7 z0 p4 _3 b* c9 ^0 ?* y7 G/ M
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    , H7 V) |0 p  {, `    if (wb_rst_i) begin' k1 W: |6 R: o$ A' S1 p+ `
          wb_addr_i_reg <=32'b0;
    . }8 {# ?. j1 j      wb_data_i_reg <=32'b0;8 N* X7 E# [% x* E% d
          wb_sel_i_reg  <=4'b0;
    7 x7 l2 w  K3 |3 {/ A1 ~1 Cend2 ~% i5 B, b7 ]) v* t; s
        else0 l7 S0 q% I, s
        if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)& H6 o" [! e3 U' l$ b
        begin
    7 L0 q% M/ ~0 ?7 i5 U. I      wb_addr_i_reg <= wb_adr_i[18:2];
    6 e* [8 }  P; P      wb_data_i_reg <= wb_dat_i[31:0];1 ]' ^& z  B6 r
          wb_sel_i_reg  <= wb_sel_i[3:0];
    ( X  c' j7 k5 Z: J    end- [& v4 x4 A# k
      end0 W# F- w7 ^& Q

    & Z+ g6 c' l0 }1 L8 g5 C8 w3 N9 |  always @ (posedge wb_clk_i orposedge wb_rst_i) begin* F% z. P3 U/ I" V# G- Q$ Q2 D
        if (wb_rst_i) begin0 [5 F1 d7 h$ h1 H6 K4 J, I) u7 d4 R
          SRAM_ADDR <=18'b0;) k2 p0 g/ x" p/ D
    end
    : ]5 ^8 E* Q' [    else
    , R9 Y1 o, [& D0 M- Z2 [% A      case (state)4 N8 D/ ?# e1 |/ R
            WE0, WE1, RD0, RD1 :
    , n/ I+ G5 F8 R9 r5 I          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};
    4 x" y" Q9 B# K: h; b8 f* d        WE2, WE3, RD2, RD3 :  A5 _- y  |0 H4 z
              SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};
    : e( s1 W0 U- Q" w/ `default : SRAM_ADDR <=18'hz;! d# I8 z, \% h- X5 ?
    endcase3 y5 {. v$ b/ J. c& E% b
      end3 k6 K; t, ~' Y! I2 ]2 g7 L& a
      g3 p5 K+ B# q* j1 {( B
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
      b6 {% w& v/ Z4 }    if (wb_rst_i) begin/ o8 a1 \  }7 ^6 [
          SRAM_LB_N <=1'b1;! [+ E4 _) q) x. c5 I2 x. W: D9 N
    end
    ( a" R7 k+ g. i0 ]% P" Q- m" }    else+ I& h  s  ~" v3 ]
          case (state)8 Z4 d* n$ T$ A
            WE0, WE1, RD0, RD1 :
    ) C- _5 a! E. P; J- B          SRAM_LB_N <=~wb_sel_i[0];
    $ ?0 h& b, V  a( l        WE2, WE3, RD2, RD3 :' [- I5 ]5 m0 ?, f: c' X9 a
              SRAM_LB_N <=~wb_sel_i[2];
    & V& U3 A" p1 H/ [3 k" Z        default :
    + G& \2 j- O2 w/ @$ r/ H. G          SRAM_LB_N <=1'b1;
    # T2 S0 \" H4 h8 cendcase  D. E8 U( J% a6 W" u$ R, Z
      end, C" C6 u$ N7 w/ X$ U+ l5 {
    ' y" |5 B) b! I! d5 X
      always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    # d3 C; s( }5 ~' k+ `2 B( ^    if (wb_rst_i) begin, j( b/ o4 L5 R- R% q
          SRAM_UB_N <=1'b1;  t% A/ u0 f3 P- O! ~' l
    end; G2 |; ?! @# W5 K3 S- ?! Y
        else
    : ]& |7 ~" U* G- m9 J8 b$ ?! N      case (state)
    - t$ k+ M6 s8 W! c- p; i        WE0, WE1, RD0, RD1 :" ^7 U! p7 z" Q! w& {- w
              SRAM_UB_N <=~wb_sel_i[1];
    + {+ T) Z2 g1 W1 F6 V( `) Z+ Z        WE2, WE3, RD2, RD3 :
    6 u5 J8 a2 ^( h0 g' a          SRAM_UB_N <=~wb_sel_i[3];
    & Q0 H0 m6 A% Q% u& Y        default :, w' J0 V5 l9 }2 c* G3 d7 W
              SRAM_UB_N <=1'b1;6 B) E3 f  ]# I$ v7 C
    endcase
    " R' a3 D+ R0 Y# ^# F$ \9 O  end) `$ u; ]: n1 P- ~- H$ ?$ H

    9 ~+ }# C& x0 h9 r  always @ (posedge wb_clk_i orposedge wb_rst_i) begin& V/ I& p$ R8 \) J: p4 b
        if (wb_rst_i) begin9 H% h9 x) g7 G; c5 D
          SRAM_CE_N <=1'b1;  ?; K) n9 U$ z6 `+ R4 Q
    end
    . q5 V/ ?1 x4 M- l/ L    else
    , l9 R! U, J/ U6 E- {      case (state)9 ]! ?3 ~" ?5 J6 H' G) x
            WE0, WE1, RD0, RD1 :+ N1 o9 F% }0 s+ o) ^, i
              SRAM_CE_N <=1'b0;
    7 q  c0 Z9 M# I5 f  U& C! G) H4 e        WE2, WE3, RD2, RD3 :
    - a9 C+ _( }9 ?! v8 O4 b7 }          SRAM_CE_N <=1'b0;
    / [" m/ B2 ?% mdefault :
    ( @# ~$ i! H% ~4 ]          SRAM_CE_N <=1'b1;
    - O" M# {) I8 x* cendcase3 v: ~4 \! r1 N
      end8 Y; q" ?- s" U; I# [  r

    " v! Z; p( p5 l9 D" ^) b  always @ (posedge wb_clk_i orposedge wb_rst_i) begin/ }, o; P, L; c
        if (wb_rst_i) begin6 I  ^# G5 }8 {! z7 Z% @+ j' P
          SRAM_OE_N <=1'b1;  N  N. j0 a4 P5 X  c
    end
    ! g7 {) @( \: N# @    else. c, [8 n& `* u' Z% m2 H
          case (state)& d  D; Z1 f4 |
            RD0, RD1, RD2, RD3 :2 A2 q' c/ Z! D6 ^2 L3 @
              SRAM_OE_N <=1'b0;
    2 f4 f6 P; T# R; v$ Y2 T3 Zdefault :
      q6 X: W+ k: L1 R7 y; B8 T          SRAM_OE_N <=1'b1;
    " w* v  x- e1 W9 g( D7 pendcase" }6 u6 g7 a% e% q7 \
      end; q$ m# b) _9 L$ K) R0 B  k

    ' P1 ?1 `3 \1 a! t! \  always @ (posedge wb_clk_i orposedge wb_rst_i) begin, }3 v& V- K& V
        if (wb_rst_i) begin
    $ e+ P3 h4 l/ d! O: X3 |      SRAM_WE_N <=1'b1;
    . R, k9 [% ], s( X* u; jend# B% l' b+ `: W3 R) r7 s& B
        else
    ) ~/ @' k9 P/ @9 k/ H: y      case (state)+ Q" e: X# v& \& @
            WE0, WE1, WE2, WE3 :! m7 j5 D8 ?; s
              SRAM_WE_N <=1'b0;
    : D; j, |! [* h4 K* Jdefault :
    ) W" m+ R+ ~7 h4 B; D5 K/ s          SRAM_WE_N <=1'b1;# w9 @2 I. M, E5 L+ Y0 |
    endcase* [1 x3 Y; J9 \9 {8 a7 u% l; D3 L% x
      end
    ! f: h' g* h: O3 ~+ b6 i  //% @7 a, S4 S) i
      // assemble ouput data
    / y0 d+ m9 B9 n1 s# G0 k; H  //
    ) x; {% C$ e8 l* w# G2 }always @ (posedge wb_clk_i orposedge wb_rst_i) begin
    7 J# R/ W& L6 q- }$ n/ N) y$ b    if (wb_rst_i) begin
    , p6 o+ W. L  ~+ }/ m3 E      wb_data_o_l <=16'b0;% G( U& k. W- D) z
          wb_data_o_u <=16'b0;
    * e3 k; Y- ^* o9 Pend1 q6 Q  ^4 P0 ~) q; E7 C2 h
        else* J& v8 u7 B+ e- i2 M' C
          case (state_r)
      r: h! q% j8 E7 ?) S        RD0, RD1 :- k" ^6 b% l0 m! d4 E% b
              wb_data_o_l <= SRAM_DQ;- I; z% ?- Z5 z8 Y9 m1 G  `; G
            RD2, RD3 :
      c9 D& Z3 Y; p' q          wb_data_o_u <= SRAM_DQ;6 ^3 e7 m: m/ r% Q; V3 G# n
          endcase3 z: K) O+ V( Y& x
      end/ o- _" \% c: I' w
    endmodule
    9 k8 w0 V+ v7 [( c1 S8 t" L4 T
    6 W" n3 p0 F7 j* H0 h! w& T% f0 q/ I' I  o/ Y
    Ø  Sram_wrapper的wishbone BFM验证
    ' F' k# T0 A. y$ `! v# S- a/ \1 ^: q6 r5 T2 }- `
    Sram_wrapper的BFM验证的testbench代码如下:
    ( ~8 I" Q0 x: P% ?2 u2 R* Y- d3 L7 e
    0 r8 C, s5 b. w) A3 T' v
      1 // Author(s):* J1 J! x' @- l/ b7 ^
      2 // - Huailu Ren, hlren.pub@gmail.com/ d; H) y  T. j/ `/ z# Z
      3 //: O  ^3 L0 n7 `+ V0 n  w! R! v
      4
    # A  f& J% P3 B1 W" r  @( f. [  5 // Revision 1.1  17:45 2011-4-28  hlren3 Y2 @0 z) v+ j! h, S; A4 ~% b0 X) z
      6 // created
    + y, N7 J* ]4 l2 x) s5 ?; g. a  7 //  i1 {! Y' m2 i! v% O+ @1 j
      8
    * t- B# v4 g/ @: f! N- R' _  9 // synopsys translate_off
    ( G' R  N7 }+ @2 D 10 `include"timescale.v"
    , w. r) r5 D$ U  ]9 f* l( h 11 // synopsys translate_on
    ) z8 p0 _( R3 Y7 y7 P 12
    ) X: z& n& a* S0 G 13 module tb_sram_wrapper ;  s: x& [* r' n+ S: [# }  s
    14
    # R% T0 s  u/ O+ W& v) k 15 //
    9 i. e; A1 L& i' G4 F 16 // clock and reset signals* d! u7 j: o4 N0 q
    17 //. Z5 [5 y# c  b( W
    18 reg         wb_clk_i;( F6 r8 d+ Y9 }: ^
    19 reg         wb_rst_i;. z. \& y$ x; Q! D# x% I# m; @# u
    20 7 W- Z( J) _3 f  A% f
    21 // *****************************************************************************
      t, P: t& C. I: P 22 //  wishbone master bus functional model: {3 b3 }0 t& `1 a% D  \
    23 // *****************************************************************************
    + u2 g+ M/ I- G 24 , a4 |/ f3 D3 R
    25 wire [31:0] wb_din_w;
    : A) A7 J, G' V7 p  G 26 wire [31:0] wb_dout_w;1 h4 A- }& o% d1 B
    27 wire [31:0] wb_adr_w;% ?3 o3 _6 s% x
    28 wire [ 3:0] wb_sel_w;  T6 D* g: c4 h0 L
    29 wire        wb_we_w;
    9 k6 M9 Y2 @  c+ N 30 wire        wb_cyc_w;
    ) H0 `! ], \( c) g! c 31 wire        wb_stb_w;
    1 t6 C  N* p. e$ U4 o# D0 ~! A 32 wire        wb_ack_w;/ k; J& m* o5 g+ A8 ~
    33 wire        wb_err_w;+ _. y5 c! P) K8 Z* W4 d* u8 [' Q
    34    ' a% ]9 x) v) ?$ o& O
    35   wb_mast u_wb_mast(9 z  Y1 k/ b8 k8 D
    36     .clk  ( wb_clk_i ),: {( w2 i: c5 k( p& E
    37     .rst  ( wb_rst_i ),
    / W$ R! x. b! }. m1 D( W 38    4 s1 S! J3 G7 B
    39     .adr  ( wb_adr_w ),1 q$ _* }" L9 C. b4 m
    40     .din  ( wb_din_w ),
    6 x) w* k: T  z( { 41     .dout ( wb_dout_w ),. {9 X3 z2 @: \5 R9 ?: v
    42     .cyc  ( wb_cyc_w ),9 M! t6 t7 ^3 Q0 ]( ]
    43     .stb  ( wb_stb_w ),- R6 t+ {/ h  W1 m; d% S' N; C: w  J
    44     .sel  ( wb_sel_w ),
    9 ?4 S+ A8 h( `5 E 45     .we   ( wb_we_w ),' q' ^  d( [& i0 R. p$ d- S- p
    46     .ack  ( wb_ack_w ),4 g: e  M7 N6 t8 U1 }+ x$ ~: Z
    47     .err  ( wb_err_w ),, B6 z) o! z* P+ S7 O0 G; [
    48     .rty  ( wb_rty_w )
    5 j7 E5 ?3 g3 n1 y$ P' y) l( j 49   );/ ?" @3 @' R5 s: C" K: v8 d3 Y% g* ~
    50 3 z# g' Z7 x1 u0 b* z! z( [! A
    51 // *****************************************************************************9 Z* u: t& f* j- A
    52 //  sram controller1 S# Y& g7 T4 L# t( x- ], M9 a
    53 // *****************************************************************************' C; s" C1 D  M9 H: B, y
    54 / E2 F- s) M! `) g- t: s: C5 g5 d
    55 wire [15:0]   SRAM_DQ_w;    // SRAM Data bus 16 Bits4 s/ W1 K; Q% l, \: L/ J: H2 [  B
    56 wire [17:0] SRAM_ADDR_w;    // SRAM Address bus 18 Bits
    8 l. h8 A8 ^$ p2 p 57 wire        SRAM_LB_N_w;    // SRAM Low-byte Data Mask9 L+ M: l8 k2 I* i! a7 a
    58 wire        SRAM_UB_N_w;    // SRAM High-byte Data Mask
    2 ]2 O* I3 `* K3 l! `) g 59 wire        SRAM_CE_N_w;    // SRAM Chip chipselect
    - q: H7 K/ ^7 H1 U* }7 x6 O& y$ \$ _ 60 wire        SRAM_OE_N_w;    // SRAM Output chipselect
    8 i1 a' _% Y! f" K9 }- k% W 61 wire        SRAM_WE_N_w;    // SRAM Write chipselect
    1 L4 c4 R) T7 D7 X) P 62
    ) Q) A4 R2 m0 r0 P 63  sram_wrapper DUT_sram_wrapper($ m5 q! o4 y. D6 X; `( s( m% M
    64     .wb_clk_i  ( wb_clk_i ),
    7 o9 u( f7 s, X5 p( l/ l% H) t; m 65     .wb_rst_i  ( wb_rst_i ),
    % Y- J" L; O0 ]( k& c, F( z 66   
    ' V  ~) V/ p) X 67     .wb_dat_i  ( wb_dout_w ),
    8 `6 l, M. P1 o9 \+ C" q 68     .wb_dat_o  ( wb_din_w ),$ J2 ^5 `* `/ L0 ?7 y- u+ j4 F7 w6 R0 T
    69     .wb_adr_i  ( wb_adr_w ),
    3 C0 G8 F. k+ B" u' W, @- x( U 70     .wb_sel_i  ( wb_sel_w ),
    3 C% G4 d2 T4 [, ~' H( Q* i 71     .wb_we_i   ( wb_we_w ),3 g4 F$ g: w) b& y& l+ a" `
    72     .wb_cyc_i  ( wb_cyc_w ),. E; P" M3 n7 D1 j% Q1 P
    73     .wb_stb_i  ( wb_stb_w ),5 P' m4 h1 U# n+ V# E5 O  O
    74     .wb_ack_o  ( wb_ack_w ),! O# j" w& X% l- k& J" |4 d2 ~
    75     .wb_err_o  ( wb_err_w ),
    0 N; w$ U3 Z" [  p: T9 B* j$ n8 q 76 ) h2 m4 w& ~! Y  b
    77 // SRAM+ k6 O8 U$ T! Y, P3 J/ m
    78     .SRAM_DQ   ( SRAM_DQ_w ),
    + T$ }& }8 K/ U 79     .SRAM_ADDR ( SRAM_ADDR_w ),. U$ ]0 {* a# A9 ]: W8 G
    80     .SRAM_LB_N ( SRAM_LB_N_w ),$ s: n' W! K6 L3 u* A8 v7 m$ h: W
    81     .SRAM_UB_N ( SRAM_UB_N_w ),
    ) s- l+ v. c& S& y9 M, j: ?+ ] 82     .SRAM_CE_N ( SRAM_CE_N_w )," V, `: q& N. ?% z* `- f4 t# }
    83     .SRAM_OE_N ( SRAM_OE_N_w ),
    , K6 g( C1 @1 G' n9 W3 ^0 u: O) [ 84     .SRAM_WE_N ( SRAM_WE_N_w )
    * ~9 ~2 P1 h; n& m. v+ N. g' y 85 );; R/ R* l1 Q) F6 n/ e- G! D
    86 ( h7 @! V9 \0 t. a, |, A
    87 // *****************************************************************************2 u, N8 Z8 B' _4 ~' P' c
    88 //  sram model
    2 a* }; Q6 T. Y 89 // *****************************************************************************
    6 U) x5 I, T2 m) B5 |5 f 90 1 x, ?4 q0 _& I  T9 E3 p/ f$ n
    91   IS61LV25616 u_sram_model(( \* F. r) ]$ D5 I6 a$ a% l- s
    92     .A   ( {1'b0,SRAM_ADDR_w[17:0]} ),5 ?5 I4 b; b3 C, H4 o: B4 E
    93     .IO  ( SRAM_DQ_w ),$ f' u( O( f4 t! C9 N; i! Y" j
    94     .CE_ ( SRAM_CE_N_w ),
    8 C( m, I' }, G0 J6 O: h 95     .OE_ ( SRAM_OE_N_w ),3 [, s1 I, `. W" D
    96     .WE_ ( SRAM_WE_N_w ),* q. r1 q; ~& P2 k6 v) e' P: F6 K: A
    97     .LB_ ( SRAM_LB_N_w ),, M1 p& k+ c) \! \& J8 Z, {
    98     .UB_ ( SRAM_UB_N_w )
    $ o1 v+ K, @$ U3 x 99   );5 V5 N7 t. {, W) M2 T
    100 5 z  Y/ T: }9 Q) t% O7 z$ ^$ N  W
    101  
    . c2 ?- }' |9 w' V2 o/ V102 initialbegin* I5 G- j  E) V/ U1 B+ L* w
    103     wb_clk_i <=0;
    5 i5 E1 b5 E- d, B$ }104     wb_rst_i <=0;- q# i' K; `, }0 F1 r
    105 end+ L! _! F3 G1 w
    106  
    : R2 L2 T7 g. u. Q" i107 always@(wb_clk_i)  begin
    ' h, Z( _$ B; I1 P108          #10 wb_clk_i <=~wb_clk_i;, K/ L$ `1 a, J! T
    109 end6 W, `3 O) v0 c! b+ |  b/ d% `
    110 : i( ~, u* q2 j. l2 H
    111 reg [31:0] tmp_dat;4 Y8 w3 a: v& ^& f) x1 N
    112 $ Z# T# h  x7 `( D0 Z% o0 @
    113 reg [31:0] d0,d1,d2,d3;9 B2 k. M, M2 O' N) j
    114
    + `, _1 L8 f$ _115 initialbegin* ^% U# l. h4 F) R* O: K
    116 repeat (1) @ (posedge wb_clk_i);
    / R+ r* ^2 v3 z$ J4 i9 s117       wb_rst_i <=1;
    3 T8 O+ z' x) p+ r  s1 c1 @118 repeat (3) @ (posedge wb_clk_i);9 D7 z# E5 C2 }- ?
    119       wb_rst_i <=0;4 p; f9 z8 Y0 f: y
    120 //write your test here!6 p5 s8 o  m! G6 v
    121 repeat (1) @ (posedge wb_clk_i);3 B3 w- c2 W$ V
    122       u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);
    $ \  I% L* i+ u2 K( ]& h# X123       u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);
    ! d; }8 q+ x8 ?- M124       u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);% M  ]( @6 Z" C5 J* G
    125       u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);
    4 a' T) Y( K, t% ~( p+ w# ]126       $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);' y$ `3 ?" e2 j2 H: z/ Q" f1 R. {
    127 //adr,adr+4,adr+8,adr+120 |# K3 `$ _/ i4 ]* J% I+ T0 P
    128       u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);
      d2 A; X* v+ C" q, w0 F5 Q" r129       u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);* s  U; }* i* x5 }/ A. ?2 j$ p
    130       $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);% V. I% H# F) m  R  R% T
    131     #1001 \( o2 G" g+ K5 e* D
    132       $finish;4 U% C8 j9 Q: P0 o, U3 @7 C/ b' D: M
    133   
    " p2 M8 M9 o- b. P, Y; K134 end( ~6 u8 l. s* q4 \0 d
    135  
    8 C: D: I" V/ G6 L, U) \8 f, H136 initial& f. u# P! g$ R5 e( l
    137 begin4 b4 K, B3 G* n4 P. E' ?# l7 I5 \* I
    138       $fsdbDumpfile("sram_wrapper.fsdb");+ b$ v% k. `/ O& l$ \. F
    139       $fsdbDumpvars;
    4 R/ N# B: [. c; o1 ?140 end3 I# A* ^7 Z9 r! D! T( |  f8 ?
    141 endmodule
    ) a9 ?) {/ A/ F+ x9 ?/ N8 D$ L. J8 T7 f( B9 E2 ]( S2 ?
    ; `: ^$ g4 K# Q/ ^
    仿真结果
      \. ?5 o  D) p( E. a; [
    - s% k2 P0 N& g; S5 i% O. Q# INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)
    8 R6 q1 e, v, u2 U#
    3 v3 L, g# w2 i5 }  q& B& V' H#                  571 readfrom 00000000, value = ddccbbaa
    . W( H# O) {. W+ p( i! O# ; n; w/ }+ A* J7 S
    #                 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 00000004
      X0 T# _9 r3 V& A0 C$ [8 q#1 \( B0 u" s1 p- ?

    9 `% B0 A( M: Z( S没有错误
    8 [0 |: q4 _7 _1 J, R3 E( l& Q
    * u) ~! P" Y( t1 L5 ?Ø  Sram_wrapper的soc系统仿真验证# t+ H) X( B) W, W/ o
    ( @3 i- w" S+ F! f; m% ^9 Z9 s/ Z6 Q
    加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示
    * m, X$ l& s/ u5 p7 @$ b
    / e, p; \1 e1 }# h9 v0 h, h  u 1 #include "orsocdef.h"
    ; k' t/ @7 j. ?0 C1 H7 g 2 #include "board.h"
    $ K8 l7 T6 f5 ]3 Z# Z 3 #include "uart.h"
    ) g- h+ v1 N8 c: e# N# x3 s 4
    ' S. r" {8 B7 p4 A/ V 5 int0 G# b( q/ a$ A9 A
    6 main (void): a) ]7 m$ f9 M; }
    7 {: h! ~( Q; e, N* U9 I
    8 long gpio_in;. D) s3 E) b  s$ v
    9   REG32 (RGPIO_OE) =0xffffffff;5 ?0 v" F) S" P* Z9 V, W
    10
    5 a5 S: A& C& b3 U$ ~! l( d9 \, l11   uart_init();
    ! n& B4 X4 P! z* u/ ^) M12   ) ]4 @  |$ D# N+ O' ~
    13   uart_print_str("2Hello World!\n");
    / {: g% d9 Z3 v  E$ A% L14   
    : {& V. N/ ?7 _+ b  {& i3 v$ n15 int i;
    * z, S" L9 B0 D6 M5 A! \2 U16 int t0, t1;4 v. m6 K' H6 g# s% q  U% M
    17   t0 =0xaabbccdd;
    ) Z. _* L0 ~1 Z. b  @% C* z7 C, U18 for(i=0;i<10;i++){
    + @$ ^/ O) N7 P( t19 //REG32 (RGPIO_OUT) = t0;
    / @3 a4 F3 N" X5 s1 S20     REG32 (SRAM_BASE + i*4) = t0;9 F! f4 {  N: s! V2 [# V
    21     t1 = REG32 (SRAM_BASE + i*4);: ?' r/ c3 u! H3 p
    22 //REG32 (RGPIO_OUT) = t1;* |4 Z( I: V" \8 o, D: u4 h  z
    23 if(t0 == t1)
      G& D+ L0 {/ T; f- f& j24       uart_print_str("correct!\n");
    . ]6 i7 J% D  f2 i+ l25 else
    2 Q, @  A1 |1 J( _& A26       uart_print_str("error!\n");. b0 `  ^5 d" c. R- y
    27     t0 = t0 -0x01010101;3 G: e( ?1 N5 V0 p# u5 e. r
    28   }
    - R+ ~8 x$ p, C( z29   9 F/ e6 p; n3 M: y
    30 while(1){8 y7 r& D$ X& s# f" c
    31     gpio_in = REG32 (RGPIO_IN);
    / z5 ^: D/ O# B8 h1 V32     gpio_in = gpio_in &0x0000ffff;
    4 B$ M& T8 f, r  L- U33     REG32 (RGPIO_OUT) = gpio_in;
    9 H) m) n, N3 x34   }7 b7 I5 h6 \1 }' L( ?
    35 $ U8 X* S1 h# F# B. Z
    36 return0;7 d. m; T. i" X; P. l! m3 A
    37 }
    7 j# }. H/ k# D- J
    - ]9 p; T8 s! U% c) s7 d6 S5 ]% L4 c4 g1 _- I
    仿真结果$ ?0 ]; l& F6 Q0 V

    4 B9 V2 l( d7 f0 b* u- u$ i6 m* i# 2" L1 {4 ~' g5 d3 z9 Y9 v# w' r$ [
    # H
    5 t% j  e3 A1 a+ X! F$ x# e
    ' g  Y1 t, ~# t7 c8 R2 m# l
    : L; j7 d2 ?2 J) _" E! W# l
    $ M* ]  o* q; ^, P  ?( e1 s9 @# o+ ?! O' E( N- t, v( S6 ]
    #  
    & @- W; @7 E( `5 d' h/ P# W; n% A% G5 R& [! R% c; S! h
    # o
    7 _: O+ x5 w9 Y2 J( l3 `2 F# r: P. Z# |) v, `: a- I( }8 D1 Q' U
    # l
    3 W* }2 M0 o) q9 u% J# [  h# d! d  X1 J  e! E$ p- L
    # !
    6 Y+ H$ f- }+ K  c; W7 B- C& {#
    ; g# J+ d) ?* s# |: n#
      `& Z6 ]/ V, i) Q#
    + B. d' J: P. S: _& V: J, e7 F& c#
    3 E! f8 ~: T8 w* |- ?4 w# c3 \* E. n; p8 |% c  b( B9 y
    # o' h' C- W% C% O
    # r# w: P: H! h4 T
    # r" ~) _( X; N5 X9 z2 `
    # e" |4 ~8 V5 s3 B
    # c
    0 c1 Z7 ~7 }, }  P1 Z! f! ?/ q# t
    / P+ X' V( K) d# !
    / J) ?7 K: Q4 Z4 n" j… …
    9 M0 P0 p6 s( o; q. V3 a0 A7 t8 t6 D/ W$ q
    在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。* g7 r0 j5 a' |- I3 Y6 E
    0 |# i! ?0 G- l* ~6 s2 X% @
    Ø  Ssram控制器的设计与验证
    ; p" F; q8 X* l3 K5 v# W6 s* k9 S: |7 _% l8 B; S  t1 W
    Ssram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。
    ! n& i2 }. _% G; e2 I7 z( d8 \; y4 E/ x& X+ u- S
    关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下
    9 J, y. X/ z- d9 {# _- g: E( g
    8 c  G! K1 P' r: g1 [) A' V8 h# j) }" @" ~# z6 l' [* z4 q
      1 //----------------------------------------------------------------------------//
    * X& L, E" ?) G; ^1 r  g  2 // Filename       : ssram_wrapper.v                                        //) a2 j# H$ m3 u% h+ a7 D) F/ C; H" k
      3 // Author         : Huailu Ren ...()                                       //$ x& G' T1 [' m$ X& t. v
      4 // Email          : hlren.pub@gmail.com                                       //# I) s4 d3 Y2 y
      5 // Created        : 23:54 2011/5/17                                           //
    5 [  ?! }+ f' r7 U) U  6 //----------------------------------------------------------------------------//
    - m" g/ K" }! \  7 // Description    :                                                           //
    2 s, V: \# Z' }& z$ c  8 ////+ H! H  }) P7 h" z- D1 q; i: q
      9 // $Id$                                                                       //
    . P7 a0 j( Y- J( ]0 [ 10 //----------------------------------------------------------------------------//
      u+ m8 V( a% Y. ?& @7 Z0 U 11
    8 z, u. o% |. O2 D 12 module ssram_wrapper(; @( d+ j- @0 k" l% N) w
    13 input              clk_i,& \# A& r0 I+ o- E5 d' i2 O
    14 input              rst_i,0 I$ A& C) U  x% Q0 I- ]$ E+ l
    15   
    & r! X4 c7 L4 ~. o! N 16 input              wb_stb_i,
    . {) }: o3 m% @6 D' q 17 input              wb_cyc_i,
    $ _" V2 s. h3 `! r5 h, H, H 18 outputreg         wb_ack_o,
    ; Q$ W) A& v& b  W' K* ^ 19 input      [31: 0] wb_addr_i,4 Q$ u0 H; d7 T0 W7 p
    20 input      [ 3: 0] wb_sel_i,* D" O2 ?- ?  l8 n/ }
    21 input              wb_we_i,
    $ o1 I% A0 e  Q" \# t9 E 22 input      [31: 0] wb_data_i,
    4 y+ }8 X4 Q( {1 L) y4 b 23 output     [31: 0] wb_data_o,
    , `3 l! N5 n. y  _  I  c 24 // SSRAM side. k+ N2 ~* T$ k& @2 e1 a+ X
    25 inout      [31: 0] SRAM_DQ,     //  SRAM Data Bus 32 Bits
    " q, V$ d+ L$ | 26 inout      [ 3: 0] SRAM_DPA,    //  SRAM Parity Data Bus
    % c; }" \6 A& e5 |- L5 L 27 // Outputs                       ^8 `# X& `' {: R
    28 output             SRAM_CLK,    //  SRAM Clock
    9 W/ D& [+ D/ L! {$ L, {$ K 29 output     [18: 0] SRAM_A,      //  SRAM Address bus 21 Bits
    % d! ?9 y) O, D, e) R7 N- Q 30 output             SRAM_ADSC_N, //  SRAM Controller Address Status  
    1 S3 ?% d. W; k9 r 31 output             SRAM_ADSP_N, //  SRAM Processor Address Status; v; I1 _  l; D4 q% N9 |0 @
    32 output             SRAM_ADV_N,  //  SRAM Burst Address Advance
    7 E" o: ~5 U% T# C& q 33 output     [ 3: 0] SRAM_BE_N,   //  SRAM Byte Write Enable8 `0 M* }& Z( `
    34 output             SRAM_CE1_N,  //  SRAM Chip Enable; m' x" l; I- Z/ l1 c# @$ x6 `
    35 output             SRAM_CE2,    //  SRAM Chip Enable" z' ^. y* t- U2 o4 U. b! A
    36 output             SRAM_CE3_N,  //  SRAM Chip Enable  f4 e. R' J& k' H9 u
    37 output             SRAM_GW_N,   //  SRAM Global Write Enable( {/ ~1 B! w7 P+ p
    38 output             SRAM_OE_N,   //  SRAM Output Enable0 l# _7 ]5 n7 s( q; S, h
    39 output             SRAM_WE_N    //  SRAM Write Enable
    $ u: ^5 K8 `" J+ p' I% r  z 40   );
    5 _* s: Q. ]  D! v0 }3 t6 Z* _2 L 41
    2 e* X" D) c9 K! i 42 // request signal
    9 r; h& }( H- u 43 wire request;
    / U3 u- j4 k0 {5 L( W7 F 44  * o" D& O' G; l  U- k! R6 g
    45 // request signal's rising edge
    , y5 A# a  h1 B 46 reg  request_delay;! ^" U0 H8 g* m  b
    47 wire request_rising_edge;
    ' {2 M+ n2 ~/ f6 v* p( y 48 wire is_read, is_write;
    $ z/ Q7 x2 V- y; q 49
    3 ?4 s6 R( w% Z2 }0 ] 50 // ack signal+ c! G- w/ u0 c( F2 O
    51 reg  ram_ack;9 j* O, \: S8 V
    52  + i9 Q, X' \( ?7 s2 w3 {
    53 // get request signal
    ' V! y& {. \0 j2 n$ { 54 assign request = wb_stb_i & wb_cyc_i;
    / j2 w# L, |. ]* A0 v9 Y; h: Z; i8 e 55  . ~$ j- u7 W& M1 S
    56 // Internal Assignments
    / I/ J/ ?  y) f+ a5 t2 b 57 assign is_read  = wb_stb_i & wb_cyc_i &~wb_we_i;7 j  a* t" Q) o+ W- F
    58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;. V) q8 q6 s/ W
    59  0 h- B6 s( a1 d; E  r
    60 // Output Assignments+ S! Z+ K4 y% y7 Y0 I: r! h) V
    61 assign wb_data_o      = SRAM_DQ;. ], T' Q  Q2 Y- a5 c& Y! J
    62 $ n4 y! P. w/ C% n
    63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;
    ' g: v1 @4 x( K0 }* J- P: e5 P 64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz;
    % H& T2 G# J+ e$ z0 O7 C! _ 65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;
    ( }3 t  }8 ^5 `) Q/ L( _ 66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;
    ) k9 [6 V/ y* {- f0 L 67
    . p$ S3 I; g' a+ k 68 assign SRAM_DPA     =4'hz;- l$ i' y6 l2 `" P& F2 b$ D
    69 & Q% r: ?8 r* L" n; O' `& N
    70 assign SRAM_CLK     = clk_i;* e; X5 {7 k0 C8 J4 [3 _6 X' J  w
    71 assign SRAM_A       = wb_addr_i[20:2];
      L( V2 q; J: r% p1 _, ~ 72 assign SRAM_ADSC_N  =~(is_write);
    1 U/ Y" N+ }" k1 W# W! g: { 73 assign SRAM_ADSP_N  =~(is_read);
    1 b0 T! F: u$ T  v 74 assign SRAM_ADV_N   =1'b1;
    0 t6 x; W1 ~5 @  c, F* W5 r7 [. G 75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);
    % X& F0 m( \/ ?$ J 76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);1 f5 |) G! M. [) Y; L* b# Q- y
    77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);
    " r- p' x& Q+ X% }  q 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);
    $ t3 T- k% Q1 V 79 assign SRAM_CE1_N   =~request;
    $ ]/ ^5 T+ y; C6 ? 80 assign SRAM_CE2     =1'b1;
    ! N, h# Y" V  {# Q 81 assign SRAM_CE3_N   =1'b0;
    & L: K1 U' B  p 82 assign SRAM_GW_N    =1'b1;
    ' B" S% q4 X  k/ c! L( c% Q 83 assign SRAM_OE_N    =~is_read;
    : g8 n( g* i3 _. k( c/ o% G 84 assign SRAM_WE_N    =~is_write;# o" Q, E; g0 P2 ?9 n
    85  - D6 T! W/ O0 w# v
    86 // get the rising edge of request signal
    $ k$ ?0 k0 l0 r1 z- { 87 always @ (posedge clk_i)  `$ V. O7 Z! h+ b* l8 Y
    88 begin" @- C/ K1 N& U: E
    89 if(rst_i ==1)) R1 E( A& T* A  C
    90       request_delay <=0;
    & o. B7 I- G2 d, p 91 else4 ^8 B3 {& t+ G! s6 `/ l& l3 `
    92       request_delay <= request;
    0 U( S8 S3 e" T8 c7 B2 h0 D  M% d, d 93 end
    , b( ?+ V  f9 s* I: } 94  : w$ z; f& x1 r, d3 ^; p
    95 assign request_rising_edge = (request_delay ^ request) & request;# p4 y8 v( u, g0 F8 \5 G4 @) _- j8 x
    96
    ! }5 w7 [5 j! @+ L7 Y! I/ ]& v( @ 97 // generate a 1 cycle acknowledgement for each request rising edge+ c6 T+ i$ c! K+ B
    98 always @ (posedge clk_i)
    8 R- d; c) m, V7 Z/ C 99 begin' x+ K6 i8 ]1 G
    100 if (rst_i ==1)% G7 J7 W/ M2 R" @2 ]' j
    101       ram_ack <=0;( ]% d: n  e; w1 e
    102 elseif (request_rising_edge ==1)
    1 p# C# j6 s& M103       ram_ack <=1;. `& _1 l9 M+ ]4 u# R) j4 @; {, Q8 H
    104 else9 x1 {2 T& ~8 F' k! u
    105       ram_ack <=0;
    3 e3 B$ h% |8 o/ m6 e" j- w# s106 end
    , a% a# t5 ~- k0 N3 x' V, ?- X107 ' A% l3 F% P7 _. J( q2 q: _- @" ~
    108 // register wb_ack output, because onchip ram0 uses registered output
    ; v0 `9 P! W, X# X109 always @ (posedge clk_i)
    1 B. `5 r+ j* I  i7 v110 begin
    0 V# o% K3 j8 \/ m111 if (rst_i ==1)7 v  a6 [/ t" ?0 a1 M% o
    112       wb_ack_o <=0;9 J3 z: @" G& g, F
    113 else! t# t  L1 y# l8 I9 ]- M3 @
    114       wb_ack_o <= ram_ack;( A! J  ~$ u$ ]/ q% J
    115 end7 ^7 W8 w, T+ i% G) T) u3 I
    116
    " W* y  @% l4 _& w6 `# X# D117 endmodule
    % p) C9 b- `$ G" F
    6 Y% }3 |0 s* J# p
    8 y- |0 t: N2 X  }' V- z并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
    2 ]$ M9 x7 l6 v9 B: f/ J9 k0 {
    ' u' N1 N( N! n: W' L源码可以在这里下载+ c. p' k0 g5 P. b

    ) Y- _! _6 E$ v& \2 x$ p稍后。。。2 e2 U5 u" H1 v9 O8 D
    To Do
    / L! ]1 T& d& D
    & F4 o; c6 O$ A用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
    9 @' D3 Y! [/ x4 q' k8 P修改以下用所写的sram_wrapper移植到DE2-115平台上
    * @4 j3 K$ v4 x7 u' fTo Do--关于opencore,or1200的soc平台
      }. S; B; i% u" u+ L% T4 G. p1 p
    ! }) f" X1 O% s' f! x" P- [OR1200的引导方案设计(基于硬件或者软件uart控制), R' _' w' d9 O- j
    移植uc/os II操作系统% E. f& D6 i3 k
    驱动起来DE2-70上的网卡0 u. l; a4 x' F4 p8 k/ G4 B
    加入jtag模块! v8 r+ N$ I3 \" r
    移植u-boot. J6 ^% F+ Z- J' Q- ^
    移植ucLinux# q# x8 Y0 c6 \, ]
    ……
  • 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 18:50 , Processed in 0.203125 second(s), 24 queries , Gzip On.

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

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

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