TA的每日心情 | 怒 2019-11-20 15:22 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 z7 l4 X! M7 e4 F; A6 O- O J
Ø DE2-115和DE2-70的存储器配置
2 P/ W( k j; s& `
' P( i8 |, X& p) d4 BDE2-115相对于DE2-70在存储器方面有两处不同的地方就是:其一,SDRAM容量加倍了,但是DE2-115中的两片SDRAM(32Mx16),在硬件上直接连在一块了(像ADDR,WE,CAS,RAS这些信号两块SDRAM都是共用的),若用就只能把两块32Mx16的SDRAM连在一起当做128M的SDRAM来用;而DE2-70上两块SDRAM(好像各是16Mx16)则是分别控制的,既可以连起来用,也可以分别当做两个独立的SDRAM来用。之所以这样是为了节省信号线吧,但却给DE2-115板上的资源利用带来了很大的不便,比方说,我现在要用友晶的D5M视频采集模块来采集数据,搭建SOC系统,来验证我写的H.264视频编码器。D5M中的DE2-115的参考设计是把整块SDRAM(128M)都当做是视频流的buffer的,这样也忒浪费了吧,况且我如果再搭建SOC系统,移植操作系统的话还有什么资源可用呢(需要把编码生成的bitstream数据通过网口传送到PC机端验证),那便只能拼板,而查了一下两块DE2-115拼板用的HSMC排线,居然要3000多元钱。而DE2-70虽然sdram和FPGA的容量不如DE2-115但却可以满足我的要求。其二,DE2-115的sram,又从DE2-70的32bit 2M同步SRAM(SSRAM),恢复到了DE2(DE2-35)时期的16位SRAM时代,我不是很懂,是SRAM的价格比SSRAM的价格要便宜吗,不过我知道现在的软核处理器(OR1200)都是32位的SRAM控制起来要比SSRAM麻烦得多,得在32bit和16bit之间反复转换。: E2 l4 i g* I/ l/ N6 A. y5 q6 O' J
. B6 S) R. ^ B2 R k# ^1 [- JØ Sram控制器的3中验证方案. R( { T: B$ \5 |( ^' f: l
$ d0 C9 u5 P* h+ f
本文设计了设计符合wishbone规范的SRAM控制器,用wishbone的总线功能模型BFM作了验证,在FPGA(DE2,DE2-115)上实现和验证,本文已给出了DE2-70上的wishbone总线规范的SSRAM控制器(用opencores的yadmc核来控制SSRAM,实在没有必要)。' r2 I4 B7 r9 {9 }$ b
% U3 u7 r. Y+ O3 p0 H5 k
+ k4 ]& k9 K, a) {) W
g' Q, k9 q) W5 g+ t" T& G以DE2上的256K x 16 IS61LV25616为例来做研究吧,其实DE2-115上的SRAM也一样。需要用到IS61LV25616的model。
2 c6 }/ _, A4 U) n$ J% Z7 i# f9 u" L3 j+ X
我觉得,Sram_wrapper的验证方案有以下3种,第一种直接用BFM和所写的sram_wrapper相连,读写数据,第二种用BFM作为master接口,sram_wrapper作为slave接口连接到wishbone总线上进行验证,第三种方案是对整个soc平台做系统验证。第二种是否没有必要?' q7 n# |. K) o I v
6 x/ P4 w( ]8 F* X" h" GØ DE2中sram控制器的时序要求
7 g) H2 c3 [: }: G: |9 K0 \
: \: H- B5 m* E6 XIS61LV25616的一些常用引脚的功能
! c' d' |+ r L5 y5 Z
5 V P/ T/ l8 f# \; ]# m9 t/ d: v2 y: i! O4 L$ e/ I
8 w; W4 F" h3 a& C5 T! F) L
读和写时序按照参照datasheet中所介绍的这两种方式2 N' E- [+ n( Y, B
1 K" E/ p% w$ |: |( H0 M% |
" B5 w3 v4 M) t# T
7 x# J1 g' l6 }& J) S
; R& B( u, W n# W
/ A1 `0 c% b, }在wishbone接口中需满足途中的基本时序要求。* _( W0 R9 ^$ i- b
# G, _( v. Y7 |5 ?9 Q& AIS61LV25616的verilog model在网络上很容易可以找到
8 h/ J! m9 E' C7 @, p0 N
7 ^5 }3 E9 N N+ G7 _( ^) M! k# x$ g* @( e3 u
1 // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.
" j$ N. s6 u7 {9 W2 |% W 2 // Note; 1) Please include "+define+ OEb" in running script if you want to check
; R0 [9 `( F% W$ E: x% t% u 3 // timing in the case of OE_ being set./ f8 {+ A' t) W: e, g: V/ u
4 // 2) Please specify access time by defining tAC_10 or tAC_12.. ^8 V' F+ h) e+ T
5 ' i7 E# ^1 ?3 w- S+ Z1 l
6 `define OEb
% F1 B2 s: j# o9 J( W: q 7 `define tAC_10 //tAC_10 or tAC_12 defines different parameters; d8 E/ x0 u' \* i j$ C
8 `timescale 1ns/1ns
8 j- Q% S+ g9 O/ A- F3 b# K 9
* b/ o2 @! U. d5 W2 u3 D5 {4 l 10 module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);+ F! C$ K* U! u
11
! O! ]0 a! p# m* U5 K+ C( V" \ 12 parameter dqbits =16;7 @! o9 v6 b8 i7 E' ~& P
13 parameter memdepth =262143;
: ~) e, D( @2 g 14 parameter addbits =19;
3 l. g$ M$ N5 P 15 parameter Toha =2;, B4 _4 S5 L+ C" B" P' e
16
. R4 W9 t- s2 I$ R: L; W 17 parameter Tsa =2;, B6 f+ |. B0 z! l! \6 ]+ V
18
6 q9 t0 Y3 q7 ~1 g 19 `ifdef tAC_10 //if "`define tAC_10 " at beginning,sentences below are compiled3 ]' n! K& U- Q4 @& |
20 parameter Taa =10,
! f7 l1 u' C: y! X 21 Thzce =3,2 e% D4 x; |0 Q- {! F' g
22 Thzwe =5;
, `. {. W5 C y 23 `endif
- ^& Q, u/ s( h" I, z8 s% K 24 T& _0 F$ u2 u& E
25 `ifdef tAC_12 //if "`define tAC_12 " at beginning,sentences below are compiled
# q) V4 d" w' ]( |2 h 26 parameter Taa =12,
, |5 F- H, N2 b1 e) U( n% j 27 Thzce =5,
# A/ I# y, t# a% J: B; y: N0 I 28 Thzwe =6;- O% K) e B' O$ o7 S: V
29 `endif1 j4 {$ p# a! q( q0 P( v
30 / Z9 t6 U% u8 O% l; ]5 {$ r9 y% \
31 input CE_, OE_, WE_, LB_, UB_;- X* S1 m% [8 }6 `
32 input [(addbits -1) : 0] A;( S9 [- z7 }8 @1 E# D
33 inout [(dqbits -1) : 0] IO;6 h* H: X+ s! A6 U. E
34
' \- { ]+ _% P: y 35 wire [(dqbits -1) : 0] dout;, ]0 P; h8 `: T, \5 \
36 reg [(dqbits/2-1) : 0] bank0 [0 : memdepth];
% W3 Q1 [- v1 @* T. c, R+ u m 37 reg [(dqbits/2-1) : 0] bank1 [0 : memdepth];; |, z v; X' q8 D- K, M7 j
38 //array to simulate SRAM9 S6 ]/ [ q' b/ R1 r) v2 w+ K
39 // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};+ r8 H8 k) _8 b0 l5 ?+ C0 I2 e
40
! w( C9 U) {3 e0 D8 v5 Y 41 wire r_en = WE_ & (~CE_) & (~OE_); //WE=1,CE=OE=0 Read. W9 M- m I2 w( L; v5 x
42 wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_)); //WE=CE=0,LB or UB="0",OE=x Write2 `6 h1 I: ]7 p- }
43 assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz; 2 l: D. F" e% ~) z: u$ W
44 5 s$ e, l4 i$ ]% D: a; s
45 initial
" Z; w6 D+ P; b2 M/ Q( e8 G- P 46 $timeformat (-9, 0.1, " ns", 10); //show current simulation time* E. y8 M" `/ e/ K# z% g
47
w0 j4 i$ h, g0 _' y3 X! s& y 48 assign dout [(dqbits/2-1) : 0] = LB_ ?8'bz : bank0[A];
7 k* i T! q+ m/ s4 K0 K& t 49 assign dout [(dqbits -1) : (dqbits/2)] = UB_ ?8'bz : bank1[A];& Z' j4 W9 t$ O
50
4 l9 @& a; d: @ 51 always @(A or w_en)# \' `4 V4 S8 _$ I
52 begin9 c* U( W! @, s
53 #Tsa //address setup time; [+ |5 I! q; q
54 if (w_en)
' D& S9 ]6 }4 h8 Y- {0 K9 J! z: V 55 #Thzwe
8 S6 ^2 d, Z4 S0 }7 i/ ` 56 begin+ Y0 b5 e7 _0 j( u$ J
57 bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2-1) : 0];' x* q5 @: _1 G4 n! b/ ?
58 bank1[A] = UB_ ? bank1[A] : IO [(dqbits -1) : (dqbits/2)];/ r2 ]; ~, ^7 J- E' @
59 end) h O2 l( E, e1 ]. k
60 end! D6 j0 G% w2 C) T
61
& M1 [6 ^* N9 [* i 62 // Timing Check. A. u9 d) o, Y5 J3 ^8 H
63 `ifdef tAC_10/ L. g/ b6 [+ R7 ~6 D2 f! A# _! ^& I# n
64 specify//sepcify delay9 \& C7 a0 R3 h$ }4 T4 E1 V1 B
65 specparam
! o; z4 t/ B4 k: l7 ~ 66 tSA =0,2 h) x) U$ g7 H
67 tAW =8,: o8 M+ @' J9 D+ u7 `
68 tSCE =8,: W8 K1 K/ B1 p9 W* P
69 tSD =6,) }+ B% q0 r- d$ \! \$ ]
70 tPWE2 =10,
1 U! K% X3 g. s4 \6 Y 71 tPWE1 =8,
. D) a' }4 d% m6 F( V 72 tPBW =8;
- N1 G: U+ v: o+ D: f4 i 73 `else
6 H9 Z9 I1 c7 [$ a' b$ @5 g L8 C 74
" n) g5 r& Z1 G 75 `ifdef tAC_12
" U! g) G' y u, J, p3 S 76 specify
) q: ~; s3 b: N; c" C% L2 | s) x 77 specparam6 q/ Z+ Z; r4 @0 g& ~% Z6 Q3 V# D6 m
78 tSA =0,
) I, P* t5 }& w 79 tAW =8,% n0 p7 a7 i+ H
80 tSCE =8,2 ]( O3 w# N# |/ I0 }9 \ ]0 y6 V% P
81 tSD =6," \2 N0 j1 \0 c Q: i0 Q9 @
82 tPWE2 =12,# K4 _2 r. P8 G6 h7 E* g" q; \8 f
83 tPWE1 =8,
7 _' f/ E8 ^- \- y 84 tPBW =8;
" u+ Y: \/ a/ [9 Z! u' B4 ^! M4 G2 ~3 z9 H 85 `endif) T: V5 G5 B2 [7 s
86 `endif
& P& s" A. ~2 h% @ 87
|$ ?6 ~6 z) O9 V/ Z6 W) x: U3 B 88 $setup (A, negedge CE_, tSA);
# a( L3 ^" V( ^9 O 89 $setup (A, posedge CE_, tAW);
* S/ {0 R, F- o s" T 90 $setup (IO, posedge CE_, tSD);& r$ j o4 W8 @3 O/ ?
91 $setup (A, negedge WE_, tSA);
& Z* |" n; Q0 A3 \ 92 $setup (IO, posedge WE_, tSD);; L9 q+ ]) z" ~- X) `2 o% g
93 $setup (A, negedge LB_, tSA);! I& g$ x& x: ]5 X
94 $setup (A, negedge UB_, tSA);
# O6 h2 `& u% { 95 / a) e4 l) q5 o& S) P
96 $width (negedge CE_, tSCE);4 u- u* T2 D! K* D
97 $width (negedge LB_, tPBW);) F6 z5 A4 B! E% B9 n4 s S
98 $width (negedge UB_, tPBW);6 g ^( ?; `) V4 G+ G
99 `ifdef OEb+ X- G {8 B8 E- {+ O
100 $width (negedge WE_, tPWE1);2 R6 v' Y D7 M
101 `else
' g. K) o" t, U5 B102 $width (negedge WE_, tPWE2);4 Q+ n9 e4 A. z) m5 \" H1 x, W
103 `endif
% Y- ^/ H# P+ m! t$ y: ]104
5 F; c' W& ?- V" d4 e0 Y105 enDSPecify
% b* ^4 i2 w/ [7 A% S; W106
+ [' y2 L0 }' ]5 K107 endmodule
6 d( x1 \ x7 c! l G. o* Q% V, q2 u' r* X2 M' S6 C
; ^9 {, K @: R7 e, j* p; g+ }
" s* r! Y" x6 {0 d+ f- N" ~+ {
Ø Sram控制器的设计* w6 V8 F: v5 d' X7 @
) B% A7 S& l3 t' _4 m# n
Sram_wrapper用状态机控制的,两个周期用于读写低16位,两个周期用于读写高16位,sram datasheet中的时序应该能满足,但是过于保守了,效率应该低了。
6 [1 A8 \5 G) @) D! W2 o+ L a8 G( n8 C. y3 t4 E, Y6 v( J( y
Sram_wrapper的源码
/ Y1 j6 k0 c' |8 h# ]" Q. T2 M t: i* v& F* {; V# Q2 G, h( M3 ~
// Author(s):, d& ?9 n7 y& d q' ?
// - Huailu Ren, hlren.pub@gmail.com. g6 t5 x+ \( x' U7 J! `8 h: x
//
* b% t$ }; p1 `+ r( }6 h9 r
. ~- F/ i' g+ y% e3 D// Revision 1.1 16:56 2011-4-28 hlren
, }2 Z& U; z& H6 ~# s2 ?// created
0 j4 m7 y) C* q6 U' D k& I! M//4 ]: G) q" C8 D
: }' b$ ~/ M8 G) E" w$ p// synopsys translate_off5 C2 R' w1 e0 N4 o4 j0 Y: v/ G$ b9 a
`include"timescale.v"# \; Y3 Q% z+ ]# a2 s+ |! ]7 g
// synopsys translate_on, `; u: a/ m0 {2 Z5 P( a. K! C# b$ m B
, Y4 M# ]0 J# W8 L" }2 Y+ [' U8 V
module sram_wrapper (& |* O" _$ x5 h7 E' i. D
wb_clk_i,# r! ^! ]- L) s! V2 N
wb_rst_i,
! X8 j0 \2 l2 j9 F2 E* Z/ T% g$ Y3 p
wb_dat_i,
; f8 j1 n% G7 @( K //wb_dat_o,
1 B1 @: y0 T2 n; F. F$ W, n wb_adr_i,
# g B4 c: l7 ]7 f3 c4 |5 g wb_sel_i,' T8 ~. {1 x5 r, ^+ _0 `$ O
wb_we_i,
5 _2 i, C$ D( N7 ^1 j4 \- W( p wb_cyc_i,
j5 f( t3 x9 G: S7 X wb_stb_i,( O$ [ [: ?1 {0 a8 {; w
, p5 c: g0 X* T$ `! g! i4 K$ z9 }4 Q! T l. T# r& I$ M3 W$ D
// Bi-Directional1 I; J. j3 ^" \8 A
SRAM_DQ,
# D/ j9 y @9 n8 z, Q5 \% \
, b, ^) Z" z$ p+ g0 a; x // Outputs9 m8 w" C. x" p M2 b3 j( t
wb_dat_o,0 F: Y0 ]; @. R: ?% `/ J* j g
wb_ack_o,- c2 Y( {$ y! ~: {1 {4 ~5 c
wb_err_o,
7 l7 S V5 t0 {7 l4 m S
) J; U0 J1 y8 \7 i SRAM_ADDR,
! p0 @( K" @! g9 }+ ^ SRAM_LB_N,
$ r% V* X3 |7 W/ r0 A SRAM_UB_N,
7 t! S$ X; g4 u' @7 J( C4 W4 W SRAM_CE_N,
/ O: A$ C! ~) w" b! n/ E SRAM_OE_N,
2 U9 b; x! A7 m Y1 V* `) F SRAM_WE_N
- l4 ^0 a1 J7 c# |);$ x ~. S! a2 @& Y8 Q* @
+ J, z" n* R4 [8 W//
, w, H4 l' I% a' i4 A// clock and reset signals8 @( x* x8 c2 \/ R. A1 F! N
/// l5 c( `$ W9 `+ r: s1 v) {
input wb_clk_i;
6 Z9 L' s! m" t% h1 M |$ A& g% f input wb_rst_i;' F4 ~" u! H2 Q) o( z0 \0 ^* K
//; ? ~8 z$ X; c$ p; [/ {4 g. E
// WB slave i/f5 }, }' U p/ z' p; |. i5 [$ y) T3 D
//
/ u# |8 v& E! |+ H) Rinput [31:0] wb_dat_i;1 W+ J n. ?% Q" d4 F4 B3 V
output [31:0] wb_dat_o;. f( c7 s9 }/ H
input [31:0] wb_adr_i;
" g( }# o5 \4 d$ x input [ 3:0] wb_sel_i;
0 V& P! D* h# N' I input wb_we_i;' D J0 e, {. t S, ^, o+ Y6 j6 Y1 Y
input wb_cyc_i;
/ q+ P! w! k* P5 E$ A$ i- U input wb_stb_i;9 H5 H _1 k& i, A# D D( P) C
output wb_ack_o;
2 p2 j1 Y* z. A" A5 M/ w output wb_err_o;! M+ a- Z5 y# S) }: Q
//* d+ B, I+ \( x! Z, v
// SRAM port5 c" A: Q+ ^* M$ Q
//
$ N( I+ }9 R, A2 R/ Linout [15:0] SRAM_DQ; // SRAM Data bus 16 Bits8 M0 U, P" J" L$ T1 O# Q# P8 w/ k/ X
output [17:0] SRAM_ADDR; // SRAM Address bus 18 Bits
4 I0 P, s% x7 n2 }output SRAM_LB_N; // SRAM Low-byte Data Mask
; v# n$ l# F- ~- I O2 \4 V- ~1 }% Coutput SRAM_UB_N; // SRAM High-byte Data Mask
6 ^4 Y) P. H8 U/ N( Qoutput SRAM_CE_N; // SRAM Chip chipselect
j$ ~: k: G& Moutput SRAM_OE_N; // SRAM Output chipselect8 f$ Y. Q1 J$ t D1 f. x
output SRAM_WE_N; // SRAM Write chipselect. r( K2 q9 ]7 T& V9 k
3 {# E2 i9 t9 c. F' s
reg [17:0] SRAM_ADDR;
! B+ Z2 d; o: l6 x! p3 C reg SRAM_LB_N;2 h1 B+ x7 B& Q# ]* O+ [& k! g- \
reg SRAM_UB_N;: @, j7 ]) e4 @- E* m' x4 Y
reg SRAM_CE_N;1 O5 i6 L* ]1 ~1 W3 f
reg SRAM_OE_N;
& m% G/ b E# P j% _. k reg SRAM_WE_N;. B; x5 \/ Q3 u: p( E9 T' X
# l6 _* \( p& B! l9 \
reg [3:0] state, state_r;
! P! Q7 h2 B- N! W% @# |' x3 f reg [15:0] wb_data_o_l, wb_data_o_u;
6 @, }+ ?4 s" T8 S5 E0 { # G9 G+ f! m% O* G( M
reg [16:0] wb_addr_i_reg;
5 D: _; [2 |* |) r$ Y" i* u0 r9 v reg [31:0] wb_data_i_reg;9 L, A4 ]9 H- j" Q. @6 Z& t8 F
//reg [31:0] wb_data_o_reg;
1 h* h* O; x1 V; greg [ 3:0] wb_sel_i_reg;
6 \" r& T: {* |( i3 `
8 R: R% S7 Z* ^; _ reg ack_we, ack_re;% q" x0 [) {& z ^0 i, `
// *****************************************************************************' B# E+ Q9 P8 I# G/ N e
// FSM
( M) q! l6 Y6 s$ f// *****************************************************************************! }) f# K1 N* X$ n3 [2 f
localparam IDLE =0;
7 {8 S" s6 x, j localparam WE0 =1;
- Q7 f! O: [7 h2 w localparam WE1 =2;2 }9 k, t# R' f- H* N1 d
localparam WE2 =3;% W) ^" S4 _. J) q; ?
localparam WE3 =4;
e! i/ N m- E% Q: I% P7 K3 D! u$ K localparam RD0 =5;
6 _$ M! w+ P# @% Z4 ~- @ N localparam RD1 =6;0 ~8 c3 x7 G$ C$ Q4 W( k( ]
localparam RD2 =7;
2 u2 P# G; M. m# ^# i+ `" p; e/ P localparam RD3 =8;# E, o h- q: m- a$ a. t4 p3 r- N
localparam ACK =9;# D5 H6 t. @7 v! g0 R4 _/ N0 m8 e' \
0 Z' |( {* X4 Z: N) K2 f
assign SRAM_DQ = ( (state_r == WE0 || state_r == WE1) ? wb_data_i_reg[15: 0]
2 `: p: J1 A' D6 d7 G9 ^ : (state_r == WE2 || state_r == WE3) ? wb_data_i_reg[31:16]
0 p+ d9 c h7 b' J& }! y1 ` N6 x : 16'hzzzz);
8 s L1 j) ~* ~: I# `4 _: @+ kassign wb_dat_o = {wb_data_o_u,wb_data_o_l};# ~- d( g7 e" C
4 n/ O0 U8 {" ~4 g assign wb_ack_o = (state == ACK);4 m! I0 k! c# G- h, v0 M
assign wb_err_o = wb_cyc_i & wb_stb_i & (| wb_adr_i[23:19]);
5 z! a! H0 v2 } + K8 a: v$ s3 e" W9 ]# O
always @ (posedge wb_clk_i orposedge wb_rst_i) begin7 g4 Q3 y' c! T0 q& |0 z1 j% d: ~' p
if(wb_rst_i)1 P* ~, Z: t5 j1 n/ L- j$ X
state <= IDLE;
3 o$ a# A1 |, j$ L/ i elsebegin
+ w: `+ P! D8 `4 g Z( X case (state)
& |4 z/ c8 A! T. K% g# p0 g w9 |# z- z IDLE : begin3 `7 @6 ^6 P, A' T+ Y( K' K6 M
if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we), _1 |, C+ U2 J- n+ @
state <= WE0;1 x% U0 _0 r! t+ P+ V, `( U+ s6 X
elseif (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re). \9 ~0 E+ b: c8 |* ?$ F- e
state <= RD0;
) p8 x8 P7 ]7 d e end
# f9 A1 R$ b, Q8 W) _6 ^/ `2 e. b; j+ N WE0 : state <= WE1;
, r# _# N8 s. F* S q WE1 : state <= WE2;
$ |$ ~& l6 q. Q: h; y; ], n WE2 : state <= WE3;
$ w$ K& t' K# ~6 \! i7 C WE3 : state <= ACK;' N& Z6 P* G, F2 W
RD0 : state <= RD1;# s! ~1 x& X1 A- o4 P0 Z
RD1 : state <= RD2;9 _" ?9 ^4 m7 L+ }" u, C/ q
RD2 : state <= RD3;
: S) w0 s% c S1 \1 E/ a! m' Q! w RD3 : state <= ACK;6 H- `' d: s ?: z H
ACK : state <= IDLE;
& A/ V( v8 V" t0 Y: h+ j1 f) O default : state <= IDLE;
/ E' R8 @7 }, E0 ?( X2 p& ] endcase# k7 g1 R6 ^7 j8 H/ E( f
end
1 N) ?3 o I- G end
( E$ }& D M, Y/ v8 z
9 X, g* c/ b; h2 W0 t+ R# d always @ (posedge wb_clk_i orposedge wb_rst_i) begin
7 |1 r, L1 v# o5 a. Y! \5 g& A3 S if (wb_rst_i)
2 v3 x1 R* Q4 i" ^' J state_r <= IDLE;
4 p7 a7 Q! W# Q8 l% r! C else1 P* y9 ~& @/ i
state_r <= state;
0 K# a) g+ f1 M& N end
9 X) z7 Y* ]( s; O+ z% g- {//, }( \ {" h2 T' g9 C: {
// Write acknowledge1 }7 Z7 B+ A% k5 ~* U9 f
//$ D, C# y2 e. ]- K7 v7 M+ E
always @ (posedge wb_clk_i orposedge wb_rst_i) begin1 Y- |$ d( a* ]: c8 Q- ~
if (wb_rst_i)1 m; Q+ b# h/ L" r8 E
ack_we <=1'b0;" [3 }: D2 t( p" m
else
) g- J) @9 r# U: F. X, ]' p) g9 p if (wb_cyc_i & wb_stb_i & wb_we_i &~ack_we)
+ G" M) o6 k9 q% d: \ Q+ C ack_we <= #11'b1;
* v# s; W+ d' c p- o3 Y3 X/ S- belse2 p) f7 A# y, v4 o9 Z0 Y) O, B
ack_we <= #11'b0;% ~% Q D, u0 `8 h# G) T3 E
end) v3 w& L2 Q1 z$ p; D% z
3 t$ U, m/ ?. H% w/ I% e//! U: O& k1 _+ j1 D/ h' j
// Read acknowledge. p: ?2 j& j; k* O' H" r
//
5 L; i5 ~. R3 k% W7 malways @ (posedge wb_clk_i orposedge wb_rst_i) begin
6 A! A. V3 A7 D3 Z3 ?' C if (wb_rst_i): i9 X$ m( |; `& K8 i. u
ack_re <=1'b0;
( P F( K# l" ^, l1 Zelse( |7 l9 Q/ q5 C. a& e
if (wb_cyc_i & wb_stb_i &~wb_err_o &~wb_we_i &~ack_re)
, \# y- y# H# Q- x ack_re <= #11'b1;
! y4 Z% ^* n' B+ r9 F8 j8 ^9 V& m* yelse% H3 ]) A9 Z3 E, R% v# ?
ack_re <= #11'b0;6 P! S4 N7 d4 {7 C- t
end
2 N1 I) k+ l( {# d" Y) a & u6 J, I- t7 A2 N5 R
always @ (posedge wb_clk_i orposedge wb_rst_i) begin
9 z1 O4 v* t3 Q. K# F if (wb_rst_i) begin
3 f! Y, r5 U; j! u8 v" s5 } wb_addr_i_reg <=32'b0;- u# n$ H+ ]3 O% z4 }0 h
wb_data_i_reg <=32'b0;& f+ e' k s5 Y5 D# i9 m
wb_sel_i_reg <=4'b0;
) A0 V3 i% ]$ T4 n4 vend
; W6 `* ~: ]( ?, r h+ U7 p else4 Z ^! L2 f0 t6 X# ]
if (wb_cyc_i & wb_stb_i &~ack_re &~ack_we)- Z- _) s& R/ u7 q4 v' e0 \" g3 q4 k6 y
begin
7 s5 M7 {6 D$ J4 P wb_addr_i_reg <= wb_adr_i[18:2];1 W0 v4 J5 a) v7 Z. |1 C
wb_data_i_reg <= wb_dat_i[31:0];
% |9 c4 G2 w+ k# r wb_sel_i_reg <= wb_sel_i[3:0];( e+ f2 w) p! K5 n2 ], L
end
1 n" `5 o1 U* @% c end, C& y% ^ V% V$ v6 Q) S) Y
# |* s b5 h2 [4 ^7 ^( m8 Q2 U
always @ (posedge wb_clk_i orposedge wb_rst_i) begin$ |1 ^8 N5 x& z: g2 J
if (wb_rst_i) begin
- H4 h3 L* f7 b( F) v SRAM_ADDR <=18'b0;$ z! F- I v5 r. c. z, w l
end
9 w* A* ^4 m. m9 F6 b" p7 m else
3 b# O$ ~5 p% H8 i6 } case (state)
& G/ @0 M/ G- Q) C: n0 \ WE0, WE1, RD0, RD1 :
& \1 |4 S2 B# R8 N4 t/ E; V2 @" T SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b0};8 G$ k, j0 |& Z* P! Z" o
WE2, WE3, RD2, RD3 :
# t1 [- O0 i4 i4 {( n2 R SRAM_ADDR <= {wb_addr_i_reg[16:0], 1'b1};
* s) }; n, g y- C: Q V- U. v. ]! edefault : SRAM_ADDR <=18'hz;/ I1 d, F U( s( [
endcase5 D/ v7 A6 W2 W6 n& ~ t
end
7 X: {8 i ^% _+ H0 w' Y- U " f' U9 I- M! U
always @ (posedge wb_clk_i orposedge wb_rst_i) begin) M9 o2 r- A/ G. w/ Q- I" J" Z- f
if (wb_rst_i) begin
8 \ X. l4 R2 ] E. q; W0 J6 q9 n SRAM_LB_N <=1'b1;* j5 z- r! ?& W. j7 ?
end
+ {- `3 Y' T$ V+ S$ N" o! d+ T else
- ^ U) v4 G N# g case (state)
4 j0 m5 w' K7 f7 n& k; E8 s4 ` WE0, WE1, RD0, RD1 :- K6 c2 m9 [6 d& t4 U) i
SRAM_LB_N <=~wb_sel_i[0];
) R$ a* B" {$ [& Q, y! e/ T4 x8 x- { WE2, WE3, RD2, RD3 :
4 ` }. o2 N+ y# P: c5 ~4 H! l. c SRAM_LB_N <=~wb_sel_i[2];
6 I/ U! L5 P+ R7 Q$ [" g default :; ^+ ? t; }( u0 e
SRAM_LB_N <=1'b1;! K$ E/ u" E1 T2 h+ K7 X
endcase
3 e! k% ]6 [6 Y% W7 I/ [; i7 }. l1 m end; f. Q2 ]1 J" ?$ K* Y* Y
" J4 X, ]# R3 G& Y1 r' l always @ (posedge wb_clk_i orposedge wb_rst_i) begin
/ ]6 B( t4 u+ x; K) P# l' A" Q if (wb_rst_i) begin' n) |& z; T$ u' O3 k
SRAM_UB_N <=1'b1;8 A$ D" h* \% a* u7 `/ D* P1 o9 v4 T
end* s. o5 p- Z* {/ N4 ]+ l
else: |+ F d. Y! \( \
case (state)# ]: \! k" K) f/ @. |
WE0, WE1, RD0, RD1 :
$ k5 H# X" Q7 n( t9 ?9 G8 r6 H1 @ SRAM_UB_N <=~wb_sel_i[1];
$ v, p; a7 X' P8 p/ }7 | WE2, WE3, RD2, RD3 :: F, w3 m. ?0 Q5 Z
SRAM_UB_N <=~wb_sel_i[3];
9 T! I( q# q" c/ w- o! Q default :. W5 d! @. a& C* J5 t" ^
SRAM_UB_N <=1'b1;
& i' b, ~' O* Bendcase
- x2 C) U$ W/ F' K- ` end
}6 n! n. T3 c" Q& Z5 n2 r
5 ~& a# U* N0 z6 b7 Q always @ (posedge wb_clk_i orposedge wb_rst_i) begin
# Y B2 d$ [% U' g( D if (wb_rst_i) begin
, X# K2 K6 [$ j SRAM_CE_N <=1'b1;* `# l8 k. z. S" e
end |( Z3 C C5 _$ s9 C# u, J
else
( G7 [ B9 S/ D2 X case (state); X+ ~% d3 @# @7 l. I, N3 ^" M
WE0, WE1, RD0, RD1 :) |8 @. W; B+ k* j, v8 u
SRAM_CE_N <=1'b0;
+ _# S, H$ U0 M: H WE2, WE3, RD2, RD3 :
8 W% H8 L/ [. b) G5 G2 G/ T SRAM_CE_N <=1'b0;
! A/ t; B. L) ?$ D" d; ?1 e4 C, X! _default :
! v7 h7 a2 F k4 x0 }. s' I, t SRAM_CE_N <=1'b1;8 y% T: Z$ M5 R* d- d+ Y' i
endcase
0 I; e! G( d. p' D9 l v8 Y) P end- [5 X. @5 d0 d, _- [
) C/ r; k! H4 M& c
always @ (posedge wb_clk_i orposedge wb_rst_i) begin
1 F# o; d6 ]$ |+ a if (wb_rst_i) begin
9 K$ E6 U! L0 N, H0 d SRAM_OE_N <=1'b1;
: J& |! d f! B5 j0 M# cend4 G: `0 e7 w" r7 u; T5 s6 W5 i
else
7 H& g- Y- ^+ ` case (state)
' B+ C; T3 l- Q' k! V RD0, RD1, RD2, RD3 :/ v0 `; P7 b" j7 M' _& B
SRAM_OE_N <=1'b0;4 \7 O' v5 W3 w: r* l( }$ Z
default :
$ U$ G0 f+ d; V. u% c6 e. N SRAM_OE_N <=1'b1;' ^6 F0 e# ^& w! e! a' t/ t2 w) d
endcase
( H% q8 _ ~9 b0 [: N end
. u( p+ Q) ]1 E% S) a( p9 m ( y/ Y# v) q! s. C( H% [) |
always @ (posedge wb_clk_i orposedge wb_rst_i) begin
/ s* X- @+ ^) d4 H) j if (wb_rst_i) begin
8 y- a; T# B5 w" _8 p: R SRAM_WE_N <=1'b1;$ o' m- _' l) [7 z/ b" @2 r
end2 F5 M: n6 z# l2 ^8 J! G& u/ {) E
else
6 v) `4 I1 Y" q- B: s& G case (state)
' s) c6 _5 g" }0 d4 z7 n WE0, WE1, WE2, WE3 :8 W. E# A/ B( ]$ J2 T' K- B+ c
SRAM_WE_N <=1'b0;
: Y2 Q8 {7 N* t" {3 Ndefault :
! _2 `3 T$ h4 M3 w2 B. Q' Z. c SRAM_WE_N <=1'b1;
8 k# e4 I" r5 ]' A- U9 Kendcase1 {( z; C; F7 x
end+ z# ^. ]: ?& Z5 H
//
% `3 i V! a( E2 ]8 E6 b6 V; F // assemble ouput data
) O, W' l) V- @0 \ //
- u+ D/ Z/ |" Oalways @ (posedge wb_clk_i orposedge wb_rst_i) begin
3 \4 i. S* q! i1 Z9 _( D6 v if (wb_rst_i) begin
/ l' ` Q* I3 l1 Y wb_data_o_l <=16'b0;* R9 ?: d* b% w2 B9 H5 M9 Q- h
wb_data_o_u <=16'b0;
! s3 S3 {. a) }, h4 Nend
6 E- y$ N( u2 O1 N8 W else
; I/ e" [: r9 q3 J) u! X) ~ case (state_r)
2 M8 P6 n$ l* |0 g RD0, RD1 :
. [# M; k; g, d2 m% K wb_data_o_l <= SRAM_DQ;% C) O; R# k1 u4 y
RD2, RD3 :
+ s! o D" _2 z6 n- ?( B3 @. U6 t) Y wb_data_o_u <= SRAM_DQ;/ A3 Y Y3 |0 ^8 ]) K7 p' @
endcase1 d0 Q/ ^" m# j, }, J: B
end
6 u7 K: |& i% Z8 q# o2 `endmodule
2 ~/ \4 A8 d; B
4 K; Q( `5 `$ ~$ k
! G- s* m6 P2 [Ø Sram_wrapper的wishbone BFM验证3 T) ]; k( i4 v) G
( }0 `9 S" f9 ~' A' y6 C% N
Sram_wrapper的BFM验证的testbench代码如下:
1 D3 C% z; ?" m9 m8 ]2 { A
9 o' n1 A4 F# q+ A! D4 Y0 ^
- z: {9 f) O1 H. E 1 // Author(s):! b3 H g" f+ n( V
2 // - Huailu Ren, hlren.pub@gmail.com
7 }- t0 B0 k% u$ E( [, M8 ^$ | 3 //
# _0 B. A; b/ Y 4 0 ^7 ]9 d, m+ O
5 // Revision 1.1 17:45 2011-4-28 hlren6 g, h5 V: m' k! C3 x
6 // created
6 ~/ v# o! L( e2 f0 u/ t- d/ O/ [, t 7 //) F6 P, u7 X& ?: y3 S1 r) U2 q: P; o
8
$ t# P0 s9 P* q" y, A; x( { 9 // synopsys translate_off6 C: h# y2 d% b5 D; p% }
10 `include"timescale.v"5 Q! u7 l) Y( G8 G4 [6 y
11 // synopsys translate_on
2 ^2 z# m, m* F) o. |4 D4 k3 h+ q 12
4 |% C* A0 j1 z7 c B% g, f 13 module tb_sram_wrapper ;
# ~5 F( I2 i' o$ {, g7 C9 I/ u 14
: A" w4 C- W% O& m! t& \: B 15 //
) C8 ^ \/ Z$ ]& ~! T O 16 // clock and reset signals
+ F+ t/ \$ u: s1 n 17 //
6 Y( {% k, s5 } 18 reg wb_clk_i;
% h. h$ g* _& }9 G- ^+ p, a% ? 19 reg wb_rst_i;9 a7 E- u. f; f$ b" g. l
20 ]0 O* k7 Q, Z0 s. [! C7 U
21 // *****************************************************************************
3 | f" T# z# j 22 // wishbone master bus functional model
+ ?# a w s2 v Z 23 // *****************************************************************************
* k: I9 Q5 N4 O0 r7 l* M9 d6 E% d 24
/ t' w$ Q Q' f 25 wire [31:0] wb_din_w;
; ~* H) w6 z" F; m+ g# P( s 26 wire [31:0] wb_dout_w;. w& ?$ k/ h' o8 l+ S: a/ L; ]
27 wire [31:0] wb_adr_w;. _8 |! I6 w- f) @& F
28 wire [ 3:0] wb_sel_w;
# v! T/ u9 x/ C 29 wire wb_we_w; q8 w% c2 g: g9 z( N
30 wire wb_cyc_w; U. f/ G6 }6 o! g! O7 l7 h
31 wire wb_stb_w;
& h3 V8 L% w7 N+ Q* q 32 wire wb_ack_w;
7 h1 ]: A9 R* X9 m5 i5 T0 L 33 wire wb_err_w;
! L. `6 S$ l' r8 ]& \! v: J 34 , d. e3 Z& h! @- \# E7 b
35 wb_mast u_wb_mast(; @$ J- `0 y* Z6 d% ^
36 .clk ( wb_clk_i ),: k. u& N$ {/ i" J
37 .rst ( wb_rst_i ), Y, C4 }" A8 z
38 ; ]$ I. r1 |4 m3 p# c" K$ _
39 .adr ( wb_adr_w ),
# h* l, ~& T6 E 40 .din ( wb_din_w ),0 o% x5 c: c; x' b$ P
41 .dout ( wb_dout_w ),
# [& w: R3 K5 @% E; R# N) r1 ?" o 42 .cyc ( wb_cyc_w ),
1 M+ H0 z7 l) Y, ~1 Z 43 .stb ( wb_stb_w ),
) o* [! D# w# s8 \ 44 .sel ( wb_sel_w ),
9 A3 S4 C7 Q- A1 d1 Y! G4 w 45 .we ( wb_we_w ),6 x+ ?4 F- `1 G. q/ [ ~( Q: s- V: y
46 .ack ( wb_ack_w ),8 T, W. N% | B. u5 F+ y0 d1 v" |
47 .err ( wb_err_w ),
+ X. Y; t- b7 c1 }/ Y7 A 48 .rty ( wb_rty_w ). ~$ c o9 y5 m3 D \: z+ v
49 );% C2 v7 Z% ]$ L. ~, v
50 7 Z! ~9 d4 ]1 z% `4 ]/ i
51 // *****************************************************************************1 ~- b$ @. x* O! c1 L, }: s+ u; g
52 // sram controller9 L( P% ^3 m, g( E0 G' W
53 // *****************************************************************************0 y$ O+ l2 R! C) x( S
54
7 B4 F8 p }- T1 ?( o 55 wire [15:0] SRAM_DQ_w; // SRAM Data bus 16 Bits' S+ w& Z+ [+ k9 n/ z; L
56 wire [17:0] SRAM_ADDR_w; // SRAM Address bus 18 Bits* C {. _; A" b1 }( H# f- w
57 wire SRAM_LB_N_w; // SRAM Low-byte Data Mask# Z# m( `1 U" O5 R7 V" \- N% g6 \$ N
58 wire SRAM_UB_N_w; // SRAM High-byte Data Mask1 x- s* p" a& B. p+ |
59 wire SRAM_CE_N_w; // SRAM Chip chipselect5 K; B1 s% k/ u& E9 |- z& F
60 wire SRAM_OE_N_w; // SRAM Output chipselect
; t4 I/ m2 n* W5 J# P& r4 } 61 wire SRAM_WE_N_w; // SRAM Write chipselect8 K0 M+ J3 o( G1 F' Q
62
* b) N4 K; W1 _5 m, ]( _! t4 U* Q 63 sram_wrapper DUT_sram_wrapper(
+ x3 ~4 S' t) w) r) K 64 .wb_clk_i ( wb_clk_i ),
: j) a, h/ H5 E2 E7 n" p' |2 k/ d 65 .wb_rst_i ( wb_rst_i ),
% `% J" {* \" M8 u9 }4 Q 66
! W( c* `2 a8 e9 {: u4 Z 67 .wb_dat_i ( wb_dout_w ),6 Q* Q4 L, x* ^' b8 t/ O1 x
68 .wb_dat_o ( wb_din_w ),7 _ @/ R1 m2 o# x) U" e
69 .wb_adr_i ( wb_adr_w ), C4 J4 q. `5 ]: R
70 .wb_sel_i ( wb_sel_w ),+ @% o) ]3 Y2 T/ Q' G1 w8 r# k
71 .wb_we_i ( wb_we_w ),
9 ?# O( W$ G/ t 72 .wb_cyc_i ( wb_cyc_w ),8 _. e! B4 [. L) V# [2 G0 F1 c
73 .wb_stb_i ( wb_stb_w )," R. p1 I! X0 ^8 @- ?
74 .wb_ack_o ( wb_ack_w ),
3 o3 d: ^# b9 @4 R 75 .wb_err_o ( wb_err_w ),
5 A% N4 }! Z. `2 Y 76
5 Q; X( [: r# b* O- w+ d 77 // SRAM
1 K, f' O2 C# _; F1 x 78 .SRAM_DQ ( SRAM_DQ_w ),. r% B* Y' J, P, X7 a; p8 t
79 .SRAM_ADDR ( SRAM_ADDR_w ),6 n( I$ _3 b8 E& r$ a
80 .SRAM_LB_N ( SRAM_LB_N_w ),
0 Y ?! I$ B% n: N 81 .SRAM_UB_N ( SRAM_UB_N_w ),
& k3 K \8 P' w I' x. d 82 .SRAM_CE_N ( SRAM_CE_N_w )," N5 c h9 f8 H0 k
83 .SRAM_OE_N ( SRAM_OE_N_w ),
' f/ M ~4 D5 X" e8 P 84 .SRAM_WE_N ( SRAM_WE_N_w )
H/ X0 ]3 O7 C- W4 Z# q 85 );
3 E4 [) B. ^, S% d5 z1 A1 w 86
% i% S4 M0 V' k B7 j' r: Z 87 // *****************************************************************************
1 U a5 M3 |$ q1 Z 88 // sram model9 s v3 h# C% A9 x) p O* W4 C
89 // *****************************************************************************& i o8 a8 j( \ h4 V8 T
90
. F a1 I s) r' y 91 IS61LV25616 u_sram_model(- i" ^. V* Y/ E e6 h p K6 G
92 .A ( {1'b0,SRAM_ADDR_w[17:0]} ),& V% |. G9 o) K& N8 M. a
93 .IO ( SRAM_DQ_w ),
+ D/ b% B* c$ l$ o9 z9 w r, ~! S 94 .CE_ ( SRAM_CE_N_w ),
$ R# k; |6 K5 ?5 K 95 .OE_ ( SRAM_OE_N_w ),( A4 S3 s0 S$ _; \" W+ t/ x
96 .WE_ ( SRAM_WE_N_w ),5 ~/ U1 `, ]# l5 X O2 P# q% T
97 .LB_ ( SRAM_LB_N_w ),
. U- s7 S' ]/ i: H6 C5 W& j 98 .UB_ ( SRAM_UB_N_w )7 m& o8 p/ u3 q+ \
99 );" b% Q+ J5 Q$ ^# p5 X
100 }: j: a& r* B& G' p
101 3 f. T9 Q: T4 L, v, P
102 initialbegin* r; y/ w" T0 O6 D0 i3 ~6 }( i
103 wb_clk_i <=0;* @+ K: W( l' P b5 D
104 wb_rst_i <=0;
; }6 E, R! {9 t# {+ N105 end8 ?, f) c& A+ `' ~0 _
106 7 n: @: H+ ^9 j1 U) a! v0 f7 b* f
107 always@(wb_clk_i) begin; d8 r, i" a. y. }7 c3 u& Y; E
108 #10 wb_clk_i <=~wb_clk_i;
1 m1 W5 X0 e ?109 end
; r( v, g p6 d: H: {* H110
- I- Q; A. W, k: m. V+ b7 p111 reg [31:0] tmp_dat;: o k$ W1 G. l- _
112 2 _8 e ~, g3 \3 a0 Y" W4 U
113 reg [31:0] d0,d1,d2,d3;
: l8 _$ c/ X# U5 O114
! ]3 d: I0 }% P q% P' y% s115 initialbegin6 R5 A* l( W2 `; R
116 repeat (1) @ (posedge wb_clk_i);# c2 T2 N# [' G: a4 r
117 wb_rst_i <=1;! t# o4 r2 T4 L' c+ ]; L& c6 G" r8 N
118 repeat (3) @ (posedge wb_clk_i);- s7 z9 d: }- r5 S# U
119 wb_rst_i <=0;
9 |1 g2 C: A& w0 n5 W( @120 //write your test here!
0 R* n6 K; B. k& p: }0 e121 repeat (1) @ (posedge wb_clk_i);) @! F5 p2 ~& F
122 u_wb_mast.wb_wr1(32'h04,4'b1111,32'haabbccdd); L; ]4 M5 ~ G( V
123 u_wb_mast.wb_rd1(32'h04,4'b1111,tmp_dat);# c, k6 k* F3 k5 R- K
124 u_wb_mast.wb_wr1(32'h08,4'b1111,32'hddccbbaa);
9 i5 C3 F; r! y125 u_wb_mast.wb_rd1(32'h08,4'b1111,tmp_dat);) O# |: O5 N. ?+ H* Z+ v7 b+ v. h
126 $display($time,,"readfrom %x, value = %x\n",32'h00,tmp_dat);+ q# T2 R" F/ X9 H8 g
127 //adr,adr+4,adr+8,adr+12
3 x+ R- r0 v' O$ P& s3 t* Y128 u_wb_mast.wb_wr4(32'h00,4'b1111,1,32'h01,32'h02,32'h03,32'h04);. {) y- p1 D0 j0 u- x8 m6 t
129 u_wb_mast.wb_rd4(32'h00,4'b1111,3,d0,d1,d2,d3);
% B# U& O" X: V* K130 $display($time,,"read4from %x, value = %x , %x , %x , %x\n",32'h05,d0,d1,d2,d3);# F# Z% W9 o, P) z9 g% r3 Q
131 #100
* T! p/ [" X4 e8 U, } H& ^132 $finish; B$ c9 ?) ^2 h$ G
133
" n. v* [, ]9 e2 ^134 end: k9 Y0 Q6 M- _, k6 w& [
135
' a3 g( K O8 L136 initial7 h$ I0 c# h7 ^' s4 }. i S* Q: }
137 begin9 @+ K% f( J3 j! x7 a, e6 H
138 $fsdbDumpfile("sram_wrapper.fsdb");: }0 b8 V& Z, o: Q' ^3 `
139 $fsdbDumpvars;% p N& E2 M: B# x( q4 F
140 end
Y( w& H/ ?7 K0 [; g6 a141 endmodule. H& f ~6 S1 g9 [9 W; M- c
$ L! Z! j1 r& z
+ m; t1 w6 w- E2 k0 {
仿真结果5 R- W, \4 A. A6 T- }& p
' G+ ]4 ]0 |" t. @2 |& N/ k
# INFO: WISHBONE MASTER MODEL INSTANTIATED (tb_sram_wrapper.u_wb_mast)
( G6 L" C; l9 R0 T#
! E! {3 S, P. |% R$ @+ f# x2 E# 571 readfrom 00000000, value = ddccbbaa) m9 M/ O; R0 { C# O p" o1 F
# 2 Q9 J2 o- u; `$ j
# 1891 read4from 00000005, value = 00000001 , 00000002 , 00000003 , 000000047 m! ^& x( |/ D) R9 _& Z
#
8 f I9 O1 J3 a7 W" P* r4 A& @1 l6 b8 t5 P! x
没有错误
+ x; v2 G6 ?9 a4 z( `, o
1 y' I: Q7 I7 ?; d0 wØ Sram_wrapper的soc系统仿真验证
% r" f! m0 g* J6 R8 }7 o- n+ `1 W/ C1 X+ I9 X
加入sram_wrapper模块之后,并没有在sram空间上跑代码,只是对sram作了以下简单的读写实验,测试代码如下所示9 h3 e: O1 A4 F7 I' L u; M
B6 K) n1 ?: w. G# u2 k
1 #include "orsocdef.h"
; t' L2 z7 T, i, W 2 #include "board.h"
$ S* ? E/ x% Q7 B8 E( r 3 #include "uart.h"
3 v# \% O% F: _ 4 ; ~, v: |+ \ L
5 int
" }3 I: [4 Q: I2 d/ b& f3 R% M/ N 6 main (void)
5 O% N: b% Q; f4 a 7 {
% I3 O8 ~$ v( l% v 8 long gpio_in;
9 s- z# E* @7 w7 I; }" e4 o 9 REG32 (RGPIO_OE) =0xffffffff;' v/ R, \) y) v J
10 ' V9 V8 m& {4 F
11 uart_init();
- z. @- t1 M" ^- n$ V1 E1 ^12
8 Y, p8 X0 L. H. S; |13 uart_print_str("2Hello World!\n");
7 u \+ T4 r; F" @14 5 h" ~6 |& P' j6 u, ^. T
15 int i;/ b" C/ N6 K! {. F- z( I! f8 P0 J
16 int t0, t1;! E, ~( h, @: Q
17 t0 =0xaabbccdd;+ S' x7 a+ ^% t: @: F$ @( }7 e% g
18 for(i=0;i<10;i++){) b. U! N/ M( G R; v
19 //REG32 (RGPIO_OUT) = t0;
1 [5 G7 O& p2 Q+ }* r* a20 REG32 (SRAM_BASE + i*4) = t0;
9 f$ q$ k4 L& n: j/ ^; v21 t1 = REG32 (SRAM_BASE + i*4);
; u& H9 u( f& _) _22 //REG32 (RGPIO_OUT) = t1;
* ]: J4 I' f, u! e% x# N2 K* j23 if(t0 == t1)% V4 `$ n, h0 a/ P) n# m2 H
24 uart_print_str("correct!\n");
+ _# c" j8 l) S' b25 else
2 Z/ c. k3 ~% ?- ^) C! J# @" Y8 O26 uart_print_str("error!\n");
- l3 y( \4 o0 S: Q5 e27 t0 = t0 -0x01010101;
4 W0 V9 _0 |5 d$ y, n1 [28 }
5 g2 a) d% a! t' t9 ]& t29
, R9 y6 ~; w% F6 j30 while(1){
' B2 q# J4 _" L6 Q) L* T7 r31 gpio_in = REG32 (RGPIO_IN);
) g" e4 a( W5 q. e32 gpio_in = gpio_in &0x0000ffff;
6 v1 \1 _- @. {0 b+ q# e7 q33 REG32 (RGPIO_OUT) = gpio_in;
8 t1 a2 Y1 A& Y! G) x34 }$ G6 z" }/ t0 W7 x% R/ T1 j+ Z" B
35
" x8 w$ @) l, @* ?1 l0 i, ^. ]5 S36 return0;2 e* V _! g6 g7 J# T4 B
37 }
6 Y0 S$ I6 v0 d, Q% }' w1 ~- ^# o& l; @
( }8 ?% B, ?( _% e8 k8 M仿真结果3 i( }( h6 s% D8 s
$ k6 `, P2 ]9 g V! q/ E& w5 h# 2
0 D8 b1 X6 N% `! w: U, Y' D( e# H
: Q u. j* ?. E' W# e- T( P8 O4 F* }3 t
# l
$ }% u9 c* C* q; q2 r# l
& P# O# l) K- Z; `9 L7 R9 B. e# o) W4 B( K6 t& \) b# M! j+ b
# , K; Z2 B: {6 b! L
# W4 H7 C2 U0 A: l6 `2 h
# o
J3 y# z" z+ g& C2 {# T) G# r7 ~' x% y1 u4 p1 @( t% q
# l3 P- w) C0 e4 L. B
# d
3 ?6 }2 g" X( J* G H6 \/ f; i# !7 N8 F9 l+ d0 ]0 i9 f: {
#
7 K; x- _+ U) L& D#
9 T& E M: m% J! `4 b#
3 Q' r4 h, J3 }+ C# 8 q, t" l: a& @9 r
# c
# H; c9 c9 V7 @# o1 e4 @, r# J8 {. I! O! l
# r5 g6 t! H, F' o% o/ Q% A. }4 l
# r
Z* @+ g. I. C- G3 P9 m5 o" d6 a# e
* o* Q% K8 U$ T( @# c4 T* B, k) B! `. Z3 i5 I! U
# t# R4 |- N; S! @, g+ R
# !
4 D: t! q" W; ? R( K… … ; z: b) M, T9 B( C& `
W' \% s# c4 @9 s在fpga上的验证几个月前跑过,没有留图,结果与设想的一致,是没有错误的。2 N1 s* r6 r+ R# n; b9 ?
" Y( Q, r* R2 M. z. ~" b, {
Ø Ssram控制器的设计与验证
# f. p4 B+ }1 |0 c, O9 \, s) K7 {" }+ H$ f
Ssram控制器的设计与验证,与sram相似,只不过它是同步的,ssram的model自己写即可,而且它是32位的,控制起来就简单多了。
5 V' F. j$ u* i0 [: k% N4 f
$ u% Q0 c: A6 F- t关于DE2-70上的ssram控制器,参考设计orpXL中用yadmc核来控制ssram,是没有必要的。Ssram的控制代码如下
1 t( L" p0 r- d. C7 B n7 c5 ~: U) M
: S6 ` R) o! X/ s* L 1 //----------------------------------------------------------------------------//
( |0 o" h- Y! Z+ @: |5 {7 P 2 // Filename : ssram_wrapper.v //
/ D- O0 ]" u- N- C: P* `, x% ]* s9 R1 q 3 // Author : Huailu Ren ...() //
9 v* K9 O, ?1 X5 y5 A. H6 M 4 // Email : hlren.pub@gmail.com //
' V7 g( T7 o, z# `% ~0 C; L2 ~' T 5 // Created : 23:54 2011/5/17 //" l' R& A" }9 }8 B# q
6 //----------------------------------------------------------------------------//
# v8 _4 \; ^+ k( D! b, x) S) F 7 // Description : //: z: \: v7 x/ W+ }( f& j2 c* W8 X9 x
8 ////
; o0 _% |, p' |7 A7 M& F 9 // $Id$ //: e b& f$ z8 w
10 //----------------------------------------------------------------------------//. a& a7 i1 ]9 {( h) M1 w
11
2 D- S; y% W2 P9 I* a3 H) ^ 12 module ssram_wrapper(
" _$ g+ @! y& H( J2 m0 o 13 input clk_i,
, t6 ?7 E: F* y 14 input rst_i,% ]2 \4 r7 E: j0 `9 L
15
9 c. G& p) t) D& W 16 input wb_stb_i, d- w+ A5 v" [" K0 H8 s0 ?
17 input wb_cyc_i," y; H& b- }: r* E$ o
18 outputreg wb_ack_o,) |( x2 U9 v5 u- O
19 input [31: 0] wb_addr_i,
$ _8 J6 q; z$ i7 u7 i# U 20 input [ 3: 0] wb_sel_i,6 y! @7 v4 E& w; k/ ?
21 input wb_we_i,
. z9 [ {8 ?* V' x# I, ?" z' _( P 22 input [31: 0] wb_data_i,: p. Y; F) M$ z8 p6 y2 D) u
23 output [31: 0] wb_data_o,
) N& ?# z$ M Q9 o+ t! T 24 // SSRAM side
* Y' m. _& g2 m6 c! u0 G 25 inout [31: 0] SRAM_DQ, // SRAM Data Bus 32 Bits8 I, ] L+ Y& {5 q; C
26 inout [ 3: 0] SRAM_DPA, // SRAM Parity Data Bus
, O4 T6 @* S8 J 27 // Outputs
4 _( c- f3 v/ T+ h! q3 s 28 output SRAM_CLK, // SRAM Clock6 S, Z( J# o- A5 d7 F
29 output [18: 0] SRAM_A, // SRAM Address bus 21 Bits
' g7 K( Y3 d( {2 r' @/ W. U8 M 30 output SRAM_ADSC_N, // SRAM Controller Address Status
4 l2 n+ Q8 ]: h$ P 31 output SRAM_ADSP_N, // SRAM Processor Address Status2 d2 d- Q/ B3 f- [( z
32 output SRAM_ADV_N, // SRAM Burst Address Advance
r) h' U0 Q8 [- v" e1 ^4 K( }9 H 33 output [ 3: 0] SRAM_BE_N, // SRAM Byte Write Enable
2 U, q5 P" \6 g# M, s 34 output SRAM_CE1_N, // SRAM Chip Enable' |8 E6 J& Q1 S
35 output SRAM_CE2, // SRAM Chip Enable
- g3 D4 B& R' n$ \, y( M3 H9 C 36 output SRAM_CE3_N, // SRAM Chip Enable( r! r* u& j& p: b
37 output SRAM_GW_N, // SRAM Global Write Enable
$ K1 L! j4 `8 J/ J9 _4 Y+ t( @* \3 n 38 output SRAM_OE_N, // SRAM Output Enable! K$ R+ o0 {/ z6 G, L0 [ g0 b
39 output SRAM_WE_N // SRAM Write Enable9 S" p% |/ e, {$ r( E
40 );
. T V& O5 |" [; O1 f: P 41
o% s# n% L4 B$ f 42 // request signal8 d! `, S+ @+ I8 M9 O
43 wire request;7 k1 ~- P4 X+ P
44
0 H3 ?! Y/ E& T# q) w1 V4 o 45 // request signal's rising edge$ a G9 s. p: h7 Y, ^" y1 B
46 reg request_delay;
( D8 D) q Y" B# H 47 wire request_rising_edge;/ s, M: m3 u6 `' H3 W
48 wire is_read, is_write;, _4 m4 o- ^; {/ m4 L; e
49 . @. w/ n0 l& k* b P0 r ^
50 // ack signal
: x# F; [+ |( M) M- d1 `- ^- }! L6 V 51 reg ram_ack;
8 |+ |9 o% R2 g 52
6 a) e; O& w+ p 53 // get request signal
E1 R# x) B$ @4 x9 a 54 assign request = wb_stb_i & wb_cyc_i;
; _! X; }- F$ c% B; m) g0 K/ ~ 55 . i+ m( ^5 D& `! ^; \- ?, E
56 // Internal Assignments
, m O4 A3 X3 H 57 assign is_read = wb_stb_i & wb_cyc_i &~wb_we_i;3 a' `. I+ m! }+ w5 c
58 assign is_write = wb_stb_i & wb_cyc_i & wb_we_i;) E' ]# {) L& m* j# _9 e
59 0 g5 m& x: B3 h2 H1 S9 x
60 // Output Assignments
& g) Q7 C* d2 ^1 Y3 \9 B4 L5 T' x 61 assign wb_data_o = SRAM_DQ;9 u$ ]4 g' ^% x" }
62 $ ~! j% x4 u1 ?8 b5 B0 W6 k, Z
63 assign SRAM_DQ[31:24] = (wb_sel_i[3] & is_write) ? wb_data_i[31:24] : 8'hzz;
7 a$ g) \9 F W3 f2 V/ ] 64 assign SRAM_DQ[23:16] = (wb_sel_i[2] & is_write) ? wb_data_i[23:16] : 8'hzz; u; f" F) ~# F- S/ O3 X% B
65 assign SRAM_DQ[15: 8] = (wb_sel_i[1] & is_write) ? wb_data_i[15: 8] : 8'hzz;
: G) `3 M$ p/ _% C8 U# J6 D 66 assign SRAM_DQ[ 7: 0] = (wb_sel_i[0] & is_write) ? wb_data_i[ 7: 0] : 8'hzz;6 c( P! h- m3 d" s l% l
67 / w0 ^2 b0 N1 ]
68 assign SRAM_DPA =4'hz;
2 V; l+ e% x5 y/ b" S) t 69 , t% Y& c, M! O# X& B
70 assign SRAM_CLK = clk_i;$ x1 d6 v) E) Z" e
71 assign SRAM_A = wb_addr_i[20:2]; ^7 b' ~0 @& Q0 c U' _. x7 x
72 assign SRAM_ADSC_N =~(is_write);
: ?2 h4 h" c: j! s- I7 c5 q 73 assign SRAM_ADSP_N =~(is_read);
0 X5 I, A1 ?# I) |3 c* F2 A 74 assign SRAM_ADV_N =1'b1;, A4 Y- B* a3 x+ { N j
75 assign SRAM_BE_N[3] =~(wb_sel_i[3] & request);
; t" O, i6 v% F" q2 b8 ~ 76 assign SRAM_BE_N[2] =~(wb_sel_i[2] & request);$ t5 ]: @) r5 r
77 assign SRAM_BE_N[1] =~(wb_sel_i[1] & request);
* G; t( z2 x9 s, t 78 assign SRAM_BE_N[0] =~(wb_sel_i[0] & request);0 z# D# f, @2 J6 {" y1 D* X
79 assign SRAM_CE1_N =~request;2 s- h3 W, m( T: R+ I8 T
80 assign SRAM_CE2 =1'b1;8 P0 ~( G$ s" P. ]( O; `
81 assign SRAM_CE3_N =1'b0;- N* q! v" Z$ r8 \
82 assign SRAM_GW_N =1'b1;
$ \8 N& ~8 Z8 f5 t 83 assign SRAM_OE_N =~is_read;* s8 _, a) o. v" L$ G- A
84 assign SRAM_WE_N =~is_write;0 p: i4 a3 E7 @- _- p% W+ U) K w
85
4 ?1 ?7 J& F5 i2 Y2 D [ 86 // get the rising edge of request signal
. F3 |5 [# W7 p3 b 87 always @ (posedge clk_i): X) Y. D7 l" E
88 begin4 `' H2 e1 t- [6 P. |, S, b
89 if(rst_i ==1)
+ H: m: g% _2 K. q. z 90 request_delay <=0;
+ Y3 p8 L- W, X% v 91 else. Z, _1 E7 _4 R4 G1 O
92 request_delay <= request;5 H% ^3 J$ Y1 g' r1 u6 R' l
93 end* P$ M$ D" P4 ]# V! r! t
94 + y( |7 N- k. q& W/ ~! ?4 }+ W
95 assign request_rising_edge = (request_delay ^ request) & request;% [) [+ w" B {4 G6 A/ {8 N
96
0 c* B( z1 [! J- Y 97 // generate a 1 cycle acknowledgement for each request rising edge" A# x! j. P9 K
98 always @ (posedge clk_i)1 }6 ]1 J. g. K; A' f
99 begin3 [2 C. ~2 }6 j/ d
100 if (rst_i ==1). y) r1 {) u+ x B# q& l7 U- a
101 ram_ack <=0;4 M6 o1 H+ K4 _6 ^) R
102 elseif (request_rising_edge ==1)8 {0 Z. B/ u* r
103 ram_ack <=1;
: u. F& a6 |2 C; |104 else' Y* ?0 P% M$ C, ^& U* P- W
105 ram_ack <=0;
) D" m6 p+ y# P2 \2 Z6 ^8 ~7 a4 E106 end- y/ @" D3 p5 e. N; l p, n
107 $ A, J& F; Q: A1 p+ b: K
108 // register wb_ack output, because onchip ram0 uses registered output
% l1 z: G1 E: ` m3 T" T109 always @ (posedge clk_i)3 S5 e/ B% l1 u; A5 _$ a
110 begin
' X/ E( w( L4 @ t111 if (rst_i ==1): p$ S V' B# W; V4 ]# B; _ }1 _
112 wb_ack_o <=0;8 K$ b3 W( M6 V( f/ [, |+ g
113 else
, i/ `+ \( ` G114 wb_ack_o <= ram_ack;
; J ~* S( W; N& ]! G" ^; ]: F115 end5 W* G3 v" p' e: d7 O1 B3 j; @9 ^/ C( m
116 5 G* {; G1 `: h8 ~" Q: R
117 endmodule
" w. v. R* }2 x1 |0 r! \# h9 q' f0 Z2 q/ e* a# _
+ ? E; ?7 M/ I2 m4 ?; u+ `) h
并没有写testbench,直接在fpga上跑了,而且是跑的程序。经验证没有问题。
0 B. F/ x1 H+ v; ], f K
( G9 _# T; H* m) _; f! F' \) j源码可以在这里下载
; |$ L- Q/ `- O+ h$ P& i4 }% L J$ n/ b3 k
稍后。。。' W( J: \! s6 e2 J: M% c6 n: h
To Do1 k0 M: O* `8 A2 y
" @) L5 h7 e* l3 K) G" x) W7 f
用所写的sram_wrapper基于DE2平台让or1200在sram空间跑下代码
4 @* C0 T3 O- [! {; e0 [, h( f$ Z7 Y修改以下用所写的sram_wrapper移植到DE2-115平台上
' M( q$ Y, u+ q% ]7 V) `9 OTo Do--关于opencore,or1200的soc平台9 q, L5 f; z: }6 ~( |" X/ k
" ~* U7 Z7 }2 {+ X" C
OR1200的引导方案设计(基于硬件或者软件uart控制)6 n# Z3 @' ]$ R. k* {& J
移植uc/os II操作系统7 T: m" K! g; L! g7 k
驱动起来DE2-70上的网卡, E) n; k3 Z" ~. _4 ~2 {
加入jtag模块
7 J, r8 Y% g4 U! j1 F移植u-boot) {1 v: {! ~; E
移植ucLinux
2 M2 x0 l) L" k& f) Q9 ^…… |
|