//  Copyright 2011 Actel Corporation.  All rights reserved.
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// Revision Information:
// SVN Revision Information:
// SVN $Revision: 4805 $
`timescale 1ns/100ps
module
SmartFusion2_FIC_Tutorial_sb_COREAHBLSRAM_0_0_SramCtrlIf
(
HCLK
,
HRESETN
,
CHTOLSRAMiI
,
CHTOLSRAMi
,
CHTOLSRAMo
,
CHTOLSRAMI
,
CHTOLSRAMl
,
CHTOLSRAMoI
,
CHTOLSRAMOI
,
BUSY
)
;
parameter
SEL_SRAM_TYPE
=
1
;
parameter
LSRAM_NUM_LOCATIONS_DWIDTH32
=
512
;
parameter
USRAM_NUM_LOCATIONS_DWIDTH32
=
128
;
parameter
AHB_DWIDTH
=
32
;
localparam
CHTOLSRAMOOI
=
2
'b
00
;
localparam
CHTOLSRAMIOI
=
2
'b
01
;
localparam
CHTOLSRAMlOI
=
2
'b
10
;
input
HCLK
;
input
HRESETN
;
input
CHTOLSRAMiI
;
input
CHTOLSRAMi
;
input
[
2
:
0
]
CHTOLSRAMI
;
input
[
19
:
0
]
CHTOLSRAMl
;
input
[
AHB_DWIDTH
-
1
:
0
]
CHTOLSRAMo
;
output
CHTOLSRAMoI
;
output
[
AHB_DWIDTH
-
1
:
0
]
CHTOLSRAMOI
;
output
BUSY
;
reg
[
3
:
0
]
CHTOLSRAMoOI
;
reg
[
1
:
0
]
CHTOLSRAMiOI
;
reg
[
1
:
0
]
CHTOLSRAMOII
;
reg
CHTOLSRAMoI
;
reg
CHTOLSRAMIII
;
reg
CHTOLSRAMlII
;
reg
CHTOLSRAMoII
;
reg
CHTOLSRAMiII
;
reg
CHTOLSRAMOlI
;
reg
[
AHB_DWIDTH
-
1
:
0
]
CHTOLSRAMOI
;
reg
[
31
:
0
]
CHTOLSRAMIlI
;
reg
[
31
:
0
]
CHTOLSRAMllI
;
wire
[
AHB_DWIDTH
-
1
:
0
]
CHTOLSRAMo
;
wire
[
AHB_DWIDTH
-
1
:
0
]
CHTOLSRAMolI
;
wire
CHTOLSRAMilI
;
wire
CHTOLSRAMO0I
;
wire
CHTOLSRAMI0I
;
wire
CHTOLSRAMl0I
;
wire
CHTOLSRAMo0I
;
wire
CHTOLSRAMi0I
;
wire
CHTOLSRAMO1I
;
wire
CHTOLSRAMI1I
;
wire
BUSY
;
wire
[
31
:
0
]
CHTOLSRAMl1I
;
wire
[
31
:
0
]
CHTOLSRAMo1I
;
always
@
(
posedge
HCLK
or
negedge
HRESETN
)
begin
if
(
HRESETN
==
1
'b
0
)
begin
CHTOLSRAMiOI
<=
CHTOLSRAMOOI
;
end
else
begin
CHTOLSRAMiOI
<=
CHTOLSRAMOII
;
end
end
always
@
(
*
)
begin
CHTOLSRAMoII
=
1
'b
0
;
CHTOLSRAMIII
=
1
'b
0
;
CHTOLSRAMlII
=
1
'b
0
;
CHTOLSRAMOII
=
CHTOLSRAMiOI
;
case
(
CHTOLSRAMiOI
)
CHTOLSRAMOOI
:
begin
if
(
CHTOLSRAMiI
==
1
'b
1
)
begin
if
(
CHTOLSRAMi
==
1
'b
1
)
begin
CHTOLSRAMOII
=
CHTOLSRAMIOI
;
CHTOLSRAMIII
=
1
'b
1
;
end
else
begin
CHTOLSRAMlII
=
1
'b
1
;
CHTOLSRAMOII
=
CHTOLSRAMlOI
;
end
end
end
CHTOLSRAMIOI
:
begin
if
(
CHTOLSRAMOlI
==
1
'b
1
)
begin
CHTOLSRAMOII
=
CHTOLSRAMOOI
;
CHTOLSRAMoII
=
1
'b
1
;
end
end
CHTOLSRAMlOI
:
begin
if
(
CHTOLSRAMOlI
==
1
'b
1
)
begin
CHTOLSRAMOII
=
CHTOLSRAMOOI
;
CHTOLSRAMoII
=
1
'b
1
;
end
end
default
:
begin
CHTOLSRAMOII
=
CHTOLSRAMOOI
;
end
endcase
end
always
@
(
*
)
begin
CHTOLSRAMoOI
=
4
'b
0000
;
if
(
CHTOLSRAMI
==
3
'b
010
)
begin
CHTOLSRAMoOI
=
{
4
{
CHTOLSRAMIII
}
}
;
end
else
if
(
CHTOLSRAMI
==
3
'b
001
)
begin
case
(
CHTOLSRAMl
[
1
]
)
1
'b
0
:
begin
CHTOLSRAMoOI
[
0
]
=
CHTOLSRAMIII
;
CHTOLSRAMoOI
[
1
]
=
CHTOLSRAMIII
;
CHTOLSRAMoOI
[
2
]
=
1
'b
0
;
CHTOLSRAMoOI
[
3
]
=
1
'b
0
;
end
1
'b
1
:
begin
CHTOLSRAMoOI
[
0
]
=
1
'b
0
;
CHTOLSRAMoOI
[
1
]
=
1
'b
0
;
CHTOLSRAMoOI
[
2
]
=
CHTOLSRAMIII
;
CHTOLSRAMoOI
[
3
]
=
CHTOLSRAMIII
;
end
endcase
end
else
if
(
CHTOLSRAMI
==
3
'b
000
)
begin
case
(
CHTOLSRAMl
[
1
:
0
]
)
2
'b
00
:
begin
CHTOLSRAMoOI
[
0
]
=
CHTOLSRAMIII
;
CHTOLSRAMoOI
[
1
]
=
1
'b
0
;
CHTOLSRAMoOI
[
2
]
=
1
'b
0
;
CHTOLSRAMoOI
[
3
]
=
1
'b
0
;
end
2
'b
01
:
begin
CHTOLSRAMoOI
[
0
]
=
1
'b
0
;
CHTOLSRAMoOI
[
1
]
=
CHTOLSRAMIII
;
CHTOLSRAMoOI
[
2
]
=
1
'b
0
;
CHTOLSRAMoOI
[
3
]
=
1
'b
0
;
end
2
'b
10
:
begin
CHTOLSRAMoOI
[
0
]
=
1
'b
0
;
CHTOLSRAMoOI
[
1
]
=
1
'b
0
;
CHTOLSRAMoOI
[
2
]
=
CHTOLSRAMIII
;
CHTOLSRAMoOI
[
3
]
=
1
'b
0
;
end
2
'b
11
:
begin
CHTOLSRAMoOI
[
0
]
=
1
'b
0
;
CHTOLSRAMoOI
[
1
]
=
1
'b
0
;
CHTOLSRAMoOI
[
2
]
=
1
'b
0
;
CHTOLSRAMoOI
[
3
]
=
CHTOLSRAMIII
;
end
endcase
end
else
begin
CHTOLSRAMoOI
=
{
4
{
CHTOLSRAMIII
}
}
;
end
end
generate
if
(
SEL_SRAM_TYPE
==
1
'b
0
)
begin
assign
CHTOLSRAMl1I
=
CHTOLSRAMo
;
CHTOLSRAMi1I
#
(
.CHTOLSRAMOoI
(
LSRAM_NUM_LOCATIONS_DWIDTH32
)
)
CHTOLSRAMIoI
(
.CHTOLSRAMloI
(
CHTOLSRAMl1I
[
7
:
0
]
)
,
.CHTOLSRAMooI
(
CHTOLSRAMolI
[
7
:
0
]
)
,
.CHTOLSRAMioI
(
CHTOLSRAMoOI
[
0
]
)
,
.CHTOLSRAMOiI
(
CHTOLSRAMlII
)
,
.CHTOLSRAMIiI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMliI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMoiI
(
HCLK
)
,
.CHTOLSRAMiiI
(
HRESETN
)
,
.CHTOLSRAMOOl
(
CHTOLSRAMo0I
)
)
;
CHTOLSRAMi1I
#
(
.CHTOLSRAMOoI
(
LSRAM_NUM_LOCATIONS_DWIDTH32
)
)
CHTOLSRAMIOl
(
.CHTOLSRAMloI
(
CHTOLSRAMl1I
[
15
:
8
]
)
,
.CHTOLSRAMooI
(
CHTOLSRAMolI
[
15
:
8
]
)
,
.CHTOLSRAMioI
(
CHTOLSRAMoOI
[
1
]
)
,
.CHTOLSRAMOiI
(
CHTOLSRAMlII
)
,
.CHTOLSRAMIiI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMliI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMoiI
(
HCLK
)
,
.CHTOLSRAMiiI
(
HRESETN
)
,
.CHTOLSRAMOOl
(
CHTOLSRAMi0I
)
)
;
CHTOLSRAMi1I
#
(
.CHTOLSRAMOoI
(
LSRAM_NUM_LOCATIONS_DWIDTH32
)
)
CHTOLSRAMlOl
(
.CHTOLSRAMloI
(
CHTOLSRAMl1I
[
23
:
16
]
)
,
.CHTOLSRAMooI
(
CHTOLSRAMolI
[
23
:
16
]
)
,
.CHTOLSRAMioI
(
CHTOLSRAMoOI
[
2
]
)
,
.CHTOLSRAMOiI
(
CHTOLSRAMlII
)
,
.CHTOLSRAMIiI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMliI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMoiI
(
HCLK
)
,
.CHTOLSRAMiiI
(
HRESETN
)
,
.CHTOLSRAMOOl
(
CHTOLSRAMO1I
)
)
;
CHTOLSRAMi1I
#
(
.CHTOLSRAMOoI
(
LSRAM_NUM_LOCATIONS_DWIDTH32
)
)
CHTOLSRAMoOl
(
.CHTOLSRAMloI
(
CHTOLSRAMl1I
[
31
:
24
]
)
,
.CHTOLSRAMooI
(
CHTOLSRAMolI
[
31
:
24
]
)
,
.CHTOLSRAMioI
(
CHTOLSRAMoOI
[
3
]
)
,
.CHTOLSRAMOiI
(
CHTOLSRAMlII
)
,
.CHTOLSRAMIiI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMliI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMoiI
(
HCLK
)
,
.CHTOLSRAMiiI
(
HRESETN
)
,
.CHTOLSRAMOOl
(
CHTOLSRAMI1I
)
)
;
end
else
begin
assign
CHTOLSRAMo1I
=
CHTOLSRAMo
;
CHTOLSRAMiOl
#
(
.USRAM_NUM_LOCATIONS_DWIDTH32
(
USRAM_NUM_LOCATIONS_DWIDTH32
)
)
CHTOLSRAMIoI
(
.CHTOLSRAMloI
(
CHTOLSRAMo1I
[
7
:
0
]
)
,
.CHTOLSRAMooI
(
CHTOLSRAMolI
[
7
:
0
]
)
,
.CHTOLSRAMioI
(
CHTOLSRAMoOI
[
0
]
)
,
.CHTOLSRAMOiI
(
CHTOLSRAMlII
)
,
.CHTOLSRAMIiI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMliI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMoiI
(
HCLK
)
,
.CHTOLSRAMiiI
(
HRESETN
)
,
.CHTOLSRAMOIl
(
CHTOLSRAMilI
)
)
;
CHTOLSRAMiOl
#
(
.USRAM_NUM_LOCATIONS_DWIDTH32
(
USRAM_NUM_LOCATIONS_DWIDTH32
)
)
CHTOLSRAMIOl
(
.CHTOLSRAMloI
(
CHTOLSRAMo1I
[
15
:
8
]
)
,
.CHTOLSRAMooI
(
CHTOLSRAMolI
[
15
:
8
]
)
,
.CHTOLSRAMioI
(
CHTOLSRAMoOI
[
1
]
)
,
.CHTOLSRAMOiI
(
CHTOLSRAMlII
)
,
.CHTOLSRAMIiI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMliI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMoiI
(
HCLK
)
,
.CHTOLSRAMiiI
(
HRESETN
)
,
.CHTOLSRAMOIl
(
CHTOLSRAMO0I
)
)
;
CHTOLSRAMiOl
#
(
.USRAM_NUM_LOCATIONS_DWIDTH32
(
USRAM_NUM_LOCATIONS_DWIDTH32
)
)
CHTOLSRAMlOl
(
.CHTOLSRAMloI
(
CHTOLSRAMo1I
[
23
:
16
]
)
,
.CHTOLSRAMooI
(
CHTOLSRAMolI
[
23
:
16
]
)
,
.CHTOLSRAMioI
(
CHTOLSRAMoOI
[
2
]
)
,
.CHTOLSRAMOiI
(
CHTOLSRAMlII
)
,
.CHTOLSRAMIiI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMliI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMoiI
(
HCLK
)
,
.CHTOLSRAMiiI
(
HRESETN
)
,
.CHTOLSRAMOIl
(
CHTOLSRAMI0I
)
)
;
CHTOLSRAMiOl
#
(
.USRAM_NUM_LOCATIONS_DWIDTH32
(
USRAM_NUM_LOCATIONS_DWIDTH32
)
)
CHTOLSRAMoOl
(
.CHTOLSRAMloI
(
CHTOLSRAMo1I
[
31
:
24
]
)
,
.CHTOLSRAMooI
(
CHTOLSRAMolI
[
31
:
24
]
)
,
.CHTOLSRAMioI
(
CHTOLSRAMoOI
[
3
]
)
,
.CHTOLSRAMOiI
(
CHTOLSRAMlII
)
,
.CHTOLSRAMIiI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMliI
(
CHTOLSRAMl
[
17
:
2
]
)
,
.CHTOLSRAMoiI
(
HCLK
)
,
.CHTOLSRAMiiI
(
HRESETN
)
,
.CHTOLSRAMOIl
(
CHTOLSRAMl0I
)
)
;
end
endgenerate
assign
BUSY
=
SEL_SRAM_TYPE
?
(
CHTOLSRAMilI
|
CHTOLSRAMO0I
|
CHTOLSRAMI0I
|
CHTOLSRAMl0I
)
:
(
CHTOLSRAMo0I
|
CHTOLSRAMi0I
|
CHTOLSRAMO1I
|
CHTOLSRAMI1I
)
;
always
@
(
posedge
HCLK
or
negedge
HRESETN
)
begin
if
(
HRESETN
==
1
'b
0
)
begin
CHTOLSRAMOI
<=
32
'h
0
;
end
else
if
(
CHTOLSRAMiII
==
1
'b
1
)
begin
CHTOLSRAMOI
<=
CHTOLSRAMolI
;
end
else
begin
CHTOLSRAMOI
<=
CHTOLSRAMOI
;
end
end
always
@
(
posedge
HCLK
or
negedge
HRESETN
)
begin
if
(
HRESETN
==
1
'b
0
)
begin
CHTOLSRAMiII
<=
32
'h
0
;
end
else
begin
CHTOLSRAMiII
<=
CHTOLSRAMlII
;
end
end
always
@
(
posedge
HCLK
or
negedge
HRESETN
)
begin
if
(
HRESETN
==
1
'b
0
)
begin
CHTOLSRAMOlI
<=
1
'b
0
;
end
else
if
(
CHTOLSRAMIII
||
CHTOLSRAMlII
)
begin
CHTOLSRAMOlI
<=
1
'b
1
;
end
else
begin
CHTOLSRAMOlI
<=
1
'b
0
;
end
end
always
@
(
posedge
HCLK
or
negedge
HRESETN
)
begin
if
(
HRESETN
==
1
'b
0
)
begin
CHTOLSRAMoI
<=
1
'b
0
;
end
else
begin
CHTOLSRAMoI
<=
CHTOLSRAMoII
;
end
end
endmodule
