EDA365电子论坛网

标题: linux学习之路_基于or1200最小sopc系统搭建(四)--(sram,ssram) [打印本页]

作者: mutougeda    时间: 2021-2-22 09:53
标题: linux学习之路_基于or1200最小sopc系统搭建(四)--(sram,ssram)

) g) V- f" w9 o. z) {2 W; YØ  DE2-115和DE2-70的存储器配置
! U$ f$ Z( k2 X9 H" s: x+ l' y+ M  S. l+ P1 e7 t: I; ^8 O9 V
DE2-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之间反复转换。
- o( j+ r7 Y6 V$ V; B+ o* o5 g5 _" J- G% i) k
Ø  Sram控制器的3中验证方案) C, |/ e: U; I* w. t& {
. a2 D4 g" [& i. {! T+ `
本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。5 L, T" `4 ]9 k* S

! o  r2 b$ V4 f$ N7 p0 h) t5 V. J# f
4 [0 N6 N( Z) b
以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。! W; |9 r0 }  k. [

2 ]7 M( s) k4 ?- f' h6 z8 D% p我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?
) M: {% L# S! Q- q: A# L0 Z: \+ J- ]1 C4 w3 i5 b$ h. h
Ø  DE2中sram控制器的时序要求) s9 [  _* y; m0 c# d

- l$ H! x  F/ f3 wIS61LV25616的一些常用引脚的功能6 ?+ l& r6 P: o, u. F# t  A
/ ~, J+ ?' q- D/ p& E
' e' J% F! f6 W3 }' ~' L! M0 y+ C
1 K7 }7 P: A* g1 H$ D+ E
读和写时序按照参照datasheet中所介绍的这两种方式
3 B% A6 n: U2 \1 d  \% X) S' d8 o0 G% \
3 Y* {& z1 k  E6 v8 u0 p

9 X2 _1 e3 O: i; o/ z1 D
& l/ j/ u. t7 v: w4 h6 o4 u9 v0 ^2 q: U# D; b3 o5 Q
在wishbone接口中需满足途中的基本时序要求。+ X; l" t) N) F* J" e, Q

4 b# n  x( D; B( M% z1 H4 f( nIS61LV25616的verilog model在网络上很容易可以找到/ H$ ^5 S' S2 \, _

+ s4 R7 c" s, t* S6 C) M5 P0 z
5 V/ y: L$ J: J+ I  1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.* ]) d& B8 F" M
  2 // Note; 1) Please include "+define+ OEb" in running script if you want to check1 g. I4 q/ L. O5 x5 \  h- S' m+ `
  3 //          timing in the case of OE_ being set.
) }8 b8 _& y: R* ~: @  4 //       2) Please specify access time by defining tAC_10 or tAC_12.
# A0 W9 s, G3 m+ |& V9 C2 [0 ^9 o# h  5
0 j4 c1 o- B6 ?  E2 T7 r  6 `define OEb3 ~$ w- T5 ?5 s  f  R  C) x& X
  7 `define tAC_10     //tAC_10 or tAC_12 defines different parameters
5 c3 j/ d" c9 |2 o' n  8 `timescale 1ns/1ns
1 O$ D, w9 P# }0 Q  9
/ g1 f! |( p, `3 R, [$ L( Z, a 10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);: S* P6 `' U7 B+ e
11 # d: ^: [7 }/ I  M. P$ S9 M; K
12 parameter dqbits =16;
6 J4 ^  F! V. l 13 parameter memdepth =262143;
2 u5 d7 k% S; j0 X" }; }( Y 14 parameter addbits =19;
5 A7 ^. o) O( g' G) U1 _) G  J2 W 15 parameter Toha  =2;
! b* ?! A4 L! D" Y: Y, ~* W( v! y! Q 16 % }7 m6 H4 f5 G1 z
17 parameter Tsa   =2;
: ~' Q7 F" f# I% J# ] 18 ) f. L/ ~6 D% I, K
19 `ifdef tAC_10         //if "`define tAC_10 " at beginning,sentences below are compiled
0 H+ y& T$ f. I* M( b& A 20 parameter Taa   =10,
) d6 `9 r3 r( r1 a  X2 | 21             Thzce =3,
2 g" P! ~4 q* J+ A 22           Thzwe =5;
5 ]9 i  j# L% \7 Q3 s 23 `endif
; [5 U4 _" D: ]2 @  S 24 ) H7 ~4 V- ?) A9 o7 Q; X
25 `ifdef tAC_12        //if "`define tAC_12 " at beginning,sentences below are compiled5 {# G) r9 W6 V6 a5 C' O$ B
26 parameter Taa   =12,; R) b# E* Z5 }: x& |
27           Thzce =5,, j) z. x. @' T6 ~
28           Thzwe =6;
$ @& t7 O. C2 S, c% [ 29 `endif
- U0 u& `  K6 B  `6 B' w* x 30
9 M+ N; Q  h) e 31 input CE_, OE_, WE_, LB_, UB_;9 _5 I$ ~! |; r: ~, W  f
32 input [(addbits -1) : 0] A;3 D+ J, E. k2 y& `
33 inout [(dqbits -1) : 0] IO;) c8 c& l3 L$ ~$ f! e1 ]& N
34  
" f4 [# O, i4 w1 @5 m 35 wire [(dqbits -1) : 0] dout;
4 E( x9 O6 b  p 36 reg  [(dqbits/2-1) : 0] bank0 [0 : memdepth];
& r6 }! r. {6 K 37 reg  [(dqbits/2-1) : 0] bank1 [0 : memdepth];
) N! N; P/ [9 x' Z  I0 R( D4 r( y5 k 38 //array to simulate SRAM
, @) \0 d0 m/ S; Z  B1 a1 i0 Q4 ? 39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};
) l* [* |/ }7 }" n1 v 40 . b/ l6 W7 j0 h2 H4 I8 i1 @
41 wire r_en = WE_ & (~CE_) & (~OE_);   //WE=1,CE=OE=0 Read
, C8 N4 E0 S. w7 A 42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write- V! y7 J. L0 C/ J! Z" G% g7 i
43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; % m3 E" ]: E7 p' C9 C
44 9 w, H1 R& i. O7 K) z( A7 x' q
45 initial
: u( w; q& H3 O* z& L 46   $timeformat (-9, 0.1, " ns", 10); //show current simulation time% m- |. f! I4 H0 ]9 r! c& O
47 1 v" J$ H7 o; o- \
48 assign dout [(dqbits/2-1) : 0]        = LB_ ?8'bz : bank0[A];
( w% t# D* m0 E# w, c6 \/ l 49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];2 [$ Q' U! P& E  H
50 4 o' i) R1 `  W: z1 p
51 always @(A or w_en)6 ?; Z$ [5 I! O& z# C
52 begin
, c. n9 p0 Z, ?# Y2 r 53     #Tsa    //address setup time" P& |) A' y) V  C4 ]  d+ z; S
54 if (w_en)0 M& a: k7 u* k
55       #Thzwe3 z+ [1 {3 o5 T2 J8 p
56 begin1 w/ U# R5 a7 F* V' I  E; [" w
57  bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];; M" g2 z) [4 z& t4 b- c2 K& r
58  bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1)   : (dqbits/2)];6 z6 i7 o$ x0 R" a4 Y
59 end
1 R- o! L1 D1 a: K# R! H) @% \ 60 end1 M% Z2 |+ O$ j6 `  m5 H
61    i" T7 o3 Z% A9 a2 C2 Q
62 // Timing Check
0 H3 ?$ S; M+ j- _) J 63 `ifdef tAC_10
) c" M& {6 _; p! m 64 specify//sepcify delay
$ m, \6 v1 d2 c4 }) i: k- R 65 specparam
3 q7 a2 G* Z" o3 C6 `5 n; i* n 66       tSA   =0,. J+ A( @6 U; X; w* g+ Y
67       tAW   =8,
8 c! z5 Q6 k& s0 T 68       tSCE  =8,
: o: z! v$ J1 t% K 69       tSD   =6,
) w0 @/ ~$ Y+ | 70       tPWE2 =10,
& d! l5 y: ?  x* }3 r  m4 b5 S 71       tPWE1 =8,
( o+ ?( W7 ?6 I& h0 v 72       tPBW  =8;
7 e! w; O3 q, S: @* H  l1 ?0 `/ |) i 73 `else
" m- w* [8 [# ?, A- E8 F 74
' g5 t( @0 }7 o+ d* i: E) _ 75 `ifdef tAC_126 d4 ?7 V+ S$ t- O& p8 X/ l
76 specify
. ^1 Y7 U$ D- S3 N7 E. [ 77 specparam
, E% X9 G- r0 a$ G% e3 E 78       tSA   =0,
2 A: k/ p0 d5 G5 f$ k. R0 C" ~ 79       tAW   =8,
: N+ i5 k6 M* a' ^/ d9 _$ O 80       tSCE  =8,7 E1 L: |$ H) U
81       tSD   =6,0 C5 X5 i! g8 l; x" T* {
82       tPWE2 =12,/ v% [4 r, t; |, U; p& H7 Y$ n
83       tPWE1 =8,( |6 \% ~  P' x/ H) @! W' g9 X+ p
84       tPBW  =8;
: x8 R+ i' g3 W 85 `endif
. I" a1 F; N" a0 ~1 U 86 `endif* b! f, r" ?  i& T$ j$ g# X
87 : k' d, |4 B5 N( i' u5 u( k
88     $setup (A, negedge CE_, tSA);
* Z  F/ S  R3 i' }; t6 Q2 c  \ 89     $setup (A, posedge CE_, tAW);
  N: y$ L' [& E, H0 g3 j+ i' g 90     $setup (IO, posedge CE_, tSD);+ I1 y5 [  V+ P9 ^
91     $setup (A, negedge WE_, tSA);
6 |/ ?2 O1 `' K 92     $setup (IO, posedge WE_, tSD);( \0 C9 s- \) v/ N: c$ I) T5 Z: \# |
93     $setup (A, negedge LB_, tSA);7 {  p4 A$ M+ A6 {2 G- S1 A
94     $setup (A, negedge UB_, tSA);
( ?: ]8 v+ J: V 95
& x3 V  m7 ]% G2 G7 L 96     $width (negedge CE_, tSCE);0 [, u+ k' {1 E  {
97     $width (negedge LB_, tPBW);0 [/ a. ]! |/ x. P
98     $width (negedge UB_, tPBW);1 _3 f2 V5 {% ]  V' f( ^
99     `ifdef OEb
+ A1 A% F% B# ?3 X5 h: B- d3 r) e100     $width (negedge WE_, tPWE1);$ m$ E* _* W+ W0 p0 I4 o
101     `else, ^; M# \5 g* G
102     $width (negedge WE_, tPWE2);
) T& ]' ^( R% p# {103     `endif6 M# @' D" Z0 B# N
104
5 d" G5 T* Z3 P5 {5 P105 endspecify
! ]; v7 Y" m  o! e, f* D( Y$ ]. `106 , l$ Q# E9 ?0 y) K$ W
107 endmodule
2 I4 m5 X0 T0 ?% o* r/ U5 t, Y( H: l* u/ z" m( {1 U+ @

9 I- @9 A1 g4 [5 R. f# I/ G
& T' S0 F9 e( Z) j- }4 j
& b7 ~) s3 [+ B+ @1 r5 c5 FØ  Sram控制器的设计
+ Q# N- ?; r( e/ z! |: I! F. Q  e" d0 C0 E& ~1 o: n& e; }
Sram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。/ q" P, ]8 M5 f7 L. x) s2 T( x5 z3 h
3 }; l0 _7 Q" H) e
Sram_wrapper的源码( A/ J3 E6 A9 h% W- l# V, ]

  A5 Y& ~* o7 |8 Y1 ~. q// Author(s):3 [. z3 Y8 b2 A6 S% D! q/ N
// - Huailu Ren, hlren.pub@gmail.com" K' [8 u) k3 e
/// W. _$ g6 w$ o5 c  g2 Q
3 ~, y7 f# V8 z
// Revision 1.1  16:56 2011-4-28  hlren/ p1 o5 C! T0 ^
// created. x9 I  E  L6 v1 y! O
//
$ @6 r9 k* p1 J/ ~3 f$ m8 ^
5 C& p6 ~$ q7 J// synopsys translate_off
5 @# V( w0 w% m' D3 k# I- H) _0 j`include"timescale.v"9 {, S& P# N# x. _! Q
// synopsys translate_on6 t4 E3 J2 L  j6 D

3 Y; W% M4 d; L+ `0 ?3 ^: Y1 x  }module sram_wrapper (
" w6 E4 k+ ^# o. I' y# {! [/ b$ m3 {    wb_clk_i," x7 R, R- r1 q  G6 f0 I1 D
    wb_rst_i,$ u& `( \. g2 P+ R) E

  E" A) f- |# q1 I7 f0 B/ T' U) k    wb_dat_i,) R# `6 V# i( I9 B9 ?- |& z4 v) a
    //wb_dat_o,8 z( F4 C' p' d+ r$ T& T
    wb_adr_i,& c2 C  p. ]/ K& D4 U( F
    wb_sel_i,
9 a* b1 _( e6 V" [' K! ~    wb_we_i,
3 e5 {7 q* I7 u# u# i$ N5 q    wb_cyc_i,
2 l% h1 _9 x3 o    wb_stb_i,3 d3 h( T" o' K6 v

5 p6 M  q" s1 H- o8 ]& x0 f7 ]0 {1 r
    // Bi-Directional8 L/ L( n% S  p' q, q
    SRAM_DQ,$ o  B3 I; d1 S2 ?( n
  z; i, K# i! x5 T# e+ Y
    // Outputs: I' J6 f6 V, K  M
    wb_dat_o,
7 q# t& n, M& \) P% c( i    wb_ack_o,. E/ x2 E  g/ X* R0 n  j+ i
    wb_err_o,
" X9 S6 a3 P. D$ z3 ^   
. b5 ^& o! g" z1 l    SRAM_ADDR,
5 H$ ?0 l2 K* X1 O3 ^    SRAM_LB_N,& `9 n$ \3 I$ p' }
    SRAM_UB_N,
# @! X3 ^9 |% m: M( X/ i) M    SRAM_CE_N,/ L# w5 ~) P6 u3 O. U: D) h3 G
    SRAM_OE_N,$ f- [9 g: e# J! B5 d* b& ^; _0 I
    SRAM_WE_N0 @. |7 y( H& a  |, g2 c5 L; s
);
  i: _  u* p" x0 Q3 L+ ]
& ^2 I8 ^: F7 d) L3 s2 @//! |0 G% @" D1 C
// clock and reset signals
; a, b5 ]# y3 R" e//& \: y: c! N7 Z  k5 v
input         wb_clk_i;% P4 A- w) U  U3 T* f! \; a; R
  input         wb_rst_i;( W) C, H3 W9 m0 j
//4 |7 u  X; J8 B) F( x% J* A
// WB slave i/f
8 I# u& k* N  M3 P' k/ m1 p//# e5 `! L8 ^8 V* _
input  [31:0] wb_dat_i;
6 h' T! ?, s) ?' K9 H6 z  output [31:0] wb_dat_o;. u4 K6 c: q0 k# F, X5 ~
  input  [31:0] wb_adr_i;% R* Y+ @3 t* r7 K* O
  input  [ 3:0] wb_sel_i;
4 c8 C" a% M( s5 L) c3 _  input         wb_we_i;
, f" {, I# V4 F8 z2 U  input         wb_cyc_i;9 }  E4 C3 ]  C4 q% p- i" T
  input         wb_stb_i;3 [; e& ]7 M+ f6 q
  output        wb_ack_o;: ^, b5 i( ~- z* B0 v1 D- k. ^
  output        wb_err_o;
' z) G6 p% d7 @0 s/ ~9 |( s6 S$ E7 i//
$ w% @) m6 I% ]// SRAM port
6 W- V9 n5 A5 H) o$ m//! T) O! [) v* A5 W2 n" B
inout  [15:0]   SRAM_DQ;    // SRAM Data bus 16 Bits
- z& D/ X& A! x8 Joutput [17:0] SRAM_ADDR;    // SRAM Address bus 18 Bits
( e  G- a# o; g4 Foutput        SRAM_LB_N;    // SRAM Low-byte Data Mask% Z4 R4 H- V9 D& I: p; P
output        SRAM_UB_N;    // SRAM High-byte Data Mask
& s$ u* [8 p# ooutput        SRAM_CE_N;    // SRAM Chip chipselect" y, S5 C3 g1 A0 Q+ ?8 M
output        SRAM_OE_N;    // SRAM Output chipselect
9 Y) h9 ~9 r; L: Uoutput        SRAM_WE_N;    // SRAM Write chipselect5 U8 S, c' {0 d& K3 M1 }
: B4 J' f/ M( C4 v# k0 Q3 v
  reg    [17:0] SRAM_ADDR;
9 Z5 p5 D' b1 t# u9 i' s# p  reg           SRAM_LB_N;
7 D* ], f, }: n' a5 E" @  reg           SRAM_UB_N;
/ t' Z5 S6 Z, c  reg           SRAM_CE_N;
5 m# J, F% G4 t9 L, f3 K& H  reg           SRAM_OE_N;1 z1 k* K. Z$ f7 f4 f# V
  reg           SRAM_WE_N;/ {! M  z0 ~! ^! L2 F
+ ]% N' I0 O* }0 g7 s
  reg [3:0] state, state_r;/ B* Q$ m* _8 O$ p) p
  reg [15:0] wb_data_o_l, wb_data_o_u;4 b* E4 }+ @. [. X' N3 ]+ Q
# [4 ^- ?/ y8 v" K
  reg [16:0] wb_addr_i_reg;
2 I7 P0 C1 u/ i; r  reg [31:0] wb_data_i_reg;: S$ c$ U  L3 I0 O
  //reg [31:0] wb_data_o_reg;3 f+ k1 F9 Z6 o4 f1 S7 S* ]
reg [ 3:0] wb_sel_i_reg;
) f; f# E' S. D4 T9 L3 N
9 }* p5 c! G, a) T  reg ack_we, ack_re;1 V7 r4 |' W/ w, Z
// *****************************************************************************
! p6 `4 ?1 g1 \+ G& C& F//  FSM) f  p! ?8 g) x% x
// *****************************************************************************
4 _: l* _: C& |# ]+ q$ mlocalparam IDLE =0;8 ?8 Q$ M7 |: ?
  localparam WE0  =1;
. e- R) ]' F/ `1 c0 g7 P* j$ i  localparam WE1  =2;5 u, H* ?0 C) _6 }
  localparam WE2  =3;
7 Z7 U( u$ c2 ~. V* S& ^3 m! U  localparam WE3  =4;8 n$ Z4 R2 j& u; i
  localparam RD0  =5;5 Y% w" s% |+ h/ ?$ w& b
  localparam RD1  =6;# x  \5 y8 ^. Q# d1 z2 {& p5 c5 c
  localparam RD2  =7;5 N0 F9 @/ U: q8 [
  localparam RD3  =8;
7 S! t9 U, V% a: `  localparam ACK  =9;
# j  L" a5 {2 U! R7 J 8 I" p; o8 Q3 H
  assign SRAM_DQ =  ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0]
( C/ S* A1 R* H  Q; e2 R/ y5 f, [: k                    : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]
# w1 q$ E. Q4 g1 r4 N) {$ {7 {) c, ?                    : 16'hzzzz);
% f; u0 Q* P! T0 |( h; B& ?2 Gassign wb_dat_o = {wb_data_o_u,wb_data_o_l};0 g% s9 F/ j- f, b4 S* ?0 u0 U
& W# j4 S( s$ P8 W& z, @
  assign wb_ack_o = (state == ACK);" b; j+ N0 c. F0 C# y
  assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);
6 ~) [/ z; ^* a$ y! {' D 6 N: l' Z$ m) _. I
  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
; E) z' d4 A& n. k, v3 G    if(wb_rst_i)" p& ]) d0 g2 F, C' R
      state <= IDLE;# [4 q  |$ z3 r
    elsebegin8 y2 t! |6 I1 K, Z' X2 o1 `# {! y: ]
      case (state)( L$ H4 ]* c; y( J. E  x$ k4 Y1 r
        IDLE : begin; f4 M. R$ v. i' y7 X4 f  h9 N
          if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)
6 x0 q0 G$ b+ q3 c/ j            state <= WE0;/ T5 j6 c' m6 c+ j
          elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)/ o3 J* t9 C" l
            state <= RD0;5 r; I& ?( ?) ~8 ?1 T
        end. {/ u# l$ U' m4 }
        WE0 : state <= WE1;3 U, @& E8 J0 g
        WE1 : state <= WE2;
: R) J8 ^2 k4 d6 m) N- o8 @        WE2 : state <= WE3;( ^1 j: K% d- ?2 y0 _5 q* {" ~
        WE3 : state <= ACK;  B0 F) ~" v9 L0 \9 f
        RD0 : state <= RD1;/ E+ L5 K4 k4 V/ ?* Y- z5 _1 k3 \
        RD1 : state <= RD2;8 j3 s  W5 e! Q# N
        RD2 : state <= RD3;
. {" w' w! v9 u5 L9 M8 K, B        RD3 : state <= ACK;# Q5 l; p  C# i/ x2 U! a# T9 ?+ D
        ACK : state <= IDLE;9 ~6 q% n9 Q% w7 I# E2 {2 L
        default : state <= IDLE;% J8 A4 {- C5 O5 @# @. q
      endcase( u, O( M! ?( \6 |) a. F8 g  ~& {
    end
/ t" z0 K, P! j$ u  F  end; _8 |, L6 W2 x, ^9 {" V2 ^
! F- {; o& I$ u8 L4 k- J
  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
% H1 H( l5 N# L2 ]. W6 j0 m0 I    if (wb_rst_i)
; h' ]; p3 L! Z) g# }+ t, u; L      state_r <= IDLE;6 L' k) g1 g& F' T5 z; T5 S% x: ]$ V
    else$ p8 c/ P8 M% {, H7 q1 \( \
      state_r <= state;1 o: s+ Q4 A; t3 z# y2 ]
  end
; z1 H+ L7 T  ]0 D6 A//$ ^) k7 H1 a& Z3 S$ ]
// Write acknowledge
: W3 G* n+ D0 K' S//
. l& ?" ?$ d" w+ O5 d7 K2 Zalways @ (posedge wb_clk_i orposedge wb_rst_i) begin
/ Q' q. B7 T" v6 _0 U    if (wb_rst_i)5 W  m/ Q1 @5 I* D( \6 c
      ack_we <=1'b0;
6 X. L* u  E! `8 l6 celse7 U. N- {6 H4 t6 k
    if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we). j4 r9 d. X* |# ~6 `0 ~6 ]
      ack_we <= #11'b1;% g6 F9 d0 }# R4 I  c5 i% q! y6 ?
else/ V% [2 A$ G: K6 \& G
      ack_we <= #11'b0;
1 {9 ]  U+ [* b! _end1 _; _9 u1 l$ q

3 k( V1 Q$ K! A1 A. ^1 |$ C$ f//
6 E1 d% s% u' F4 V  P5 {& A// Read acknowledge
3 y* g3 K6 D* U5 q% a/ G3 f//
; c3 L) R$ l! a3 p+ e* |always @ (posedge wb_clk_i orposedge wb_rst_i) begin
) c$ L& n3 }7 U, b1 h, b    if (wb_rst_i)
. w* V4 x0 ~5 o3 u* C8 b) n* a      ack_re <=1'b0;
( {0 o8 r" ~% p' j, ~8 Aelse
* _8 n- }# Y- q8 h2 x+ b* B    if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)& [8 K. z& s& u8 O- u- h
      ack_re <= #11'b1;& N' R9 P8 N% g& K4 @! x6 t
else
9 j7 A0 n) m9 b- a9 m      ack_re <= #11'b0;
3 B9 P* c* k# j) O! _! M6 @$ Zend9 K# b; b! N/ ?+ X' Y
0 [4 R9 n! C0 b8 B; W6 I. u% K' ~
  always @ (posedge wb_clk_i orposedge wb_rst_i) begin2 |* C5 W' H1 x; U. L. e( i) x1 \
    if (wb_rst_i) begin* g* t8 c( y7 U; e! V
      wb_addr_i_reg <=32'b0;4 H% H3 L2 `+ C" c
      wb_data_i_reg <=32'b0;
8 w* o7 m$ H. A      wb_sel_i_reg  <=4'b0;
& l+ U" w8 h8 K6 _) o" Xend% [3 C/ R, r/ X& [" J
    else  y5 Z7 q) U, R% j7 u
    if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)
0 K" ~( m- c% n* q( H6 @    begin
5 m; O! P. g% L3 ~$ M0 @# N6 f      wb_addr_i_reg <= wb_adr_i[18:2];
  h# u- U2 X0 f5 K7 c      wb_data_i_reg <= wb_dat_i[31:0];
5 d  f: ~% N7 W0 f8 _      wb_sel_i_reg  <= wb_sel_i[3:0];
. k+ b. }: J: d- E    end) m; E0 \2 W: R% Q- e) H% g
  end3 O4 j% b% k* v/ T! j' R

: h8 M3 \0 H0 q! w1 X  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
. E2 V' [5 n! \" ~    if (wb_rst_i) begin
, o% B1 {- E$ Y4 e8 R0 u( c      SRAM_ADDR <=18'b0;
( n0 B! Z4 c; k, nend
1 {1 i& t7 I" y    else
  ]  S2 b+ X* J) l7 c& E! r      case (state)
$ w# s( C2 d) t' }        WE0, WE1, RD0, RD1 :% I0 P2 w9 f9 a( B9 b
          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};
* n3 q  D9 t6 h2 M        WE2, WE3, RD2, RD3 :
: ?; z3 b5 x; E/ x          SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};' Q! b5 g3 l9 A5 S) z+ n
default : SRAM_ADDR <=18'hz;  t8 n2 r/ d. V! Y
endcase
0 M/ Y" V" I6 t. i  end
$ A/ j! V  [( b& F# B( Y   @; w& u$ P( E8 p* ]0 G
  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
. ?) C+ ^6 j( m' Y5 e  L3 d    if (wb_rst_i) begin
( k' M5 ~  M# _/ a4 E" ]      SRAM_LB_N <=1'b1;! |0 _3 o! I, b1 z) L& q0 f
end* B7 P% P+ Z+ x; A( Q+ x
    else' F4 X7 K5 _  C. e& p% g
      case (state)
/ s- f" @9 t0 q: U  s8 A$ v* r        WE0, WE1, RD0, RD1 :1 Z: `, S8 b4 {, A, f* Y
          SRAM_LB_N <=~wb_sel_i[0];
# d3 M' E1 L& P' I        WE2, WE3, RD2, RD3 :
. K# \; S% i/ [, K: E6 a/ B. Z          SRAM_LB_N <=~wb_sel_i[2];7 @1 k1 S: }. Z) p( Z) T
        default :
" [$ F: p: _" ]- @          SRAM_LB_N <=1'b1;
- a* k( c, q4 [3 ~* Sendcase
$ }7 O7 H( `1 y2 L) Z  end
% i& V6 m0 C6 b$ X; y( @ $ [7 Y( T  _& Y( D- u. e
  always @ (posedge wb_clk_i orposedge wb_rst_i) begin' P& J- @% V: d4 c& y, B! Y
    if (wb_rst_i) begin
9 u, T) o# h0 n      SRAM_UB_N <=1'b1;( D3 h0 |5 e3 P. B( u
end
, Z) x7 L  M) ?0 C6 \    else5 m" `/ O3 b' n7 p$ D6 f
      case (state)
8 q2 {$ Y7 U$ y% t- W( d9 j        WE0, WE1, RD0, RD1 :; X; p# j9 y9 d9 [* J5 x3 q, a# w* y' i# w
          SRAM_UB_N <=~wb_sel_i[1];/ V' L4 y; V" W9 s5 Y" H$ Z
        WE2, WE3, RD2, RD3 :& O( R$ z, c" X9 x- |1 M
          SRAM_UB_N <=~wb_sel_i[3];
% ^. i' x5 x% o( Z6 v        default :0 V; h6 e* M+ d, l8 B  G9 L
          SRAM_UB_N <=1'b1;" f. N1 L4 h' V- W
endcase0 z( R4 d! W8 m& B5 @
  end
! ~7 @7 z, S2 t/ g / ^( `2 _8 o6 t3 U
  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
0 \( ^0 l8 z8 v. e, G" ]    if (wb_rst_i) begin/ M# n& Z" e) a) D) }
      SRAM_CE_N <=1'b1;9 G6 T0 g8 S5 z) ~( S- V( d! J
end7 S' n: `) U- _7 Y5 Q- X
    else* d6 h" S: n8 O1 R
      case (state)
" b, j, K2 W! h6 A        WE0, WE1, RD0, RD1 :1 g/ w2 O; c" c6 ]+ k
          SRAM_CE_N <=1'b0;- h4 Q& C  E2 R0 z
        WE2, WE3, RD2, RD3 :1 |; z) ]& U6 ]. e
          SRAM_CE_N <=1'b0;( c4 W& _$ j  W
default :
% T" d- b/ z( r" a: n          SRAM_CE_N <=1'b1;9 h- U" T4 r2 W( O* z
endcase% ]2 d7 P$ |5 D9 h  b* G
  end9 h% x- m3 l- T8 E5 K8 s' Q
: ]# z1 i- Z/ ?0 K. K3 Y% U1 i
  always @ (posedge wb_clk_i orposedge wb_rst_i) begin
# T7 e/ v5 w; M. K: n: E    if (wb_rst_i) begin
- A. T. ^6 i& r% Y8 n, u4 F      SRAM_OE_N <=1'b1;; }$ e- v3 t* e9 x4 H' g8 t! N
end1 M9 h7 R6 o- m8 g+ F
    else! f6 L/ N; C( l4 r$ W' }
      case (state)
, j$ H6 S7 j2 g& T; J$ B8 C/ R        RD0, RD1, RD2, RD3 :( p) F/ T! }+ i
          SRAM_OE_N <=1'b0;/ a, o, n# \" c0 _/ [, ]
default :
- W" b6 \0 Y4 c- D2 Y1 w. L' t) ^          SRAM_OE_N <=1'b1;
& [% k, z: j) A& p" jendcase5 _  |  h2 Q$ q* [# r# U. |6 L2 v
  end
/ r; A2 g. j1 c+ a8 b1 A # f$ I4 Z! p, x
  always @ (posedge wb_clk_i orposedge wb_rst_i) begin. B9 _( v9 ^9 ?5 ], A
    if (wb_rst_i) begin
& `5 E3 V+ I7 E7 E3 [$ R      SRAM_WE_N <=1'b1;
& P/ \5 V0 _) ^: lend
! a1 H( I4 b) b' b, G& v- B    else
6 H5 _: j: g! V, |- H  L      case (state)
, k2 K) [% a/ x1 q8 ^        WE0, WE1, WE2, WE3 :
$ b9 d- m  _. G! m          SRAM_WE_N <=1'b0;
% B* F! B" ?% o/ C1 i3 H- tdefault :1 b/ @2 f! o4 K
          SRAM_WE_N <=1'b1;
8 ^6 Q6 ~+ O& w5 L% n" Wendcase' D! C- V% z$ p# O0 |, l0 Y2 K2 `
  end
- o5 w7 t$ u5 b* }1 S  //
- c; h/ Z" ^3 q) z6 u  // assemble ouput data
4 z0 x% Y0 d  Q2 y# i  //5 t, R6 ~' l% e' S0 v" v/ `1 G
always @ (posedge wb_clk_i orposedge wb_rst_i) begin
# _1 J! G9 L  F" ~    if (wb_rst_i) begin7 U- J" G& Q" ^9 V/ D. k! ?' N
      wb_data_o_l <=16'b0;+ c* m  P7 Q& l4 e
      wb_data_o_u <=16'b0;
; I/ D! m3 \* t* ~0 q9 [end6 q$ Z2 @( K; Z3 V/ ]  ?
    else3 q( k7 S* W* L1 i2 s
      case (state_r)6 X/ a! g$ G% m
        RD0, RD1 :! r4 T' {& U& J3 Y6 x- x
          wb_data_o_l <= SRAM_DQ;
% T6 o( d# {$ n0 J& W9 j$ Y        RD2, RD3 :5 \+ S# [) v  r! U+ D
          wb_data_o_u <= SRAM_DQ;- E, J# C2 P: K
      endcase
: d5 Y! _/ s& A) Y  Y# M' C% H  k/ L1 {  end
+ d& h  u1 z% P, \/ [" S) H- Xendmodule$ W  x1 z; z( t

) i$ \! S9 |3 P% z+ M- j/ w- S0 F. W1 z2 e3 b
Ø  Sram_wrapper的wishbone BFM验证0 o& I% \& z* @
3 h$ e7 |1 t% A5 r: ?8 T
Sram_wrapper的BFM验证的testbench代码如下:
) @. Y* j  [- Q- d5 V8 ]
5 X# o; L. i7 A% g6 x: e0 d0 I; b& t" e: }# f+ R
  1 // Author(s):+ A  }" _; ]) K' @; D7 H0 N
  2 // - Huailu Ren, hlren.pub@gmail.com
, q# L% y3 S+ U7 E& V7 h- R  3 //
4 q! P. m! g! X/ _1 E% ]  4 - o2 p7 n9 W" b2 X" Y, |8 w
  5 // Revision 1.1  17:45 2011-4-28  hlren& F: z) ~- H9 R+ R. v; }
  6 // created
8 T% H: f) T1 P$ v  7 //
+ R8 e- p+ y4 Y( K: W1 O& Y9 j  8
+ z+ D  h: G" w% {; ^2 ?! N3 O  9 // synopsys translate_off5 v* p1 s1 d: D4 \1 p
10 `include"timescale.v"
* B9 h9 l' x% b5 h 11 // synopsys translate_on& {6 D" ]: ]+ c- h, g
12
0 S' O, s5 [( j' E7 w0 ^, n; W 13 module tb_sram_wrapper ;
( S. n# |6 [, l; b* r* ~ 14 % v" A# _+ Z- V. F
15 //
6 t" r8 {; K3 P% ] 16 // clock and reset signals% f; P' N- B/ |
17 //7 s$ H* x9 j# M* L6 @: T
18 reg         wb_clk_i;
& v( j( {$ V1 C5 z# w4 ? 19 reg         wb_rst_i;  z0 v8 D3 K) E5 e7 L
20 ! c/ w1 d( @" L  X& g
21 // *****************************************************************************! Q# b2 K; ?- M4 w2 m
22 //  wishbone master bus functional model
2 m; ^) \3 t# \1 X 23 // *****************************************************************************& [- a* g) k1 R
24
; n0 Y# F( l# P9 s 25 wire [31:0] wb_din_w;
7 j) c8 E5 S, i8 Q8 b" ?4 f 26 wire [31:0] wb_dout_w;
' }1 c- R3 h  F, p2 \5 F0 Y9 ?! p& z 27 wire [31:0] wb_adr_w;- `% K5 p( O4 o) [/ t0 e& P+ f" A
28 wire [ 3:0] wb_sel_w;
2 i- n  t% `) S* @5 }: b 29 wire        wb_we_w;. N, X1 R( M* V- X/ O" }% f; U9 }
30 wire        wb_cyc_w;" E. t) s/ B# w. P# Y$ O+ o- h, {
31 wire        wb_stb_w;
# K% R6 V* d9 I* W  t5 J 32 wire        wb_ack_w;
5 O1 l$ ^/ |6 {' f  | 33 wire        wb_err_w;
' A- h+ _* i8 R4 \( m$ G' h 34    + R' b! I* K8 G* a
35   wb_mast u_wb_mast(
2 J, I6 r: C+ V! m6 Q 36     .clk  ( wb_clk_i ),
$ W) S4 W+ n! T% _# u+ _ 37     .rst  ( wb_rst_i ),
4 Y# ?$ C" z* t) N8 x 38    & A7 y) T: P6 x
39     .adr  ( wb_adr_w ),# f* ^2 J' N3 i- B& O4 h
40     .din  ( wb_din_w ),+ A1 @7 t$ q$ w; }" q
41     .dout ( wb_dout_w ),! N9 D1 f% [) ?' M, N$ ?
42     .cyc  ( wb_cyc_w ),
4 T3 A8 _, y7 m& T$ s 43     .stb  ( wb_stb_w ),
& U; z6 W% M9 W) Z7 t7 j$ u 44     .sel  ( wb_sel_w ),% g/ E5 [4 ~3 p- o; w* O* ^( m
45     .we   ( wb_we_w ),
/ }) |! ?6 `; m 46     .ack  ( wb_ack_w ),
; b  f/ V( _1 Q8 s% Q( L; W 47     .err  ( wb_err_w ),
# |4 Y. R# R; Z0 O* w 48     .rty  ( wb_rty_w )
# D$ s1 _5 J$ K' X/ c  r; x 49   );' w5 |8 }8 J, U/ j' f
50
# x. \, ?& ]4 a! Y6 {$ h2 N( ] 51 // *****************************************************************************
- j8 E, L8 H8 _( F 52 //  sram controller& {" i" Y6 B0 P/ S7 O0 z1 D
53 // *****************************************************************************  W5 r5 Z0 ?# W# g* s4 r" k8 L1 u
54
# D0 c* l6 s2 b 55 wire [15:0]   SRAM_DQ_w;    // SRAM Data bus 16 Bits
( @8 q8 o& y/ V7 u' n0 F3 A 56 wire [17:0] SRAM_ADDR_w;    // SRAM Address bus 18 Bits5 s# x4 _5 S; y* ]
57 wire        SRAM_LB_N_w;    // SRAM Low-byte Data Mask; D+ e7 u- r# j& E
58 wire        SRAM_UB_N_w;    // SRAM High-byte Data Mask9 K% p0 ?! j" \$ C. C6 l
59 wire        SRAM_CE_N_w;    // SRAM Chip chipselect" N$ i9 V& d* k; }1 R
60 wire        SRAM_OE_N_w;    // SRAM Output chipselect
) Q* h* U& I; c$ o7 {+ r& ] 61 wire        SRAM_WE_N_w;    // SRAM Write chipselect- T* r4 c- I3 W+ ]7 _
62
, j3 R7 {3 v/ t. v 63  sram_wrapper DUT_sram_wrapper(* j% M  r# c3 z
64     .wb_clk_i  ( wb_clk_i ),. U/ W8 {8 {0 z1 A$ w- `: u
65     .wb_rst_i  ( wb_rst_i ),
: d. |  j% s+ c% p9 Y% t) R 66    9 y2 p+ N4 s& W" ?
67     .wb_dat_i  ( wb_dout_w ),
; [; Y; K" u! L8 | 68     .wb_dat_o  ( wb_din_w ),& R/ Q' j2 A% S* o2 ~* ~7 ^
69     .wb_adr_i  ( wb_adr_w ),
+ }& ~9 r/ P/ }: O% p& e' L 70     .wb_sel_i  ( wb_sel_w ),8 s, ?3 F+ ]0 j2 u
71     .wb_we_i   ( wb_we_w ),
9 S# B# j- q6 C$ O' O$ t 72     .wb_cyc_i  ( wb_cyc_w ),, `4 s9 v& _0 [4 Y6 ?
73     .wb_stb_i  ( wb_stb_w ),
- G( H2 V% ?8 U; _ 74     .wb_ack_o  ( wb_ack_w ),) R/ Y- u. I6 b# q/ f2 X
75     .wb_err_o  ( wb_err_w ),
. j, R- q4 R5 ?+ d 76 * u* {" U- v* _$ @/ o' j
77 // SRAM7 f. I6 {: v6 |: G6 Y
78     .SRAM_DQ   ( SRAM_DQ_w ),
6 S0 Z: R* y9 Y# _' \* X 79     .SRAM_ADDR ( SRAM_ADDR_w ),! \0 b# x* n; v8 `' e# K% D
80     .SRAM_LB_N ( SRAM_LB_N_w ),- B) c- c8 O( v4 ~, Q; t
81     .SRAM_UB_N ( SRAM_UB_N_w ),
6 P; J3 g" i* q0 ]( e 82     .SRAM_CE_N ( SRAM_CE_N_w ),* G% g. q( H4 a* u6 S( \6 a
83     .SRAM_OE_N ( SRAM_OE_N_w ),
# r% u# X- V0 D! Q$ C* H 84     .SRAM_WE_N ( SRAM_WE_N_w )+ {" k! T  r( D
85 );
# G& Z4 f. M. o7 g) X3 Q! p) F7 _ 86
/ |* j& O* X' m) h" b3 C9 r3 w 87 // *****************************************************************************
$ @# |! K4 D; a$ B. y 88 //  sram model' I, R6 i: u0 M% P
89 // *****************************************************************************
/ T8 l( |2 c) `8 T5 u0 | 90 ( x$ C  x/ [9 Q5 C
91   IS61LV25616 u_sram_model(
7 o/ B: _# @. B" p% P 92     .A   ( {1'b0,SRAM_ADDR_w[17:0]} ),3 x$ V+ L* [! V1 y# U# K3 b
93     .IO  ( SRAM_DQ_w ),( [( N9 H! b+ g+ W
94     .CE_ ( SRAM_CE_N_w ),1 W( H' ~3 W* \% W
95     .OE_ ( SRAM_OE_N_w ),4 S# Z! l9 U1 u6 K  R1 S
96     .WE_ ( SRAM_WE_N_w ),
- S1 j1 \: K& e5 l5 I* i 97     .LB_ ( SRAM_LB_N_w ),
% U" o6 T5 q( q7 U7 X 98     .UB_ ( SRAM_UB_N_w )& I0 s" g6 Z) v+ L, w- A; H
99   );
' f/ t' r$ T' a2 H( D$ I$ \1 K' B100
  x* k+ b; q) s8 u6 ^3 }- k0 Q$ D3 G101  5 a5 p2 Z/ y" Z+ o+ e2 _
102 initialbegin9 q9 D# n' M# N- V$ K, b
103     wb_clk_i <=0;: [5 k% v5 [8 n# s5 N  z4 o
104     wb_rst_i <=0;1 F; @! o! C& e! ^7 |
105 end
& F3 B1 u- k8 x) ~$ H106  * ?( Q  X+ [! ]( I
107 always@(wb_clk_i)  begin
* p, d3 j' @7 }8 S108          #10 wb_clk_i <=~wb_clk_i;+ _# m9 G: y; {) N$ _
109 end
3 c. w3 Q! b; `. E5 Q110
9 u$ F8 M% }( |, ~( ]# i111 reg [31:0] tmp_dat;+ R" n0 v. I0 r9 K& A, ~* k
112
1 B0 C1 ~  Z& \, X4 i/ O113 reg [31:0] d0,d1,d2,d3;
% M# v) N9 B4 v* v5 `. [; J' R/ ]114 * S+ A! g: n/ b  }
115 initialbegin
  M. u$ t, V; ~8 |* m4 v! j; N116 repeat (1) @ (posedge wb_clk_i);
4 ]/ d; \  F2 E) y1 I. A117       wb_rst_i <=1;
  P( N" [2 _2 n5 P+ h  ^; {$ b118 repeat (3) @ (posedge wb_clk_i);
  n9 ^: C# M, P' x+ X119       wb_rst_i <=0;* f& g3 @; x% r6 g$ b! E1 U/ Z7 C
120 //write your test here!
: E  Q! D1 y# b2 E121 repeat (1) @ (posedge wb_clk_i);
7 e+ k7 D6 H" }7 b122       u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);0 e" A/ U+ N0 \" j' k, x3 T
123       u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);/ g8 m5 v& m; K. v0 ]
124       u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);1 C6 V  o5 x" w3 x* @& y. r
125       u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);" |( q; W) o4 E- i& Q- i( W) c9 d
126       $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);" r8 {+ g6 n% D& F
127 //adr,adr+4,adr+8,adr+12
# ]3 {- v" d# |, _0 V' H2 e128       u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);, x4 y- A% M9 i3 [7 S9 b, S
129       u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);
" i! n7 ^9 c. i) x130       $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);4 k* B% _* u' q; @
131     #100% s7 D1 r# Y8 \/ h: X
132       $finish;% ~" R- B3 \' X
133   
- ~& n  m3 Z* M0 e2 A" ?134 end
# Q3 r1 U& h% S: Q$ T! {135  7 O4 U7 |1 ~+ |& @7 n: f
136 initial
, K- T& k/ p$ t137 begin
1 f# F8 a0 J& h138       $fsdbDumpfile("sram_wrapper.fsdb");
6 A& A3 f/ d/ V8 r3 i139       $fsdbDumpvars;  d! ^! P, \  y4 f0 l9 P
140 end% _5 R7 L. D4 t/ q) l: j( K
141 endmodule! [. [$ H+ A, [5 X. X; b( |2 h6 K
$ b% v% Z5 @# O1 J% {
; x2 E$ C4 w4 Z0 ~7 Z' F  a, X7 b
仿真结果
5 s# `; w* W# X2 o. S
! j  {: v7 b3 q8 t  Z& H# INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)
9 z2 L( p& v/ v0 k( }#
! `* d* A3 n; b0 z$ S#                  571 readfrom 00000000, value = ddccbbaa, j5 s  N$ c3 t+ q6 z
#
+ F2 E# S; A1 O9 x% E) R' l! `#                 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 000000043 {1 r' x2 ^; o  m
#
1 I$ K% R* t+ U% b+ [  p
' b9 |) K* l  F8 F* q没有错误( C) Y. b3 A1 P/ w+ J- ]$ |

9 Y! r. S: ^6 @4 I1 F1 cØ  Sram_wrapper的soc系统仿真验证
, ]1 z: T  I, B6 @4 ?8 I
! D7 [. K& [7 |* [- _. `4 c9 }加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示) j3 T; j5 z" C% E; ?: d
6 U7 E0 T9 v; H, \8 K( W
1 #include "orsocdef.h"$ k3 L5 {, G" F+ d! [1 u  M4 L
2 #include "board.h"
4 p/ o2 D% s& n' [' B6 [ 3 #include "uart.h"3 p2 X' z! H& J# Z1 ^
4 4 ~8 Q. X5 q. ]/ a" w; V
5 int1 C$ y, a& E2 R8 g0 S, @4 }
6 main (void)
( F8 L; X: ?1 X& X# A1 e/ W 7 {
% y9 ?3 d: j, e' @+ v' I 8 long gpio_in;
0 X. s. L% L8 K5 C3 p" a 9   REG32 (RGPIO_OE) =0xffffffff;
5 K( G4 g2 X/ I7 Y8 U4 o+ T7 }  I10   b- H. G# F4 T. x% h; O# v8 W7 ]
11   uart_init();4 ^9 Z' a5 c0 h  t+ \
12   ! O" A! _9 U5 c  x! F, I% }% j' V8 d
13   uart_print_str("2Hello World!\n");# ]' W$ v3 ]1 b; N& ?. r5 X' V& Z
14   * @" w) Q& @; z$ z+ s
15 int i;( V) g, h! }. ?, g/ x3 j/ A% ~) f
16 int t0, t1;/ k7 o8 k% d/ H
17   t0 =0xaabbccdd;2 m* l% u/ B4 [/ m; @
18 for(i=0;i<10;i++){
& Y/ R$ p% ]7 R" P+ W" }9 o19 //REG32 (RGPIO_OUT) = t0;
1 X; s  f. J9 V( P) R20     REG32 (SRAM_BASE + i*4) = t0;& M! [2 e/ z7 \
21     t1 = REG32 (SRAM_BASE + i*4);
7 ^6 K7 Q1 y0 I9 @; q7 _. g, w: w! H22 //REG32 (RGPIO_OUT) = t1;+ v1 c! L. ^& ?1 i0 _
23 if(t0 == t1)
. v: C- f9 S5 d' E24       uart_print_str("correct!\n");
$ q, z1 Y" |3 Y/ n25 else& M# a8 P3 x. z
26       uart_print_str("error!\n");  ?7 P* e0 T0 J2 x) j
27     t0 = t0 -0x01010101;7 @! `7 {0 y1 l1 j; f1 T
28   }6 ?: V4 ~( R$ c3 I2 G
29   9 j, d0 S6 n; d: }0 Q9 d
30 while(1){
0 T  p: V( \6 R6 F8 Z- R0 B( g31     gpio_in = REG32 (RGPIO_IN);* K/ s- d& N( K7 z" D+ m1 `+ a
32     gpio_in = gpio_in &0x0000ffff;
, W4 A3 `6 }; i& T/ M" O33     REG32 (RGPIO_OUT) = gpio_in;
' p- [1 `# }3 W6 @7 K* e( X34   }8 R& ]* n9 f  G( E- o2 U
35 " G6 d; {; i! h& t- l" k
36 return0;
% O$ g( R+ m+ B/ w37 }
, O# Y/ \, M5 e: L! D2 k
" l+ X. p( O- \! L( e2 q3 Y% }* B% E! `0 x6 U* ?4 X
仿真结果
$ ], |% Y5 U6 h6 z. k
6 n% C. [+ f0 z  s# 2
$ l: `/ m- M4 g; ]# H& j: G8 Z) @* z7 ?- B
# e$ O( a7 Z) W3 r
# l
4 m* d! n- e9 w8 ?" L% Y6 v# l0 ~/ v% }  Y' E0 I1 d
# o( X6 |  O$ y* Z
#  
9 P4 r1 v7 x+ E9 f. A0 |! y# W
/ d, g7 y( |7 i$ q% k2 w# o
% R* f7 z" e6 v/ U0 v# r; E4 q8 q7 l* Q8 f* S" o1 ~
# l( Y" m$ z/ G/ a1 o& f
# d) k) w/ m! d# j; w
# !* N: K9 z; \3 w: f, h: x& P
#
( G4 g/ w& A+ Z! O  S, {#
1 K& x# ?! D8 v. K#
+ B# l+ F+ b, P/ B$ }; }+ P9 M! J# d# , b. k2 N0 [2 b9 i* l$ ^. q
# c7 T9 ~$ ?; }- z: q! I
# o
; {8 F6 E' M/ [8 r+ D# r
) Q, d5 A! k, W6 W4 s2 K# w# r+ r3 ^( K$ d/ R7 U/ g! u: V/ `  l2 ~/ P
# e1 n7 A" A, O1 E$ _
# c- S9 W9 m+ `( {5 @# q* f" P! N
# t
5 H8 F' R! @. \! _! T9 u$ N3 w# !
) S/ ]* ~2 t8 A  P* W4 \" k… …
( {' \8 B" P% I6 z1 o3 ~$ s
; c7 S7 L* X' t1 P" r在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。
) R0 }8 z, I1 L' @6 k0 j3 O" A3 O% }* O6 Z
Ø  Ssram控制器的设计与验证; d8 G2 N( A8 ?% ^
; V4 [& G; l# Z% _4 h, {% W; M
Ssram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。
8 D7 p2 a' L/ r6 U& a0 s5 ^0 j& Z# g$ _" Y
关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下# B; n  `, K. e! Z+ `6 R
  U2 Y9 H# r1 j) C5 v

% X, ]; [2 k8 \( V5 i) c  ?  1 //----------------------------------------------------------------------------//6 i3 O9 h3 j$ S" X' p" r
  2 // Filename       : ssram_wrapper.v                                        //1 U% p4 [* m' s. \  \; f" @; B6 W
  3 // Author         : Huailu Ren ...()                                       //
4 u5 H; Q& U7 t) X3 C7 Z% H  4 // Email          : hlren.pub@gmail.com                                       //* i1 e; u8 d4 v. l( E
  5 // Created        : 23:54 2011/5/17                                           //  y$ i% a5 p; e6 c
  6 //----------------------------------------------------------------------------//
6 _0 k( P" s) s# v  7 // Description    :                                                           /// s5 G* @& u  S. A8 v
  8 ////
6 S) s6 j- j, `6 _. ]" O- A+ B  9 // $Id$                                                                       //: m1 e/ a# r/ {, u2 u2 {
10 //----------------------------------------------------------------------------//
  D8 V5 Q- m: Y& J+ j* n 11 & s  {, @5 ~5 `& r2 W8 A
12 module ssram_wrapper() O% M- Y/ V9 ~
13 input              clk_i,# n1 o/ Z/ V& v: d9 y
14 input              rst_i,
( J4 T: T6 B5 b& i4 f: T$ { 15   
+ c* z" x1 V9 Y0 i 16 input              wb_stb_i,& |. |6 N. ]3 d. c; N' Z7 Q
17 input              wb_cyc_i,. k; t& V0 Q# i4 {; t* a2 o' W
18 outputreg         wb_ack_o,
) {; }1 I( Q& V: Z9 p 19 input      [31: 0] wb_addr_i," o# k) s$ A4 m) K! Q7 o; d
20 input      [ 3: 0] wb_sel_i,
7 Q" K. }, p. ^9 d% C$ g5 w' Y7 C 21 input              wb_we_i,1 o6 J  t* e3 `+ [. {1 d+ `
22 input      [31: 0] wb_data_i,
8 o5 ~9 _5 s! V3 j& g+ ~3 @1 l 23 output     [31: 0] wb_data_o,5 W. d/ u. p) q3 A; p5 Z" b- T2 o1 A3 e
24 // SSRAM side
/ C% M  C2 k9 s! V6 U 25 inout      [31: 0] SRAM_DQ,     //  SRAM Data Bus 32 Bits
) x3 G  @1 ]: H7 U% D 26 inout      [ 3: 0] SRAM_DPA,    //  SRAM Parity Data Bus0 ^" @9 i6 D6 I9 W8 |2 X4 C0 O
27 // Outputs                     4 N# R" i* g( `; d+ D- d& e
28 output             SRAM_CLK,    //  SRAM Clock# b$ D3 D$ M* H- [* C6 i* \- |
29 output     [18: 0] SRAM_A,      //  SRAM Address bus 21 Bits9 N3 {+ `3 a9 S1 Y# ~
30 output             SRAM_ADSC_N, //  SRAM Controller Address Status  
+ x5 x; g$ H/ |; u( W 31 output             SRAM_ADSP_N, //  SRAM Processor Address Status9 J& M" h  X8 d( g* ]6 V( X
32 output             SRAM_ADV_N,  //  SRAM Burst Address Advance5 ]" \! `: J& T3 d6 Q3 z6 C2 s
33 output     [ 3: 0] SRAM_BE_N,   //  SRAM Byte Write Enable
; h$ ?& \) ]5 x6 z2 ~ 34 output             SRAM_CE1_N,  //  SRAM Chip Enable2 z1 [2 s$ N& A  c
35 output             SRAM_CE2,    //  SRAM Chip Enable  u& r2 X1 F/ O$ m
36 output             SRAM_CE3_N,  //  SRAM Chip Enable
: P0 O( g; s# w7 Z, E 37 output             SRAM_GW_N,   //  SRAM Global Write Enable
  Z; J4 w& k* }- w9 ^ 38 output             SRAM_OE_N,   //  SRAM Output Enable
. y% O9 ^. Y0 j) y. b$ o% \# _ 39 output             SRAM_WE_N    //  SRAM Write Enable4 `$ G% ^  n- n( q1 N: |: ^
40   );
6 o5 S. [/ C1 o8 Z  U$ x9 ?4 W. Y 41
1 z/ `* A$ Z5 z7 x; W- F1 V3 | 42 // request signal
: E+ Y- }' W5 C$ Q6 D2 l: V: Z 43 wire request;
& k$ V' v+ c( f6 g 44  
* [9 X, X1 D. Y0 c- x 45 // request signal's rising edge
$ p' M+ d1 M* F 46 reg  request_delay;3 j3 p# b: o. m4 M! F0 I
47 wire request_rising_edge;
2 f! B. c' k. X3 R 48 wire is_read, is_write;. S# N* t3 q2 Z; x
49
$ }" |) B0 q# h0 i# H0 a4 @- l 50 // ack signal! M' Y; _5 C  `5 G# H! W
51 reg  ram_ack;
/ Q' i; v* v! z5 j" D  f 52  . K7 `. c) C/ P, K1 ^1 L  w
53 // get request signal
6 f9 N4 |3 ^. k8 L! f; I( E6 ^( G; m 54 assign request = wb_stb_i & wb_cyc_i;0 o7 H. r2 S  i2 F  \1 K8 ^+ ~3 _
55  ( x; {! _" W: s" b6 ]0 j8 ?
56 // Internal Assignments
* k+ ~6 l( @+ X0 T( Q& Z" ?5 C 57 assign is_read  = wb_stb_i & wb_cyc_i &~wb_we_i;6 I; Q& \3 a* q8 H  c, ^
58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;
0 }) W# ?$ E& U 59  
; C& b. C. ~+ e' m; K; i) h 60 // Output Assignments
$ y- L7 [. G1 K. D1 }7 s 61 assign wb_data_o      = SRAM_DQ;* }' \5 N0 C; G
62 ) d. Y3 a: M7 w1 M) Z; J4 H2 m
63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;
4 r6 N1 r2 _5 T4 S 64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz;
! v/ Q8 ~3 U! ~; Z% i+ W- a) q5 L 65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;" ?( t- F0 l$ }7 N
66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;
1 \" I) r  P: T, N( i5 c/ @ 67
3 z5 [1 ~# U/ f( J 68 assign SRAM_DPA     =4'hz;
" Q% c- @/ ~$ w  s# d6 Q1 q 69 5 @1 l8 j  \( N9 t" V5 `; Z" k9 M
70 assign SRAM_CLK     = clk_i;9 R$ b3 j! [0 f* W
71 assign SRAM_A       = wb_addr_i[20:2];
( r! G- h' s  b# {9 h; L# L  n$ G 72 assign SRAM_ADSC_N  =~(is_write);& I) @; o- |% E% F
73 assign SRAM_ADSP_N  =~(is_read);
0 X( @, B8 j# V; ?# Q" i 74 assign SRAM_ADV_N   =1'b1;1 m( t9 y# @5 }% N. M; A3 V5 t+ [
75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);2 @3 R0 S: Y. W7 ?, l! u* ?$ N
76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);
# G( K8 q; B' u$ P% Y* W3 Z 77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);
2 [4 ?; r7 k& }5 T 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);  Z  k2 s7 h" W- D2 ~4 D4 U% o
79 assign SRAM_CE1_N   =~request;4 h( `5 _1 W* f8 I
80 assign SRAM_CE2     =1'b1;
, _) d6 b! V  q) ?4 b( }/ d 81 assign SRAM_CE3_N   =1'b0;
) B# s/ v! P" B5 o, @ 82 assign SRAM_GW_N    =1'b1;
& v- ?3 Q5 |) Y 83 assign SRAM_OE_N    =~is_read;
3 Q2 T' y% C& W2 R 84 assign SRAM_WE_N    =~is_write;2 R( z2 }( V. a! `* w% ?
85  # c5 C5 T" q) t( s
86 // get the rising edge of request signal, Y- f6 l8 c5 q/ n  S
87 always @ (posedge clk_i)) [  K8 l! s- j; t
88 begin
! d$ ~2 d) u( G/ M8 A' y 89 if(rst_i ==1)
) I9 ^" V' g, b+ N! R( W' O- m 90       request_delay <=0;8 P) L+ f  Z! }( H' g' {" S1 x
91 else6 u; @$ X( Z* F7 O4 y/ V
92       request_delay <= request;
# E  z# N3 j/ F5 @& e 93 end3 Y% P* k6 B4 z5 R: }! A: P$ n4 A
94  3 A0 u7 t+ ], q( N2 c9 |# I
95 assign request_rising_edge = (request_delay ^ request) & request;
6 X; ~+ N+ G. c& R$ i* V) q 96
5 q' v' C7 B+ P3 P3 y% U: s' P 97 // generate a 1 cycle acknowledgement for each request rising edge
5 p$ y7 m& Y* C3 L5 N 98 always @ (posedge clk_i)- I2 [1 d9 V* b  g1 v+ g
99 begin
8 o. l# X# j, V100 if (rst_i ==1)+ I' w! P4 V' S# u; ]9 {- j. q( z9 \
101       ram_ack <=0;: C6 U+ F! N7 z) F
102 elseif (request_rising_edge ==1)
" R6 ^# i3 a" ]/ n: ~103       ram_ack <=1;" h  u2 i  h4 _5 I3 S  L6 k
104 else' {0 g2 ]1 y+ K7 b+ ]
105       ram_ack <=0;
, W/ U7 w8 q  z, J1 ^" Y( W" [0 e106 end. {" X3 F- \( ^: {9 X
107
4 ]$ s5 b$ S- F- z4 b" F108 // register wb_ack output, because onchip ram0 uses registered output
, r# i+ B9 c) @$ Y1 f# b109 always @ (posedge clk_i)8 w7 k' p# j1 \
110 begin
  A- y2 \, N2 \( D111 if (rst_i ==1)
9 O7 N% C. _" I. w8 {112       wb_ack_o <=0;
6 l: z5 V' w$ _+ R5 W8 Z113 else5 h! o7 J9 v5 `3 p, H- v
114       wb_ack_o <= ram_ack;+ J% r5 T: `) z! Z1 y4 w) ?  W; H
115 end
& v, ~6 [6 |5 H" }0 Y. A# O116 ) \+ x' Z! n+ u- |3 Y/ R
117 endmodule
( w. p- a. V5 Z- |' c/ l4 f/ P# w. D$ G6 G+ n" s3 N7 z
/ W7 @3 u  e% g2 A8 w3 s, k
并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。' X% r, `, e( ?# O; V4 d* H
& w1 K+ w5 v* _; s$ s
源码可以在这里下载
! }* ~8 u7 t- K3 S. w
6 O$ i6 X4 C% ?5 ]! S1 j' K( j* o稍后。。。
9 _0 \6 i5 ~: r0 a7 H  NTo Do* J- m9 R1 |& Y5 ?8 ?
9 Q" P  ^/ P0 J+ b# |4 j5 s7 i
用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
1 t6 e1 `! l, W2 Y6 q8 c修改以下用所写的sram_wrapper移植到DE2-115平台上
( W  i/ f$ h+ a/ c2 {0 ^To Do--关于opencore,or1200的soc平台
$ Z& j2 r9 e: U+ d& A  n# R6 X- x/ G' a7 v+ W1 o3 h0 A
OR1200的引导方案设计(基于硬件或者软件uart控制)
; |* _3 [# q5 O% R移植uc/os II操作系统
4 M1 A8 l: t9 d8 g3 C驱动起来DE2-70上的网卡+ z! y1 K/ s7 [4 @( K
加入jtag模块% ]  p/ ^, ]& p* e
移植u-boot; f# [. e, G; |" J. `) {3 Y0 p
移植ucLinux
0 _; D3 k6 p4 M) e……
作者: yin123    时间: 2021-2-22 10:42
基于or1200最小sopc系统搭建(四)--(sram,ssram)




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2