TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
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…… |
|