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