1 |
2 |
sfielding |
---- Adding new Santa Cruz daughter card peripheral to cyc_or12_mini_top.v ---
|
2 |
|
|
|
3 |
|
|
--------------------------------------------------------
|
4 |
|
|
1. Edit the Santa Cruz I/O.
|
5 |
|
|
--------------------------------------------------------
|
6 |
|
|
Edit the direction for the Santa Cruz I/O.
|
7 |
|
|
You will need to edit the following section to ensure that the Santa Cruz I/O
|
8 |
|
|
is set to the correct direction;
|
9 |
|
|
|
10 |
|
|
output SC_P_CLK;
|
11 |
|
|
output SC_RST_N;
|
12 |
|
|
output SC_CS_N;
|
13 |
|
|
input SC_P0;
|
14 |
|
|
output SC_P1;
|
15 |
|
|
output SC_P2;
|
16 |
|
|
...
|
17 |
|
|
output SC_P38;
|
18 |
|
|
output SC_P39;
|
19 |
|
|
|
20 |
|
|
--------------------------------------------------------
|
21 |
|
|
2. Modify the Wishbone bus interface
|
22 |
|
|
--------------------------------------------------------
|
23 |
|
|
If the new peripheral(s) have a Wishbone bus interface then
|
24 |
|
|
create local interface wires for each new peripheral, eg;
|
25 |
|
|
//
|
26 |
|
|
// Santa Cruz SD card i/f wires
|
27 |
|
|
//
|
28 |
|
|
wire [31:0] wb_sdCard_dat_i;
|
29 |
|
|
wire [7:0] wb_sdCard_dat_8bit;
|
30 |
|
|
wire [31:0] wb_sdCard_dat_o;
|
31 |
|
|
wire [31:0] wb_sdCard_adr_i;
|
32 |
|
|
wire [3:0] wb_sdCard_sel_i;
|
33 |
|
|
wire wb_sdCard_we_i;
|
34 |
|
|
wire wb_sdCard_cyc_i;
|
35 |
|
|
wire wb_sdCard_stb_i;
|
36 |
|
|
wire wb_sdCard_ack_o;
|
37 |
|
|
|
38 |
|
|
|
39 |
|
|
--------------------------------------------------------
|
40 |
|
|
3. Add peripheral wire connections
|
41 |
|
|
--------------------------------------------------------
|
42 |
|
|
Add local interface wires for each wired connection to
|
43 |
|
|
the Santa Cruz header, eg;
|
44 |
|
|
//
|
45 |
|
|
// Santa Cruz SD card
|
46 |
|
|
//
|
47 |
|
|
wire sdSpiClk;
|
48 |
|
|
wire sdSpiMasterDataIn;
|
49 |
|
|
wire sdSpiMasterDataOut;
|
50 |
|
|
wire sdSpiCS_n;
|
51 |
|
|
|
52 |
|
|
|
53 |
|
|
--------------------------------------------------------
|
54 |
|
|
4. Add instance(s) of the new peripheral(s), eg;
|
55 |
|
|
--------------------------------------------------------
|
56 |
|
|
|
57 |
|
|
spiMaster u_sdSpiMaster (
|
58 |
|
|
//Wishbone bus
|
59 |
|
|
.clk_i(wb_clk),
|
60 |
|
|
.rst_i(wb_rst),
|
61 |
|
|
.address_i(wb_sdCard_adr_i[7:0]),
|
62 |
|
|
.data_i(wb_sdCard_dat_i[7:0]),
|
63 |
|
|
.data_o(wb_sdCard_dat_8bit),
|
64 |
|
|
.strobe_i(wb_sdCard_stb_i),
|
65 |
|
|
.we_i(wb_sdCard_we_i),
|
66 |
|
|
.ack_o(wb_sdCard_ack_o),
|
67 |
|
|
// SPI logic clock
|
68 |
|
|
.spiSysClk(clk),
|
69 |
|
|
//SPI bus
|
70 |
|
|
.spiClkOut(sdSpiClk),
|
71 |
|
|
.spiDataIn(sdSpiMasterDataIn),
|
72 |
|
|
.spiDataOut(sdSpiMasterDataOut),
|
73 |
|
|
.spiCS_n(sdSpiCS_n)
|
74 |
|
|
);
|
75 |
|
|
|
76 |
|
|
--------------------------------------------------------
|
77 |
|
|
5. Configure the address
|
78 |
|
|
--------------------------------------------------------
|
79 |
|
|
If the new peripheral(s) have a Wishbone bus interface then
|
80 |
|
|
modify the parameter block for tc_top to set the address(es) of your new peripheral(s).
|
81 |
|
|
Typically you will be modifying the offset address of Target 2 through 8
|
82 |
|
|
|
83 |
|
|
tc_top #(`APP_ADDR_DEC_W,
|
84 |
|
|
`APP_ADDR_SRAM, //Target 0 address
|
85 |
|
|
`APP_ADDR_DEC_DRAM_W,
|
86 |
|
|
`APP_ADDR_DRAM, //Target 1 address
|
87 |
|
|
`APP_ADDR_DECP_W,
|
88 |
|
|
`APP_ADDR_PERIP, //Target 2-8 address base
|
89 |
|
|
`APP_ADDR_DEC_W,
|
90 |
|
|
`APP_ADDR_VGA, //Target 2 address offset
|
91 |
|
|
`APP_ADDR_ETH, //Target 3 address offset
|
92 |
|
|
`APP_ADDR_SD_CARD, //Target 4 address offset
|
93 |
|
|
`APP_ADDR_UART, //Target 5 address offset
|
94 |
|
|
`APP_ADDR_USB2, //Target 6 address offset
|
95 |
|
|
`APP_ADDR_SD, //Target 7 address offset
|
96 |
|
|
`APP_ADDR_RES2 //Target 8 address offset
|
97 |
|
|
|
98 |
|
|
--------------------------------------------------------
|
99 |
|
|
6. Set address constants
|
100 |
|
|
--------------------------------------------------------
|
101 |
|
|
Modify the address map in cyc_or12_defines.v to add your new address offsets;
|
102 |
|
|
|
103 |
|
|
//
|
104 |
|
|
// Address map
|
105 |
|
|
//
|
106 |
|
|
`define APP_ADDR_DEC_W 8
|
107 |
|
|
`define APP_ADDR_SRAM `APP_ADDR_DEC_W'h00
|
108 |
|
|
`define APP_ADDR_DEC_DRAM_W 2
|
109 |
|
|
`define APP_ADDR_DRAM `APP_ADDR_DEC_DRAM_W'b01
|
110 |
|
|
`define APP_ADDR_DECP_W 4
|
111 |
|
|
`define APP_ADDR_PERIP `APP_ADDR_DEC_W'h9
|
112 |
|
|
`define APP_ADDR_VGA `APP_ADDR_DEC_W'h97
|
113 |
|
|
`define APP_ADDR_ETH `APP_ADDR_DEC_W'h92
|
114 |
|
|
`define APP_ADDR_USB1 `APP_ADDR_DEC_W'h9d
|
115 |
|
|
`define APP_ADDR_SD_CARD `APP_ADDR_DEC_W'h9d
|
116 |
|
|
`define APP_ADDR_UART `APP_ADDR_DEC_W'h90
|
117 |
|
|
`define APP_ADDR_USB2 `APP_ADDR_DEC_W'h94
|
118 |
|
|
`define APP_ADDR_SD `APP_ADDR_DEC_W'h9e
|
119 |
|
|
`define APP_ADDR_RES2 `APP_ADDR_DEC_W'h9f
|
120 |
|
|
|
121 |
|
|
--------------------------------------------------------
|
122 |
|
|
7. Connect I/O to the Santa Cruz card
|
123 |
|
|
--------------------------------------------------------
|
124 |
|
|
Set the assignments required to connect the Santa Cruz I/O to the
|
125 |
|
|
new peripheral(s), eg;
|
126 |
|
|
|
127 |
|
|
assign SC_P_CLK = 1'b0;
|
128 |
|
|
assign SC_RST_N = 1'b0;
|
129 |
|
|
assign SC_CS_N = 1'b0;
|
130 |
|
|
assign sdSpiMasterDataIn = SC_P0;
|
131 |
|
|
assign SC_P1 = sdSpiClk;
|
132 |
|
|
assign SC_P2 = sdSpiMasterDataOut;
|
133 |
|
|
assign SC_P3 = sdSpiCS_n;
|
134 |
|
|
assign SC_P4 = 1'b0;
|
135 |
|
|
assign SC_P5 = 1'b0;
|
136 |
|
|
assign SC_P6 = 1'b0;
|
137 |
|
|
assign SC_P7 = 1'b0;
|
138 |
|
|
assign SC_P8 = 1'b0;
|
139 |
|
|
assign SC_P9 = 1'b0;
|
140 |
|
|
assign SC_P10 = 1'b0;
|
141 |
|
|
assign SC_P11 = 1'b0;
|
142 |
|
|
assign SC_P12 = 1'b0;
|
143 |
|
|
assign SC_P13 = 1'b0;
|
144 |
|
|
assign SC_P14 = 1'b0;
|
145 |
|
|
assign SC_P15 = 1'b0;
|
146 |
|
|
assign SC_P16 = 1'b0;
|
147 |
|
|
assign SC_P17 = 1'b0;
|
148 |
|
|
assign SC_P18 = 1'b0;
|
149 |
|
|
assign SC_P19 = 1'b0;
|
150 |
|
|
assign SC_P20 = 1'b0;
|
151 |
|
|
assign SC_P21 = 1'b0;
|
152 |
|
|
assign SC_P22 = 1'b0;
|
153 |
|
|
assign SC_P23 = 1'b0;
|
154 |
|
|
assign SC_P24 = 1'b0;
|
155 |
|
|
assign SC_P25 = 1'b0;
|
156 |
|
|
assign SC_P26 = 1'b0;
|
157 |
|
|
assign SC_P27 = 1'b0;
|
158 |
|
|
assign SC_P28 = 1'b0;
|
159 |
|
|
assign SC_P29 = 1'b0;
|
160 |
|
|
assign SC_P30 = 1'b0;
|
161 |
|
|
assign SC_P31 = 1'b0;
|
162 |
|
|
assign SC_P32 = 1'b0;
|
163 |
|
|
assign SC_P33 = 1'b0;
|
164 |
|
|
assign SC_P34 = 1'b0;
|
165 |
|
|
assign SC_P35 = 1'b0;
|
166 |
|
|
assign SC_P36 = 1'b0;
|
167 |
|
|
assign SC_P37 = 1'b0;
|
168 |
|
|
assign SC_P38 = 1'b0;
|
169 |
|
|
assign SC_P39 = 1'b0;
|
170 |
|
|
|
171 |
|
|
|
172 |
|
|
--------------------------------------------------------
|
173 |
|
|
8. Create a software project.
|
174 |
|
|
--------------------------------------------------------
|
175 |
|
|
Finally create a software project to test your new peripheral.
|
176 |
|
|
|
177 |
|
|
You can use sw/memTest as a basis for your new software project.
|
178 |
|
|
The memTest software project creates output files that are suitable
|
179 |
|
|
for use in simulation and hardware. Of course, if you want to target
|
180 |
|
|
a simulation you will need to create a simulation model of whatever
|
181 |
|
|
hardware exists on your Santa Cruz daughter card.
|
182 |
|
|
Add a constant to board.h to define the address of your new periperal, eg;
|
183 |
|
|
|
184 |
|
|
#define SD_CARD_BASE 0x9d000000
|
185 |
|
|
|
186 |
|
|
You can access your new periperal using the REG8 etc macros, eg;
|
187 |
|
|
|
188 |
|
|
REG8(SD_CARD_BASE + SPI_TX_FIFO_DATA_REG) = dataWrite;
|
189 |
|
|
dataRead = REG8(SD_CARD_BASE + SPI_RX_FIFO_DATA_REG);
|
190 |
|
|
|
191 |
|
|
|
192 |
|
|
|