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