aboutsummaryrefslogtreecommitdiffstats
path: root/hdl/turbo_top.v
blob: eb17446c75e293c1e1ccb2cbf37ea1b480682863 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
`timescale 1ns / 1ps

module turbo_top (
    input wire SD_CLK,
    inout wire SD_CMD,
    inout wire [3:0] SD_DAT,
    
    output wire SPI0_SCK,
    output wire SPI0_MOSI,
    input  wire SPI0_MISO,
    output wire SPI0_CS,
    
    output wire SPI1_SCK,
    output wire SPI1_MOSI,
    input  wire SPI1_MISO,
    output wire SPI1_CS,
    
    output wire UART_TX,
    input  wire UART_RX,
    
    output wire LED0,
    output wire LED1,
    output wire LED2,
    output wire LED3,
    
    input  wire CRESET_B,
    output wire CDONE,
    
    input wire CLK_12MHZ,
    
    output wire PWR_EN,
    input  wire PWR_GOOD
);

    wire clk_12mhz;
    wire clk_50mhz;
    wire clk_sdio;
    wire clk_spi;
    
    wire rst_n;
    wire sdio_cmd_dir;
    wire [3:0] sdio_dat_dir;
    
    wire [7:0] cmd_opcode;
    wire [31:0] cmd_address;
    wire [15:0] cmd_length;
    wire cmd_valid;
    wire cmd_ready;
    
    wire [7:0] data_in;
    wire data_in_valid;
    wire data_in_ready;
    
    wire [7:0] data_out;
    wire data_out_valid;
    wire data_out_ready;
    
    wire [3:0] sdio_state;
    wire [3:0] spi_state;
    wire [3:0] flash_select;
    
    wire [7:0] status_reg;
    
    clock_divider clock_div (
        .clk_in(CLK_12MHZ),
        .rst_n(CRESET_B),
        .clk_12mhz(clk_12mhz),
        .clk_50mhz(clk_50mhz),
        .clk_sdio(clk_sdio),
        .clk_spi(clk_spi)
    );
    
    sdio_to_spi sdio_converter (
        .sd_clk(SD_CLK),
        .sd_cmd(SD_CMD),
        .sd_dat(SD_DAT),
        .sd_cmd_dir(sdio_cmd_dir),
        .sd_dat_dir(sdio_dat_dir),
        .clk_sys(clk_50mhz),
        .rst_n(rst_n),
        .cmd_opcode(cmd_opcode),
        .cmd_address(cmd_address),
        .cmd_length(cmd_length),
        .cmd_valid(cmd_valid),
        .cmd_ready(cmd_ready),
        .data_out(data_out),
        .data_out_valid(data_out_valid),
        .data_out_ready(data_out_ready),
        .data_in(data_in),
        .data_in_valid(data_in_valid),
        .data_in_ready(data_in_ready),
        .sdio_state(sdio_state),
        .status_reg(status_reg[3:0])
    );
    
    spi_controller spi_ctrl (
        .clk(clk_spi),
        .rst_n(rst_n),
        .cmd_opcode(cmd_opcode),
        .cmd_address(cmd_address),
        .cmd_length(cmd_length),
        .cmd_valid(cmd_valid),
        .cmd_ready(cmd_ready),
        .data_in(data_in),
        .data_in_valid(data_in_valid),
        .data_in_ready(data_in_ready),
        .data_out(data_out),
        .data_out_valid(data_out_valid),
        .data_out_ready(data_out_ready),
        .spi0_sck(SPI0_SCK),
        .spi0_mosi(SPI0_MOSI),
        .spi0_miso(SPI0_MISO),
        .spi0_cs(SPI0_CS),
        .spi1_sck(SPI1_SCK),
        .spi1_mosi(SPI1_MOSI),
        .spi1_miso(SPI1_MISO),
        .spi1_cs(SPI1_CS),
        .flash_select(flash_select),
        .spi_state(spi_state),
        .status_reg(status_reg[7:4])
    );
    
    fifo_buffer data_fifo (
        .wr_clk(clk_sdio),
        .rd_clk(clk_spi),
        .rst_n(rst_n),
        .wr_data(data_out),
        .wr_valid(data_out_valid),
        .wr_ready(data_out_ready),
        .rd_data(data_in),
        .rd_valid(data_in_valid),
        .rd_ready(data_in_ready),
        .fifo_empty(),
        .fifo_full(),
        .fifo_level()
    );
    
    assign rst_n = CRESET_B & PWR_GOOD;
    
    assign SD_CMD = sdio_cmd_dir ? 1'bz : 1'b0;
    generate
        genvar i;
        for (i = 0; i < 4; i = i + 1) begin : dat_dir_gen
            assign SD_DAT[i] = sdio_dat_dir[i] ? 1'bz : 1'b0;
        end
    endgenerate
    
    assign LED0 = ~rst_n;
    assign LED1 = |sdio_state;
    assign LED2 = |spi_state;
    assign LED3 = |flash_select;
    
    assign UART_TX = UART_RX;
    
    assign PWR_EN = 1'b1;
    
    assign CDONE = 1'b1;
    
endmodule