TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0 n7 |8 a! B! {* T5 G: e7 J. fØ DE2-115和DE2-70的存储器配置# A2 X* Q W8 w+ _' {
, @; ^, K3 k. a5 L- f5 K5 k- Z3 fDE2-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之间反复转换。, H8 s3 G- ]( Z
. B) g/ T g$ J; x
Ø Sram控制器的3中验证方案8 J& y3 ]7 Z2 x& t( r* V0 W
b I0 L* ]5 @8 x& K4 o6 z9 w本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。
# A8 S8 a8 N# j+ m) l* D8 x% H. m2 ^. K/ G: [4 y9 B
+ t0 Z& q7 T( |7 f/ Y9 E" L ^/ v
以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。
8 j4 {- v' s E' K1 b9 N5 v, D t/ q1 [& B) s& f: b- v+ E1 l+ e
我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?
; D. f1 _* `0 e. H0 N# [0 p: O* E1 I0 m+ j( ?3 V' ~3 |. [* Z3 e7 e. _8 m
Ø DE2中sram控制器的时序要求7 n: f+ a" ^/ s( c
0 j5 s* H* }6 m4 ^6 K5 T2 fIS61LV25616的一些常用引脚的功能& z" k3 v. j Z
) D$ S8 U1 a) |
+ P4 O' H+ O" [# {6 k/ d" s& R- W) L- }/ S' c- s
读和写时序按照参照datasheet中所介绍的这两种方式* `: g1 \5 ], u2 a, j" \4 X
2 d# u' s! M$ d" o) C4 m2 f( V
/ p/ V/ h- J% R3 X6 g2 Y- b: Y/ ~' d& G3 H, H# i1 N: c' q& L* _# ^
' T0 G+ S0 z* ~& ]' N3 Y& V
" D% L& s/ N+ _# @& w1 x3 o在wishbone接口中需满足途中的基本时序要求。/ `' ]" t6 |( K x* s6 ]# y. D
: m2 v+ {; g/ O+ _0 v" y' l# H
IS61LV25616的verilog model在网络上很容易可以找到 b1 h# K/ x+ d
) A6 g. O. Q) A% a4 c/ q' E
$ S+ o! Y' [) U/ h/ |7 H8 o1 L$ Z 1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.$ L2 s$ p' G* r7 V+ u8 ^
2 // Note; 1) Please include "+define+ OEb" in running script if you want to check
9 |; f& C5 M5 O8 L+ m3 M9 T- Z 3 // timing in the case of OE_ being set.4 E# I4 i" M5 M3 }9 _' A5 y0 c
4 // 2) Please specify access time by defining tAC_10 or tAC_12.
: f( e: u2 ^" V9 D3 ]% s 5 ' l; E& u" ^2 I+ R# [( h9 h$ t
6 `define OEb
d8 U$ o2 a. g; u. N 7 `define tAC_10 //tAC_10 or tAC_12 defines different parameters3 d7 F; |% [& J% k5 I
8 `timescale 1ns/1ns `& X9 {' U+ \" e5 w% b! n
9
7 b7 _* b6 o$ D* n9 ~ 10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);
& \, B9 l/ O" h' @7 x# t9 U 11
7 \( G- ]8 G% w _" e D+ N2 T 12 parameter dqbits =16;
/ G3 b: e( o4 }/ U 13 parameter memdepth =262143;/ V1 d( w8 e6 B
14 parameter addbits =19;
) ^' j( R" u, X8 y 15 parameter Toha =2;- I0 b" [6 M6 k ?
16
7 @2 e) x$ S2 D- F' J: e7 d9 [7 X4 q6 G 17 parameter Tsa =2;
% g2 p$ K) Q% B+ { f/ }7 @( } 18 ' Y8 A; H# G7 ]6 D1 E( D& K+ j
19 `ifdef tAC_10 //if "`define tAC_10 " at beginning,sentences below are compiled
. `) Z# A4 `% L. V 20 parameter Taa =10,
/ ]3 ?) l- v, t- c' @& l w. C 21 Thzce =3,$ m$ Z, @& q! F- o( c8 h
22 Thzwe =5;
9 ]& t: U" f6 X1 ~' l 23 `endif2 n2 y! u# W* x3 {# M
24 ) g! x+ @9 Q4 |
25 `ifdef tAC_12 //if "`define tAC_12 " at beginning,sentences below are compiled
1 ~1 y8 t/ N# L6 U# r/ X% h 26 parameter Taa =12,
: S2 l/ l' D, f 27 Thzce =5,
% I, Y& P: ~, S 28 Thzwe =6;) d4 P+ b) `% g7 g( k6 k5 s
29 `endif: k: ~0 w" \" _/ f8 n
30
+ _8 G, H$ @ ] d7 @ 31 input CE_, OE_, WE_, LB_, UB_;
1 z" z. v' I5 n( t% p( D 32 input [(addbits -1) : 0] A;
& S9 D, L5 @' `1 H8 J% `. h 33 inout [(dqbits -1) : 0] IO;% ^1 @ `1 F M2 X2 v1 E% u6 K
34 8 I# l/ j, H* G7 J9 [, W: b
35 wire [(dqbits -1) : 0] dout;
" K b/ N) ?* B _ 36 reg [(dqbits/2-1) : 0] bank0 [0 : memdepth]; . y: b2 d ^" j( y2 J5 ?
37 reg [(dqbits/2-1) : 0] bank1 [0 : memdepth];% U. \8 F' Z* ~' ~/ ^) V
38 //array to simulate SRAM
9 G& L' ?! Y$ F: b- F 39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};
* Q# ?( j6 }) f 40
}. z4 y! M# Z7 w8 r 41 wire r_en = WE_ & (~CE_) & (~OE_); //WE=1,CE=OE=0 Read
9 N* I4 Q# E9 C 42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write
" `& I+ o3 S" e/ \- S 43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; , ~# V( I N. j$ e$ A
44 - Q. \* u4 j9 j4 d! {$ F
45 initial
& G5 Y4 A2 O5 `! _ 46 $timeformat (-9, 0.1, " ns", 10); //show current simulation time) d1 K7 f1 t* i( A0 e$ k
47 : u. l; K: O) [6 `
48 assign dout [(dqbits/2-1) : 0] = LB_ ?8'bz : bank0[A]; v m+ d# X: C
49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];( A5 U8 p+ M* C
50 ) K G, U m0 ]: ^
51 always @(A or w_en)- ?8 G9 N* e; z; ?# \4 Z0 ]
52 begin8 K" f7 Y, I9 G& ~0 H
53 #Tsa //address setup time% A4 R# ?% U* O! Z( ~
54 if (w_en)% Y+ g" f- c! A* A# i2 b( d7 N1 x
55 #Thzwe
1 C" l" w) R" U. f Y. @- i; a" A 56 begin
8 f f' t7 N8 [5 o. c- b: Y 57 bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];
$ [# g6 B1 u9 U! Q' A3 O! b 58 bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1) : (dqbits/2)];
; i7 y* r% P2 q4 G3 [; z 59 end
4 H0 L1 \4 A* ^( [# B0 g 60 end
2 @, L2 c7 x" I$ N9 @% b! G 61 + n" D6 N0 u" A( F2 Y
62 // Timing Check
, Z$ B9 y/ V T! u2 h8 L2 | 63 `ifdef tAC_10
% }) f( `5 I0 k" i& Q0 a* l 64 specify//sepcify delay4 W# W2 U, j q/ \& p6 q+ G
65 specparam7 W7 \ q6 y% d/ z
66 tSA =0,! E3 |, k: Z) K7 e5 k A2 K3 K
67 tAW =8,
" X" i5 D/ s. Y" Q 68 tSCE =8,
+ [- L. X0 x# M5 N- `$ m 69 tSD =6,- H/ t$ g- b% \' V+ T' i
70 tPWE2 =10,% }/ B1 t( j+ y& @" Y) @$ J
71 tPWE1 =8,1 h/ s9 b' s0 x2 i
72 tPBW =8;
. z( i. y1 B1 n" ~: u 73 `else
2 E, |! k2 B2 G( \% p7 P 74 " Q8 h! h3 A$ j- e
75 `ifdef tAC_123 Z8 F$ H$ n' u9 Z2 _5 j
76 specify
! ^# G! r Y5 k" V4 n 77 specparam
. K1 n3 f" B- }2 ]% B6 C: j; _8 f 78 tSA =0,
Z2 I! L; j h9 ~/ K+ t8 S6 g* z- F 79 tAW =8,
9 e6 Z! ^: F! M/ D 80 tSCE =8,- i& f& c6 z. C( D: V/ n3 z
81 tSD =6,
2 l) `2 C7 \" p" R 82 tPWE2 =12,' K+ F1 _& ^% U8 r- M
83 tPWE1 =8,2 r4 Z L! W" w: Z& U! q$ R
84 tPBW =8;
. ?- M' |3 }/ Y9 J& U# x1 O* U6 c' O( k 85 `endif
- c6 M' l4 I/ K: F 86 `endif2 A! Q' |$ k" l7 Z6 y
87
) ]) \- V/ S8 x2 M4 ? 88 $setup (A, negedge CE_, tSA);
0 J" \. t1 Z- v2 a8 {$ p/ m 89 $setup (A, posedge CE_, tAW);1 e5 [$ V' Y8 H0 y+ t, a# a! f' G
90 $setup (IO, posedge CE_, tSD);
! L0 X5 N3 B# Z ~! l9 G3 Y6 i 91 $setup (A, negedge WE_, tSA);- S: U: \5 u. Y& a; E1 f, @
92 $setup (IO, posedge WE_, tSD);
4 K, k+ H# b( e" V3 c R& ^( U% j 93 $setup (A, negedge LB_, tSA);
: ^( m9 S) X' |$ Z) v6 A2 | 94 $setup (A, negedge UB_, tSA);
/ O' I; W o- {/ i 95
. a9 c: T _3 V( x7 G5 ^( R 96 $width (negedge CE_, tSCE);
) t! e& W$ \0 w 97 $width (negedge LB_, tPBW);% _3 c6 U- u6 n( V, n/ \0 J- E
98 $width (negedge UB_, tPBW);% ^ G) C/ o! R+ u5 T9 d' r
99 `ifdef OEb/ r- q8 e) e8 ~. e3 _
100 $width (negedge WE_, tPWE1);) D) n$ O( h+ ^" j
101 `else3 e2 ]% l5 S# V1 Z& f
102 $width (negedge WE_, tPWE2);5 b* C% j( `" P/ w3 P
103 `endif D- }7 T) U, w. v7 ? G
104 ! G9 ?1 m% H u/ Y8 Q Y( i$ K
105 enDSPecify }- d- F* g+ \& S0 e
106
7 }3 W2 d1 F& b8 J g1 ?107 endmodule
5 ~' W; f5 o) r- y9 f5 Z/ Q- x
' N% `* M& |2 ^ `% h7 f+ D! M8 F6 O4 k* Q o* u4 Y; a& n
- }- t- u: H* m5 y- v; n0 D
! A! v9 V7 R a' OØ Sram控制器的设计/ ^9 Y6 n2 x0 C) i1 Q; G
& s, n0 {: }5 J* }" Y9 ]3 c7 _: M& ]Sram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。. R% x. {6 Y7 Q
6 A+ f1 \8 A8 O& t4 l! h
Sram_wrapper的源码/ q9 e2 ]; j& h3 I" w
: V- F# l& c+ B// Author(s):
6 ]6 [, F$ H4 J! O2 E// - Huailu Ren, hlren.pub@gmail.com! ~; o* J5 e2 M
//- d2 [9 b$ ]4 P1 C; }5 C
) n' \9 t4 B, |# O. D// Revision 1.1 16:56 2011-4-28 hlren/ ^* M4 A5 i/ \
// created
' `7 C* v) W' ~//
* c+ ^5 k' U _2 }% D+ }0 y3 N; _" c. I( u h, G; H) i) H" V) @
// synopsys translate_off/ R5 l/ S, ]8 H' k
`include"timescale.v"3 N5 O% c1 E& Q( Y* V g' L' X1 n# L+ \
// synopsys translate_on
" R3 h- {) E( g+ O7 i; H
L9 \$ N2 e2 m* |! r6 Kmodule sram_wrapper (
, s9 b7 }6 S5 J0 h1 m wb_clk_i,8 ?& N. c% h: s/ a) P2 p
wb_rst_i,% W1 x+ @9 i" S% R6 ]
) | v) ~6 W" r9 N$ t' j7 K wb_dat_i,7 p' z' S, V& Q
//wb_dat_o,8 s# }2 P* N V# s3 X; K9 R
wb_adr_i,
0 F. l: h% h1 z7 w C0 X3 g$ O wb_sel_i,
- S- x2 x. g i+ ~2 ?0 y wb_we_i,6 a3 F; S% {* ?, V- T
wb_cyc_i,
; T/ [3 ~( m2 l: { wb_stb_i,
) O) m) X- ~+ @$ C4 J5 Q" C9 V6 ~( |3 b/ W' Y: P$ T
3 t# x7 |, h6 t' f' K
// Bi-Directional+ W9 N- |! I6 U( K5 j1 |! ?) ^9 s5 i
SRAM_DQ,
|' [7 R9 G4 p4 h |& [/ _6 b l8 `! Y; P" }" Z+ f5 y
// Outputs
$ F( n6 ^4 W. o8 s# d wb_dat_o,0 b; r( Y t ^$ Q0 Z F
wb_ack_o,
4 r" \# g5 f2 Z/ a Q8 @- H G. T5 m wb_err_o,6 |. {2 j' p1 s$ G- u
1 x# y0 y8 M3 l SRAM_ADDR,1 d v/ A/ n$ @ Q b
SRAM_LB_N,6 M4 j( v% s# j4 z% l; w" j$ k
SRAM_UB_N,! g9 q( s" W5 n! p! h
SRAM_CE_N,& j9 U- \) B! L: h$ J! k' S' ~9 e
SRAM_OE_N,0 F8 e0 K4 W+ r D4 o
SRAM_WE_N! v5 _ |' L+ f" `1 F+ f
);
# t$ \3 ]8 @4 ]9 E. g+ c( U2 v3 l* }" s: b; F2 ]1 k
//* Z i0 x. o u/ K/ K! w
// clock and reset signals
6 N, ^* x+ n3 [; [( R1 V4 n1 m J//" _3 l. P K! v& S. U
input wb_clk_i;. ]! V1 z/ U4 x) ^
input wb_rst_i;
; K: B# x6 r4 v& u% n; a0 [//- j+ g/ A6 Z4 m8 X
// WB slave i/f1 b# Q3 V, `0 V
//
( P% G9 \- M' ]/ pinput [31:0] wb_dat_i;
1 k" E% d4 E9 R1 m$ H- T& t output [31:0] wb_dat_o;" L& ^2 n+ }: x5 J4 ?+ W- w
input [31:0] wb_adr_i;+ P, `3 G9 d! X9 J+ ]
input [ 3:0] wb_sel_i;6 M" b! H5 T5 q& v& \, o+ Y
input wb_we_i;; S0 X0 k2 r* t6 g3 N' m
input wb_cyc_i;
; o9 k! s" p- C- A input wb_stb_i;1 d& h% a' n0 b
output wb_ack_o;
2 z( K# D5 z: R H output wb_err_o;7 R( O" }( h6 R) @3 E
//
$ u# C5 O' o% ? v7 j+ W+ m$ l// SRAM port3 B( C6 B7 }& y
//5 A9 _# v% [4 W' \3 N* }
inout [15:0] SRAM_DQ; // SRAM Data bus 16 Bits
: G m R2 e! F' n( S- w' n6 zoutput [17:0] SRAM_ADDR; // SRAM Address bus 18 Bits6 N# p2 @% V. s
output SRAM_LB_N; // SRAM Low-byte Data Mask q5 G: L7 K& {; k% o2 w9 t& A
output SRAM_UB_N; // SRAM High-byte Data Mask, H( n. ~, i3 G* y5 l: c: V
output SRAM_CE_N; // SRAM Chip chipselect& Q3 q1 z7 W# l O3 S% ]7 x
output SRAM_OE_N; // SRAM Output chipselect- z5 s3 j, m5 y7 O6 d7 e
output SRAM_WE_N; // SRAM Write chipselect& R+ _$ z1 j& j% V$ N5 a' z
& K! d) M3 x/ y8 Y- L7 w reg [17:0] SRAM_ADDR;
( z: O% ~. H W- V! N$ x, D reg SRAM_LB_N;
/ Y( b: U1 g% U; c8 P( ] reg SRAM_UB_N;6 c, ~0 H8 L6 B8 X1 `" Q% {
reg SRAM_CE_N;7 t4 a* |! B) h2 ~- r% f$ m
reg SRAM_OE_N;
( @3 }5 r8 [! r$ V, E4 N) J$ | reg SRAM_WE_N;
g7 W }' W5 j4 y) { ' A7 T% C: W! Q! X
reg [3:0] state, state_r;
: Z o' J! V; Z8 r5 p! j reg [15:0] wb_data_o_l, wb_data_o_u;
- p# _; k. u: @9 p2 I * g$ m/ b9 l I6 E
reg [16:0] wb_addr_i_reg;/ K! [. d2 V' X& x
reg [31:0] wb_data_i_reg;' w# c, D' r; ?+ h1 s W3 C# R
//reg [31:0] wb_data_o_reg;
- B. C% ^3 V) C4 Y0 greg [ 3:0] wb_sel_i_reg;: C) [" I) E( [; n" `0 u
$ H0 `8 c3 U# E7 `; L y2 B
reg ack_we, ack_re;
6 i& O5 d, D& K: L9 [# C8 P// *****************************************************************************
4 c5 G% \& C4 m' y) h$ m/ K// FSM( S3 N7 ~$ |% ]! w& v9 }
// *****************************************************************************3 x0 ]& i6 E' R# @7 m* M4 H
localparam IDLE =0;
' P% a8 x9 [1 Q; t localparam WE0 =1;' f& s. N5 f, m- E1 T
localparam WE1 =2;, ~9 g! c' C8 \- O: S5 V; U# Q8 ~
localparam WE2 =3;
) y3 B0 k7 \' W1 ]" B localparam WE3 =4;
- p2 w+ v3 {; [# w- M/ y8 l; e localparam RD0 =5;
$ s4 B+ I2 d J( a+ V1 D# Y localparam RD1 =6;
, z/ z4 b2 T3 J) I5 K" z) u8 K localparam RD2 =7;
+ i3 G3 v- X, c1 [4 u0 S localparam RD3 =8;* F' S1 R$ N, I) w5 |# u
localparam ACK =9;
" P* _# }* W" M; e. K/ ` 4 C! v- Y; Y$ m
assign SRAM_DQ = ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0]
# U0 m) M9 V+ t; X8 R9 Y: @ : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]
# w. x/ h9 X; ^7 ^ : 16'hzzzz);
% {7 A1 W* X+ \3 k {assign wb_dat_o = {wb_data_o_u,wb_data_o_l};! X( x/ U+ L; m) `% N0 Y- O/ x
" l6 a3 \& {6 x7 P0 \- X assign wb_ack_o = (state == ACK);
4 ^2 x, T5 H* u3 U1 A. N2 @0 ] assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);5 Y+ Q3 T* R2 p- K
" N8 p9 r V, {7 j- d7 v5 \/ A
always @ (posedge wb_clk_i orposedge wb_rst_i) begin" e+ T ~" M1 ?, Q4 k' B/ d( o) X
if(wb_rst_i)
: ]# {- A) i: j4 Q3 k2 _5 ~( w0 | state <= IDLE;! |9 Z, Y( K3 a2 O+ O
elsebegin$ _+ y1 L5 m- O( m5 M8 `
case (state)9 K6 W* K: w* H' Y% U5 j! }) J: |
IDLE : begin
* ~5 [0 P2 X" d8 N$ { if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)- f: J1 \$ E4 B4 r. o
state <= WE0;
) H$ x# t; x' s2 _' Y i- ]% V elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
1 @/ N# S( W7 Z state <= RD0;( U2 Z N1 L" q4 d# [( O
end4 i* _' K( o X6 J- g* _
WE0 : state <= WE1;
0 W5 R' ^, x& F9 o- d. b WE1 : state <= WE2;+ F$ M, q/ \ Q: s1 b: j
WE2 : state <= WE3;
/ O7 R/ |7 B: d/ M7 V2 m# m* P( D WE3 : state <= ACK;+ I) ]( v8 Q7 p$ u) X5 r
RD0 : state <= RD1;
( f' F# I* Z$ W" g J$ [. @5 l RD1 : state <= RD2;
' u& h1 H1 {6 H* e1 b# o. i0 Q RD2 : state <= RD3;
: M% w; f$ k/ \: p+ A$ S RD3 : state <= ACK;
# v2 R. M- y" _% c ACK : state <= IDLE;+ w2 r) |( ^7 O3 E4 H: h: O
default : state <= IDLE;6 f3 ~! l: v K* l
endcase
) p% }" N. c; u- B5 S+ \5 d end
U( d2 |6 M/ W: r end& d. {( q& e' e# Q7 y( s" C# g
9 S- Y x* f# \! t4 W9 U$ t% | always @ (posedge wb_clk_i orposedge wb_rst_i) begin
6 C U K! {, P0 I4 G' Y) D; w7 Q if (wb_rst_i)) t/ \+ `# L" c1 w! ]6 a( M
state_r <= IDLE;
. T5 W- J" d0 O) I" W. S* c& } else
+ R+ t9 a# t( k9 Y state_r <= state;
+ d9 u" Q" S- U9 S0 n end
, h" P9 _% x" N9 x$ g L: y1 j//8 k1 C6 X: b" e; y; m/ v
// Write acknowledge
- B& z8 I) C/ ?//3 Q$ j& A, ]- _# | g6 K
always @ (posedge wb_clk_i orposedge wb_rst_i) begin
% e& i1 i' S% h/ k) P if (wb_rst_i) h3 E9 ?6 `2 R) a
ack_we <=1'b0;
: E8 M! J: d/ J" ]$ |" ~' s9 {else
9 d$ O" z6 r5 z# ~$ B if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)
; q/ r5 P4 f9 I. E: X ack_we <= #11'b1;
2 c- [( W# i3 k# belse
4 }! L9 g Q- x. v ack_we <= #11'b0;- |0 U7 F; ]6 |0 `, L* S$ q, \: a
end
5 a) P+ ]! Q# S# J1 C- I# r$ g 5 n( q4 i7 L1 u2 R, z, P6 J
//
/ P# l2 S& k8 n* F8 G// Read acknowledge7 \3 z* D1 }# `
//( |$ U. l" V( y$ S( P' g
always @ (posedge wb_clk_i orposedge wb_rst_i) begin
# g! m6 M2 b' k- w- r' A) M# @ if (wb_rst_i)
. s* e% ]8 a ?% j4 t ack_re <=1'b0;
" n, a' {. Z0 P9 relse6 g3 K; k2 q$ O! ~5 d* S& B& O
if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
! J, }* v/ A% R- u9 C! ?' B' o ack_re <= #11'b1;$ g% _; Y- e4 j* c8 w R: E7 m
else) ?4 ^6 S+ g+ K
ack_re <= #11'b0;
' U' Z0 h9 W% F8 tend
8 y2 l3 G) x& d+ d& g5 X$ _/ t* Y4 l
: _ X5 [5 [7 E+ h always @ (posedge wb_clk_i orposedge wb_rst_i) begin
- n1 y: |: }7 j( j Q+ S if (wb_rst_i) begin
9 I" Y* u7 s3 c. f( T wb_addr_i_reg <=32'b0;& m, H! _" ]) G
wb_data_i_reg <=32'b0;
: n7 z, ]6 @1 s- o7 x wb_sel_i_reg <=4'b0;
& c: w: X- l4 \; b. w6 e- j+ Wend
# _7 ~, |9 N& E$ ~! g) o/ D1 F else
- h4 c) z, S8 B; ~0 p% R if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)
T( `% p0 r* X7 ], u! }' t5 } begin
6 R C( t' m$ D4 Q wb_addr_i_reg <= wb_adr_i[18:2];( C7 D) G. p0 D* z' ?8 c
wb_data_i_reg <= wb_dat_i[31:0];4 J$ s! n3 N1 R1 `
wb_sel_i_reg <= wb_sel_i[3:0];3 d' _0 g/ s, p8 q
end: q7 i( ?. ^$ s: J- b
end
1 z; C. a" p2 U4 F4 `
0 G' U* _9 r& ? always @ (posedge wb_clk_i orposedge wb_rst_i) begin
( Z' } @% H3 Y c if (wb_rst_i) begin K0 Q; {, V0 J {
SRAM_ADDR <=18'b0;, f( _/ E* {8 o2 D3 p; U) h. Q) t
end2 u0 h8 l$ q8 N& H- w7 B. y
else; u: x! c, m' [" C9 N7 l! J
case (state)
2 u3 R3 L/ z% L! z( h) |- J WE0, WE1, RD0, RD1 :6 s2 a$ ]2 u8 i! c2 ~; L
SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};
, C3 ^. F$ `- P" L WE2, WE3, RD2, RD3 :! L9 R+ |5 X, C# o
SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};# N, n8 s) h) k6 [" s6 n
default : SRAM_ADDR <=18'hz;
) o5 W" u: I7 Q6 P: h0 e# vendcase& S$ l! I0 o( J- ^0 a. G
end3 E+ r9 M. w6 z' T
+ [+ ^) k& f6 c9 U8 k always @ (posedge wb_clk_i orposedge wb_rst_i) begin
- Z" v$ ~6 Q I6 z7 P9 p6 Y if (wb_rst_i) begin1 M, k! x- W0 R! N
SRAM_LB_N <=1'b1;5 A. ^# ^5 t J4 O+ v: o! d
end
: d0 j0 f6 w& \; c& G# v, j else
Q5 c- W) @1 v case (state)
6 g+ d9 [/ C, j1 j& S! N7 B WE0, WE1, RD0, RD1 :
$ O$ k7 e0 f- j* ] SRAM_LB_N <=~wb_sel_i[0];
& [* X; D9 N1 K' [ WE2, WE3, RD2, RD3 :! V* s1 Y: h' i9 }' \. }
SRAM_LB_N <=~wb_sel_i[2];+ z' b) f4 e0 d; L7 S0 a* @3 p% V
default :
" Y, x8 i& A5 N) v" v SRAM_LB_N <=1'b1;' d# d& l4 n7 I; ^/ M) c: e# B5 g
endcase
, j: {: Z( L. s& ^ n. e end4 g# E# }$ }3 d' d$ H
( ?9 i3 q6 Q& q- t" g& D- ? always @ (posedge wb_clk_i orposedge wb_rst_i) begin
' r- N: z. s5 e# ` if (wb_rst_i) begin7 I( [2 [2 V8 b7 |# g
SRAM_UB_N <=1'b1;
; l( A3 \5 Q" k7 F' U+ E6 Hend
8 F2 l* G O2 s* X else% e# }1 @. ]- F
case (state) b" N' E/ \3 H( C
WE0, WE1, RD0, RD1 :
) S3 E- g" C: m SRAM_UB_N <=~wb_sel_i[1];
- Y$ a# |4 O, P# X5 Q, ?$ p WE2, WE3, RD2, RD3 :/ Q, k% i% o% d* E- H+ H+ r, W
SRAM_UB_N <=~wb_sel_i[3];
, O7 E- v; i. f default :5 I$ k9 V8 T1 B
SRAM_UB_N <=1'b1;
* o3 t8 ?" `' E. j% Wendcase' O9 e+ V; p( d- |
end
! @' Q4 @' q' f9 H* p$ }( K8 ?
6 f/ s6 y7 S- \6 ] always @ (posedge wb_clk_i orposedge wb_rst_i) begin9 e/ a- i: m7 {; M
if (wb_rst_i) begin
! o9 W/ }. l2 ~7 R$ J SRAM_CE_N <=1'b1;
8 E# k9 o. n: k3 Gend+ k' n% I t% y. O- z& U
else1 M& r" W, k3 C( V' e+ ^
case (state)
: A4 @( [3 M# S WE0, WE1, RD0, RD1 :1 B. Y) O9 e+ z2 H4 O. a; o6 ~
SRAM_CE_N <=1'b0;$ S( [3 B! P% n, h7 T+ U
WE2, WE3, RD2, RD3 :
+ G2 I, Z( D+ a1 S SRAM_CE_N <=1'b0;
' ~1 S- v1 ?/ y% Qdefault :
: c% M7 L4 S: ~0 y. ^2 W SRAM_CE_N <=1'b1;7 q1 C: q, u H- b7 h% Z
endcase6 n9 V* g3 E% v; }& {/ Q
end
# S9 K0 M+ `5 u4 B/ J
/ I* C8 F% O- `/ d$ D" m+ s8 Y always @ (posedge wb_clk_i orposedge wb_rst_i) begin
9 W3 ~3 \3 h, c6 L& N, D if (wb_rst_i) begin
) N9 p& O; o/ n x/ R* ^0 d0 f SRAM_OE_N <=1'b1;
" w& g. c% x* T+ k; U1 N/ Nend
+ K' u8 n) f+ ?3 y+ Y( o else
2 H/ P2 w/ [5 a* d' X1 \( p# c0 } case (state)" g# a2 ?& I6 ]
RD0, RD1, RD2, RD3 :3 a9 L9 w# o; n. p9 f* C% Y) |/ R
SRAM_OE_N <=1'b0;
7 {, U: c# l6 u) Wdefault : I" C4 W& f; d- v! e* @$ ^! c
SRAM_OE_N <=1'b1;
2 J2 g2 \8 x% E; L: Wendcase; d1 \/ y x6 R' I; F9 ^
end
1 r, `5 L" p' R. C5 H, c5 H4 {
3 m3 W* O" @( \1 b3 B* n( O2 R always @ (posedge wb_clk_i orposedge wb_rst_i) begin
" V' i1 C5 p$ |, _6 B& x if (wb_rst_i) begin
# G- Q$ ^0 r) s" C/ Q: s2 x6 S SRAM_WE_N <=1'b1;
# x9 Q/ k; Q9 Eend
8 g. H% B9 c5 \* W' f else! Z7 ^; \# ^5 `7 g# x4 W4 _
case (state)# ?1 e% t) u- \7 w- W" H3 f
WE0, WE1, WE2, WE3 :
% Q$ Z F n! s- `1 V* Z: M( D7 J; G3 i SRAM_WE_N <=1'b0;4 F9 D4 n3 G5 I# d7 F
default :
; I& l7 j1 `6 N$ {9 V2 s SRAM_WE_N <=1'b1;, W2 W, Z8 L' V- ~$ \
endcase6 S& ~$ d/ r9 V) a; p @4 {# X2 }
end
" q: S0 W) a# h8 h1 ^3 m, N //+ g' S9 K U8 x) o2 ~+ ~
// assemble ouput data
$ k! P, E: f6 V+ j# ~ //
& H* h' s, Z/ Ralways @ (posedge wb_clk_i orposedge wb_rst_i) begin
. \6 d s# R5 _4 |+ X if (wb_rst_i) begin
$ t& z5 U; ~# y- S; b3 {. ?9 ~ wb_data_o_l <=16'b0;
: h8 x, q* b. L, E wb_data_o_u <=16'b0;0 n( C9 D6 _, o2 S4 v- ~
end
) V8 P1 B5 ^$ k4 d else i6 N' Y: B+ u
case (state_r)
- z1 g/ \% _6 Y RD0, RD1 :& _# o. Z E! m6 |
wb_data_o_l <= SRAM_DQ;
9 S$ B L: K }2 e. N7 ^: r& C RD2, RD3 :
- P' g5 t6 D7 b7 N( G/ i wb_data_o_u <= SRAM_DQ;
2 t. Z: D% X9 y: q# L endcase4 |2 p" h0 k* ]
end
- v X7 d1 G. J+ X, Gendmodule
6 b# |# Z+ E" F1 `0 P& @8 ]" C+ U# p3 c# O
9 M4 }& [0 x- u
Ø Sram_wrapper的wishbone BFM验证: J' u- U5 A9 t7 X
5 ]! ]. {* j( P6 N0 {, m' C4 k
Sram_wrapper的BFM验证的testbench代码如下:
' F; a8 Y) }/ R& K, m$ P% C9 {5 o( {
; e4 m/ Q L: M
8 d' i$ Y# ^/ {! m: F3 s 1 // Author(s):
! K, d( X" G$ e( a 2 // - Huailu Ren, hlren.pub@gmail.com8 `: [1 g* S. ~/ y+ Q3 |! ^3 s
3 /// T4 Q4 B, ?+ N; W- ^3 o: f/ T
4
( q. l/ O3 i$ u 5 // Revision 1.1 17:45 2011-4-28 hlren2 @0 p8 x0 j. F( m
6 // created4 S% [" T( o, ?8 Y
7 //+ o3 Y/ C/ Z9 ~& _: D3 J
8
2 d* k0 t0 T; ~ R' Z 9 // synopsys translate_off+ i% K: h' R6 @9 v' T0 B1 _: b! {
10 `include"timescale.v"
: x# d, s0 k [. R) i 11 // synopsys translate_on- G) y8 J. Q; q5 ^" e% i
12
9 P k1 S9 _" @+ K0 b 13 module tb_sram_wrapper ;
2 C- x- Q& H: P W 14 / T4 N# d/ K9 h$ Z
15 //
7 R- @2 D) t& V+ u 16 // clock and reset signals' W9 _3 N7 Z( W+ P. [. r2 d+ {# }8 L
17 //
. C6 ?( P( H" w5 S/ N 18 reg wb_clk_i;
$ n( S$ a- \! w: `( Y+ R0 a 19 reg wb_rst_i;$ \7 E% Y2 \3 {7 c9 q
20 + u& \& Q; K' Y8 J
21 // *****************************************************************************- ~' r! p5 i* C5 A! Z! S6 G! Y( N
22 // wishbone master bus functional model. t+ r$ H8 p, [/ U$ U! h
23 // *****************************************************************************
$ {2 u$ a& P( }# x# [8 Y3 F 24
' w! @+ p# G, A8 S% B# M6 z 25 wire [31:0] wb_din_w;% b7 ]7 c+ [, ^3 g6 ^- Q9 Y
26 wire [31:0] wb_dout_w;
; i( A, `9 s! y! c- Z6 _: Q, T 27 wire [31:0] wb_adr_w;
: E% J! s' j3 Z/ \* |# T+ I 28 wire [ 3:0] wb_sel_w;1 c U: n( A2 D7 s8 e5 D' k
29 wire wb_we_w;% [# I$ {6 G* Q k0 V( p
30 wire wb_cyc_w;; A/ J2 e, w. m. J. U* ]
31 wire wb_stb_w;
) Z1 C8 F# }% W8 w2 u 32 wire wb_ack_w;
2 M) F1 C* d# P* C 33 wire wb_err_w;
& h V8 J2 c: F5 c' \ 34 . B0 }1 u' [5 n+ @# h
35 wb_mast u_wb_mast(
$ I0 S( i" W% o' G Y 36 .clk ( wb_clk_i ),
0 P& e. w+ `2 W: ]7 q( [8 d 37 .rst ( wb_rst_i ),
! i+ H# ]3 Z3 L( h: ]9 \ 38 0 y8 X @* M; S2 e% ^. R. r
39 .adr ( wb_adr_w ),
. E& r/ A. t- m. _5 m' d 40 .din ( wb_din_w ),
3 Q4 j1 _" q8 o8 S- R. C. T 41 .dout ( wb_dout_w ),
% ^' q0 M& m+ w9 `# @* c( I$ P7 ] 42 .cyc ( wb_cyc_w ),1 @- {8 b% K; K
43 .stb ( wb_stb_w ),
9 S. M0 H2 B- p. {1 i5 t3 P v, r 44 .sel ( wb_sel_w ),
# n% X+ o, b, B* R' m$ m 45 .we ( wb_we_w )," T( S# Q1 w' O9 H' E
46 .ack ( wb_ack_w ),
7 q# j6 e2 b6 S8 x0 @2 M" } 47 .err ( wb_err_w ),. |; H) z( }+ ~% w- V7 i" g& P
48 .rty ( wb_rty_w )+ j X! k: M+ J5 h; }
49 );
( g& h0 ?' y6 k4 x' C1 p 50
( S3 R: b% P2 H+ f- y! U; N7 ] 51 // *****************************************************************************
5 `3 m3 x6 s' x 52 // sram controller/ m6 {' K5 N; z1 c; R D" L5 W, y
53 // *****************************************************************************
! ?% k' w; b8 @* [# h# w 54
! o4 s( S8 _# e* w+ W, C 55 wire [15:0] SRAM_DQ_w; // SRAM Data bus 16 Bits! C. c/ W0 u+ R6 u
56 wire [17:0] SRAM_ADDR_w; // SRAM Address bus 18 Bits
8 T- D# W+ }3 G! M 57 wire SRAM_LB_N_w; // SRAM Low-byte Data Mask* q6 b- P: z0 x' Y: f7 e a
58 wire SRAM_UB_N_w; // SRAM High-byte Data Mask3 ^$ o7 G2 `/ {8 K; s" |
59 wire SRAM_CE_N_w; // SRAM Chip chipselect+ k% R6 v6 K9 `+ a8 R! s6 |
60 wire SRAM_OE_N_w; // SRAM Output chipselect- u) M: f! z0 J) p; s) f# N# K
61 wire SRAM_WE_N_w; // SRAM Write chipselect) E0 {; t* k3 n( m
62 3 w' S, r5 ^9 e
63 sram_wrapper DUT_sram_wrapper(2 p" |1 S$ X$ C
64 .wb_clk_i ( wb_clk_i ),3 j6 q- t# h" @6 {: h$ b
65 .wb_rst_i ( wb_rst_i ),! x# J# m* {. l' T% i) P$ `
66 H* M% V& ?5 p, P% _ W
67 .wb_dat_i ( wb_dout_w ),0 j7 \+ `/ w2 e! z% B
68 .wb_dat_o ( wb_din_w ),; Q) G) E( r- Y% ?' C; p4 Y
69 .wb_adr_i ( wb_adr_w ),
( S9 Y) k( w- o% }3 d2 C 70 .wb_sel_i ( wb_sel_w ),
/ v+ z+ D) j' K6 o) ?5 S* ^ 71 .wb_we_i ( wb_we_w ),) A; E+ n4 D0 H; K0 {& [
72 .wb_cyc_i ( wb_cyc_w ),
9 H# R/ h, v" [+ V 73 .wb_stb_i ( wb_stb_w ),
" B8 `: F% d1 e+ D- g! ? 74 .wb_ack_o ( wb_ack_w ),
1 ] @3 G- V: { 75 .wb_err_o ( wb_err_w ),
8 n% {; i3 P# k% E2 H 76
c! a1 P* @; u& T& r+ R 77 // SRAM" M H- F3 D, m& b! S
78 .SRAM_DQ ( SRAM_DQ_w ),
5 F, b4 b" N1 o 79 .SRAM_ADDR ( SRAM_ADDR_w ),
X0 V# T9 ^- C" y9 _ 80 .SRAM_LB_N ( SRAM_LB_N_w ),2 R' X( W6 |) t# [: ~1 O
81 .SRAM_UB_N ( SRAM_UB_N_w ),7 e: H6 i0 K; o! ~: U
82 .SRAM_CE_N ( SRAM_CE_N_w ),1 t `9 H6 ]' u2 ~. `& b
83 .SRAM_OE_N ( SRAM_OE_N_w ),. u P \+ q5 ]7 a1 q9 b# ?% Z7 B
84 .SRAM_WE_N ( SRAM_WE_N_w )5 {* u4 }( U6 T0 e5 K) g. v
85 );' V) x( B, Q' q# p' q
86
+ S2 g5 v# U/ u4 l0 U1 S' ^ 87 // ****************************************************************************** }* k: o) D1 F; s
88 // sram model+ H7 R, u& F1 Y/ x
89 // *****************************************************************************
0 N \) x+ Z; d4 @) n6 M6 X; B; \ 90 0 g' h6 D2 T2 x0 ]9 M
91 IS61LV25616 u_sram_model(3 l4 L$ u. T |. ^3 i6 ?3 r# ^
92 .A ( {1'b0,SRAM_ADDR_w[17:0]} ),/ g1 j s; m. c. f5 E
93 .IO ( SRAM_DQ_w ),
3 a7 P1 Z- \7 k$ M! k+ M( ^ 94 .CE_ ( SRAM_CE_N_w ),; {* Q' C7 L) p
95 .OE_ ( SRAM_OE_N_w ),
" G# \1 t3 y2 e& `6 o& U8 O 96 .WE_ ( SRAM_WE_N_w ),0 y* Y0 z i0 b; y& f
97 .LB_ ( SRAM_LB_N_w ),: ?9 l* l0 L$ C
98 .UB_ ( SRAM_UB_N_w )) D- ?* o- L4 \! k6 V
99 );
, Q, W. o$ K. Q; j2 g100 . Z. B9 j" g2 q4 |9 r6 ]2 Y
101 6 v a5 J7 o$ I* H
102 initialbegin$ V1 a5 e. S+ ^" K
103 wb_clk_i <=0;1 f! A% p* x( I0 z( C+ m) h
104 wb_rst_i <=0;: ~) t2 u% g4 S1 {% u$ L' f* P
105 end
9 X* V7 s) i8 @106
4 J- `1 Q+ X2 e* P5 f107 always@(wb_clk_i) begin7 X9 h6 Y5 |/ Z* X: W# k; g
108 #10 wb_clk_i <=~wb_clk_i;
; q9 [1 Z' h) a1 j; R: C# K Y109 end
+ `8 }- u- ^/ z4 e. M110 ! g# B- e% |7 K6 x/ m
111 reg [31:0] tmp_dat;% W0 {7 I+ Y- J% L3 F5 U
112
4 k9 r4 ~& q$ O$ [( V+ Z113 reg [31:0] d0,d1,d2,d3;
4 F. V$ t% d* R# j3 l6 v; j! }* x114 t) h9 Y6 X$ _" W
115 initialbegin
2 e( z) L. F# a116 repeat (1) @ (posedge wb_clk_i);
) Y+ Q: g( k4 Z# u' E117 wb_rst_i <=1;; ? H$ s/ f- w& d
118 repeat (3) @ (posedge wb_clk_i);
4 X' F( _' S# g119 wb_rst_i <=0;
* ?, b. T! ^" ?( u120 //write your test here!/ G, [( T1 x- l# Y0 M0 N
121 repeat (1) @ (posedge wb_clk_i);
; r2 y: l+ f" w9 R122 u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd);
7 E5 w; |* J/ J* D- ~8 D% l123 u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);% p0 Y- M/ s. d5 }/ c, i) t0 N% q
124 u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);
7 d7 U# C" c( T# L125 u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);/ C( [. r: H' \2 u5 k% V
126 $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);7 F5 T. o8 D- W5 w# d2 a# \
127 //adr,adr+4,adr+8,adr+12; N0 M2 _( i% ^* w$ ?
128 u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04); d1 W; e+ b0 Q1 y6 C
129 u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);
* K" Y/ a+ d: ]2 Y130 $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);
* x" U6 d4 a: W9 ~131 #100
1 z+ A+ t# O4 i9 U) Q132 $finish;
8 @' |) x' F8 n# O1 W5 d133 : a; G, V3 I3 R
134 end8 T! e) G% n, ^/ Y* V1 P3 ]% t: l
135
( l9 e+ A% ^/ l) L# H% z136 initial
& d( \ ]" m. p* ^3 E# Y+ G137 begin
/ S5 p' q+ O0 ~ ^3 o# G$ Q138 $fsdbDumpfile("sram_wrapper.fsdb");
; J! g3 A9 P6 `1 X139 $fsdbDumpvars;
' d# }4 u8 {7 ?+ M s& o140 end
" U$ O. y' | _; H141 endmodule2 V2 ~) ]$ S5 m% a6 A6 t2 \
& V5 ]4 ]3 W B8 f* t
8 J5 {' Q; Y8 M! M- c
仿真结果3 D# |0 @1 j$ K! A$ S5 v
( E4 ^' r. x) |+ ~# INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)
# _: a6 `8 b8 F5 n# 6 ] t5 h, P3 t, m2 Q6 n& D
# 571 readfrom 00000000, value = ddccbbaa
' J; e/ i4 F+ v1 r) ^. O#
I ^& c* Z! R8 a( ~+ H/ E# 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 00000004
/ k; E) u$ C" w1 T U#
0 O0 d2 O2 w/ w5 e0 M, n7 M& H0 D& V2 `5 s, V6 V4 Y2 ^
没有错误 S2 z" F# I( e
9 H; v8 L: ~9 }8 q5 a* JØ Sram_wrapper的soc系统仿真验证
3 h) @4 q5 F; g# p% ?( t
* L: X5 Z6 h. W5 s( c加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示7 C9 P/ t+ t3 S: h! T8 ~
( ~8 _. U. z" @' c 1 #include "orsocdef.h"- B( ?# b' ~, C1 z2 C
2 #include "board.h"- d0 n& e2 c0 [& ^
3 #include "uart.h") c2 i# W/ x5 H# o
4
- D6 d" v( q4 u& v7 m' j6 D 5 int
$ h, T8 U0 _5 y3 K) p 6 main (void)3 Q; q9 ?4 A" L; r$ ~4 V2 P
7 {
5 h8 Y% F' }$ N4 ^" D( n0 A 8 long gpio_in;
. T% Z2 X# |; z, X. {+ n 9 REG32 (RGPIO_OE) =0xffffffff;, k* W5 p9 E+ c; B) [" r5 U/ L
10
, Z8 U9 S' A+ ]' n' Y11 uart_init();
5 h" {$ N* z4 R$ K! M12 9 h) B1 u0 A9 `- V0 y; ]& g5 m
13 uart_print_str("2Hello World!\n");5 }9 q) m* v3 ?* w
14 " |7 b; F: }( E6 ~/ \
15 int i;5 d/ D y' U% L
16 int t0, t1;1 k2 S! M9 L' O+ i x7 F* O3 g/ z
17 t0 =0xaabbccdd;
0 O: ~# R- w: x3 n( m, X1 d4 i- k6 g18 for(i=0;i<10;i++){. {7 }! B) @9 c' c/ |
19 //REG32 (RGPIO_OUT) = t0;) A1 L2 A* n) T1 x @' j
20 REG32 (SRAM_BASE + i*4) = t0;
- `2 ^. s5 E6 m$ {21 t1 = REG32 (SRAM_BASE + i*4);* Z9 w& F' D N7 V2 O ?
22 //REG32 (RGPIO_OUT) = t1;
. i* ^* f U) e1 V+ n2 M23 if(t0 == t1)
2 c: }5 L% C* a# N24 uart_print_str("correct!\n");
9 K: W3 G9 \% D2 I9 C& v" X" D; K25 else
$ O3 [3 F1 p# n+ ?6 I5 ^26 uart_print_str("error!\n");
$ u9 T! w4 O2 A* B& K/ B( d! w9 S( F27 t0 = t0 -0x01010101;8 W0 e) q. r' y9 s- s; P' i
28 }7 U/ d! U' c7 ?% K
29 " d. W, I$ A% x' Q$ o
30 while(1){
, k# A! ^$ \9 D, z' p6 M31 gpio_in = REG32 (RGPIO_IN);
" F* ], z1 s: M1 M- ^% P32 gpio_in = gpio_in &0x0000ffff;
( z/ d+ s: ~/ F2 @" G3 M33 REG32 (RGPIO_OUT) = gpio_in;9 B% ^8 x) m9 T$ m
34 }2 n- j! q" m! N9 A6 C6 K
35
% ^* U5 ~. m( c- q36 return0;$ W1 @( o m I# r
37 }
7 s# U- t0 y }1 u5 `1 h+ j
$ D1 R6 e( y! L( z0 N0 _+ k3 K/ A( D! y1 |% Y! _% A! t
仿真结果
1 T5 j2 q" o+ e+ s4 |8 ?9 s
' B+ _8 |8 G. [5 Y3 }# [# 2
- v! [8 K ?% I# H4 \, H+ R* ]+ ?2 i. e
# e) C$ W5 @; A: u# g. r; Z
# l4 B8 u/ K& }( [- i% R3 c" W8 V0 }
# l
$ f& i, c, ~/ z7 u* c# o( z1 n& z) u* c9 @8 P% f/ [
#
0 R# b3 N d5 p# W% h M$ {& Z2 E2 c' v
# o
. s# K. S1 U$ C6 W: A5 @3 A5 U# r
* X8 `) @- u0 I, k: z2 ]% i# ?' \: B# l
5 a- }( F$ k) ^0 K8 H( I9 }# d
9 \7 u! \7 B+ K, Y/ a# !! t6 a1 N; h$ t; {; }
# 4 G( P8 Y$ P+ x" k
#
3 w2 C7 C; Z2 P0 m# 0 C8 X X9 d4 L
#
! R- b! J1 T o2 p+ V! N+ U# c2 L$ W2 Q' _& h
# o
' d7 z3 N2 l, ]" ^# r/ x/ U+ s; P' k! a
# r
& D( c& m) K6 o; J& K5 ~# e
' Y3 h; h- e; V9 @; z; b( Y% Q9 G# c. v4 Z y- K0 O, o! j2 C4 E- i/ }
# t
5 @3 A/ a3 W: e7 E0 k, D# !
5 q+ O) \6 W# y7 h… …
) x/ N3 H9 X4 ]# G/ y
" O3 I p# }. y; R8 s( E- Z6 a' W在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。
7 c# X& W6 h* k# H
% O H* I5 u |0 n% cØ Ssram控制器的设计与验证
- y. T8 o# z9 j0 R- `0 i5 O8 `+ s! o [4 X4 C$ L
Ssram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。; R7 c3 i* J/ G
5 r' W+ i; k% ~5 ~* S关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下! h7 S6 `0 H- \. r$ X
* I9 Y2 R+ g% Q4 U0 @8 Z' e( ^
. e" ~+ Y6 [% Y! F+ y9 m- h 1 //----------------------------------------------------------------------------//( z/ v/ q3 M& R) b8 ~; P' d* \
2 // Filename : ssram_wrapper.v //2 ^! ^) f/ O. ?
3 // Author : Huailu Ren ...() //
A& u! e8 C s/ p& b' T 4 // Email : hlren.pub@gmail.com //; `8 [( p1 s# n2 e) _3 N. F
5 // Created : 23:54 2011/5/17 //
/ A o* @; V! @7 t 6 //----------------------------------------------------------------------------//4 S" H% ]$ }( _4 J) j6 q: A3 K9 b% o
7 // Description : //- |0 m. V: @- U7 z' @; T0 ~
8 ////+ ~8 Y/ |" R! g: j& C5 K
9 // $Id$ //
K8 Z) F7 G" v1 M1 ^: e0 \! w. X 10 //----------------------------------------------------------------------------//
" d4 h" R3 H7 G5 r: R3 Y 11
+ ~! M, B1 b: [# Z1 o1 X. C 12 module ssram_wrapper( T9 P3 C0 j# x3 J' }) o
13 input clk_i,
$ ~& G; v8 T1 P Z 14 input rst_i,
$ q$ _* U! A( C1 b/ s! K) J 15 % U, c' C# v# R0 F. B
16 input wb_stb_i,7 ~5 \2 w! H6 P. a0 K5 {# Q
17 input wb_cyc_i,- S' W8 F4 R" d$ P. p
18 outputreg wb_ack_o,
7 m: |0 h$ ~& s8 X) P2 B 19 input [31: 0] wb_addr_i,) h/ Y# `& P# R Q: G0 }$ b1 Q/ x( M
20 input [ 3: 0] wb_sel_i,
1 I% m0 N! ? T+ C! W 21 input wb_we_i,
4 z( d3 F5 d A8 L B1 s 22 input [31: 0] wb_data_i,9 o$ z6 W0 _' _+ z% J! e( m
23 output [31: 0] wb_data_o,5 h. T' D& z0 D7 X( C
24 // SSRAM side
- X6 c( _% T0 E0 D 25 inout [31: 0] SRAM_DQ, // SRAM Data Bus 32 Bits
* I( F# H5 V/ [) Q4 ^( `, [ 26 inout [ 3: 0] SRAM_DPA, // SRAM Parity Data Bus
5 K4 I# ^' j6 l5 H2 j 27 // Outputs ~4 t" l( _6 C' ]% M5 P
28 output SRAM_CLK, // SRAM Clock
9 z$ ?( Q! K* t5 a 29 output [18: 0] SRAM_A, // SRAM Address bus 21 Bits2 m+ W& ?4 f6 o2 K
30 output SRAM_ADSC_N, // SRAM Controller Address Status
; H, X% j. n- c) G4 n- a 31 output SRAM_ADSP_N, // SRAM Processor Address Status
, ?3 J' K3 c& b4 j# r 32 output SRAM_ADV_N, // SRAM Burst Address Advance2 s- L* _2 s- t A5 c1 h! m& k
33 output [ 3: 0] SRAM_BE_N, // SRAM Byte Write Enable2 E5 k2 X! K# ?
34 output SRAM_CE1_N, // SRAM Chip Enable" U" M" l7 O6 W4 F
35 output SRAM_CE2, // SRAM Chip Enable4 A% ^8 s( I/ T: S4 i# R
36 output SRAM_CE3_N, // SRAM Chip Enable& `0 x4 V( R& T) E2 t
37 output SRAM_GW_N, // SRAM Global Write Enable8 y) S1 m) R# b; n# U
38 output SRAM_OE_N, // SRAM Output Enable# a( t6 j6 n9 N: k
39 output SRAM_WE_N // SRAM Write Enable. g; w5 ]% e! M
40 );/ b7 k% y% `0 A7 F% {$ x
41 . I% L* h9 @2 P9 w I8 ?5 ~
42 // request signal
& B+ x v/ K: } 43 wire request;
+ G7 M! r$ m) x* r- Y' T D 44
; @" A0 @/ B- G) w& U7 f 45 // request signal's rising edge
4 g7 ]. ]: D& ?. h3 M 46 reg request_delay;
- h+ l6 }: L2 c+ T4 c S( | 47 wire request_rising_edge;/ N1 z _5 z. K i+ [
48 wire is_read, is_write;" S( r! N; U( o
49
# R3 B* o1 P9 G/ K$ H6 p* S% F$ R 50 // ack signal4 G6 b; x3 e; ^: T# ]4 X2 y4 I
51 reg ram_ack;. z& N6 ^9 z/ g8 r$ `3 j5 V! }
52 / {/ w- B, g' ~5 E+ I. o
53 // get request signal/ K' x4 j' t, a
54 assign request = wb_stb_i & wb_cyc_i;
; y+ y& a" u7 ~ 55 % g. m; C; E+ e
56 // Internal Assignments0 @: B+ d7 i( s# `( L. U
57 assign is_read = wb_stb_i & wb_cyc_i &~wb_we_i;6 H$ R7 A2 x0 G y" @" G; r8 X [# O
58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;
4 V3 }0 o0 K+ D9 S! ]1 u3 Q3 k) d 59
! F6 _# }8 H4 y |% M, m 60 // Output Assignments& K5 g' M) `3 H4 W; N2 C; ~
61 assign wb_data_o = SRAM_DQ;
* P: Z3 z! C) F5 U( V9 v% u 62
W7 W- s# p6 o 63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;7 k! h2 `6 Z) D o, t6 P
64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz;% W; |* [3 z+ q. h8 v$ c
65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;8 \- ?" \+ {5 ]4 @' `
66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;1 R+ }0 ^' i9 |, ]. w* ?" b7 @5 Y: |1 x
67 # ]9 z+ j! f+ L! H3 K' u9 S
68 assign SRAM_DPA =4'hz;
5 q8 f6 k7 ]/ ^/ I5 g) @+ d) c$ F 69
- N! | o* l: x0 C7 d# M# n6 [ 70 assign SRAM_CLK = clk_i;
* u. L5 H/ H5 y$ \( [: J% P+ s! J6 A 71 assign SRAM_A = wb_addr_i[20:2];
8 m5 Y9 z% j" i$ @- m- S2 j 72 assign SRAM_ADSC_N =~(is_write);# ^4 @, i+ u! L4 M
73 assign SRAM_ADSP_N =~(is_read);
8 u, Z) z7 v# R, {# n2 T+ f 74 assign SRAM_ADV_N =1'b1;
8 M( a& T, Y2 B; D8 R) f; R 75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);* q4 M, y2 n( D& w; t; W2 {+ ?
76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);
" B! X5 Q/ Q% l/ S 77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);
D$ S0 l) F% V9 h: k# U 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);
/ l* I* C N2 q$ ?( m. b1 I) w 79 assign SRAM_CE1_N =~request;
- r) t! w( V s9 g4 l& L 80 assign SRAM_CE2 =1'b1;
: X3 D8 u# y9 }3 d9 D9 n 81 assign SRAM_CE3_N =1'b0;# L, N/ s- {. [0 d$ p
82 assign SRAM_GW_N =1'b1;
2 ^+ `4 }$ J9 ?/ A; m9 m 83 assign SRAM_OE_N =~is_read;+ D6 v/ |. g) r# `7 c
84 assign SRAM_WE_N =~is_write;
- [8 r6 n0 ^; }7 h 85
' n& q2 s9 K# o& p; P( E 86 // get the rising edge of request signal$ D' w9 j7 a0 U' M4 g
87 always @ (posedge clk_i)% z: P$ Z, p7 a3 t7 ?/ \4 I
88 begin. W/ k- \% A# @! d* N# ?- q L
89 if(rst_i ==1)
, B+ r c5 r# \3 n; q 90 request_delay <=0;, \/ e4 h. N5 w; K6 `* H
91 else
. \ ]) F+ N6 z+ O 92 request_delay <= request;
; f' L+ I4 [* ^8 P% N 93 end
' M; B9 R" z1 p& {4 k9 W 94
0 [% k* ]5 s5 q) @+ D* ^0 j7 c! i 95 assign request_rising_edge = (request_delay ^ request) & request;
4 F" }( r5 o& ]( T. Y1 n. V$ e 96 , P1 Y) v' i& D9 H: K) u* [: Z! ^
97 // generate a 1 cycle acknowledgement for each request rising edge
6 {8 Q+ w/ L" b5 @4 a0 ~ 98 always @ (posedge clk_i)
; {, P% T9 B# r4 g6 N$ i 99 begin" d, h( d' c9 \' c/ J! T
100 if (rst_i ==1)
" S" E Q/ @8 W3 c101 ram_ack <=0;1 _! u4 _0 Y" |2 F5 l5 T
102 elseif (request_rising_edge ==1)8 _/ d- g) q- D3 ?
103 ram_ack <=1;
+ g% _2 j9 g: U) o( A6 ]104 else
5 d9 o2 Z# A6 s8 F! i$ Q. s' c105 ram_ack <=0;
4 N6 G: ~6 s, P M9 V( E& |106 end! h$ Y9 Z4 I5 i$ M6 w! s
107
( O" }! M" Y( d) ~4 d$ e. v108 // register wb_ack output, because onchip ram0 uses registered output
( f$ B6 [% l7 v! h: B4 M109 always @ (posedge clk_i)% @6 k& Y% r& P7 r
110 begin
; i8 x. ?' p2 p$ x/ C# P) Z111 if (rst_i ==1)1 s- k! v3 G6 N* q& u, _. {
112 wb_ack_o <=0;
, z7 }4 y" `4 {. |/ k! t113 else$ l# C2 V# ] Z, L! l
114 wb_ack_o <= ram_ack;
" a" Z. o0 Y: {115 end6 v _1 @& T% ^3 g
116 3 b% X3 X D' d6 n0 h
117 endmodule, E- K9 T% |! `& y. n
! l, P0 v, X' R4 V# y: K
% k S4 m$ e1 k8 S o6 I) C并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
2 |9 {( S: D! N* O% V t8 a8 _4 L3 [# ~( W; Q8 G1 b/ w. j
源码可以在这里下载
6 X0 L2 U* \) I6 E0 C, _" u% h& u( c7 m) W3 t& N% p
稍后。。。
# h5 v/ O: R. u' u4 [To Do
- o. K- W% t6 _+ k6 G
2 O0 ]& a3 f* _5 c% h用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
8 r4 P9 u3 @6 J9 a' Z2 `修改以下用所写的sram_wrapper移植到DE2-115平台上
# Y/ v3 \9 Q9 q& E/ S: ?& rTo Do--关于opencore,or1200的soc平台
8 ^+ Q, z* y4 W1 U# l& x3 d# g' u
) q4 Q# A8 }2 i5 Y6 I9 y5 wOR1200的引导方案设计(基于硬件或者软件uart控制)0 O! |: U+ q( h0 ?( w
移植uc/os II操作系统) E5 R9 i6 h9 t: U5 R0 T: F
驱动起来DE2-70上的网卡 v: E+ l$ d3 q8 r" t# m8 K5 l' K
加入jtag模块
" P" S8 [, c7 O" H+ i移植u-boot
' m0 M1 R5 ] q移植ucLinux! S) A. u: k3 F5 r+ V/ P3 u
…… |
|