diff options
Diffstat (limited to '')
| -rw-r--r-- | hdl/top.sv | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/hdl/top.sv b/hdl/top.sv new file mode 100644 index 0000000..7ec57b7 --- /dev/null +++ b/hdl/top.sv | |||
| @@ -0,0 +1,298 @@ | |||
| 1 | `include "defs.svh" | ||
| 2 | |||
| 3 | module top | ||
| 4 | ( input bit clock | ||
| 5 | , input bit resetn | ||
| 6 | |||
| 7 | , inout wire [10:1] gpioa | ||
| 8 | , inout wire [28:13] gpiob | ||
| 9 | , inout wire [40:31] gpioc | ||
| 10 | |||
| 11 | , output bit ram_resetn | ||
| 12 | , output bit ram_csn | ||
| 13 | , output bit ram_clkp | ||
| 14 | , output bit ram_clkn | ||
| 15 | , inout bit ram_rwds | ||
| 16 | , inout bit [7:0] ram_data | ||
| 17 | ); | ||
| 18 | |||
| 19 | bit internal_clock; | ||
| 20 | bit internal_reset; | ||
| 21 | pll | ||
| 22 | #( .MULTIPLY_BY(1) | ||
| 23 | , .DIVIDE_BY(1) | ||
| 24 | ) fastpll | ||
| 25 | ( .native_clk(clock) | ||
| 26 | , .reset_n(resetn) | ||
| 27 | , .target_clk(internal_clock) | ||
| 28 | , .reset(internal_reset) | ||
| 29 | ); | ||
| 30 | |||
| 31 | bit ram_rx_ready; | ||
| 32 | bit ram_rx_valid; | ||
| 33 | uart_byte_t ram_rx_data; | ||
| 34 | |||
| 35 | bit ram_tx_ready; | ||
| 36 | bit ram_tx_valid; | ||
| 37 | uart_byte_t ram_tx_data; | ||
| 38 | |||
| 39 | bit ram_echo_in0_ready; | ||
| 40 | bit ram_echo_in0_valid; | ||
| 41 | uart_byte_t ram_echo_in0_data; | ||
| 42 | |||
| 43 | bit ram_echo_in1_ready; | ||
| 44 | bit ram_echo_in1_valid; | ||
| 45 | uart_byte_t ram_echo_in1_data; | ||
| 46 | |||
| 47 | bit command_ready; | ||
| 48 | bit command_valid; | ||
| 49 | ram_command_t command_data; | ||
| 50 | |||
| 51 | bit result_ready; | ||
| 52 | bit result_valid; | ||
| 53 | ram_read_response_t result_data; | ||
| 54 | |||
| 55 | bit ram_rwds_oe; | ||
| 56 | bit ram_rwds_out; | ||
| 57 | assign ram_rwds = ram_rwds_oe ? ram_rwds_out : 1'bZ; | ||
| 58 | |||
| 59 | bit ram_data_oe; | ||
| 60 | bit [7:0] ram_data_out; | ||
| 61 | assign ram_data = ram_data_oe ? ram_data_out : 8'bZ; | ||
| 62 | |||
| 63 | alt_jtag_atlantic | ||
| 64 | #( .INSTANCE_ID(0) | ||
| 65 | , .LOG2_RXFIFO_DEPTH(6) | ||
| 66 | , .LOG2_TXFIFO_DEPTH(6) | ||
| 67 | , .SLD_AUTO_INSTANCE_INDEX("NO") | ||
| 68 | ) ram_jtag | ||
| 69 | ( .clk(internal_clock) | ||
| 70 | , .rst_n(!internal_reset) | ||
| 71 | |||
| 72 | , .r_dat(ram_tx_data) | ||
| 73 | , .r_val(ram_tx_valid) | ||
| 74 | , .r_ena(ram_tx_ready) | ||
| 75 | |||
| 76 | , .t_dat(ram_rx_data) | ||
| 77 | , .t_dav(ram_rx_ready) | ||
| 78 | , .t_ena(ram_rx_valid) | ||
| 79 | ); | ||
| 80 | |||
| 81 | echo_arbiter arb | ||
| 82 | ( .clock(internal_clock) | ||
| 83 | , .reset(internal_reset) | ||
| 84 | |||
| 85 | , .in0_ready(ram_echo_in0_ready) | ||
| 86 | , .in0_valid(ram_echo_in0_valid) | ||
| 87 | , .in0_data(ram_echo_in0_data) | ||
| 88 | |||
| 89 | , .in1_ready(ram_echo_in1_ready) | ||
| 90 | , .in1_valid(ram_echo_in1_valid) | ||
| 91 | , .in1_data(ram_echo_in1_data) | ||
| 92 | |||
| 93 | , .out_ready(ram_tx_ready) | ||
| 94 | , .out_valid(ram_tx_valid) | ||
| 95 | , .out_data(ram_tx_data) | ||
| 96 | ); | ||
| 97 | |||
| 98 | command_parser | ||
| 99 | #( .TAG(0) | ||
| 100 | ) parser | ||
| 101 | ( .clock(internal_clock) | ||
| 102 | , .reset(internal_reset) | ||
| 103 | |||
| 104 | , .uart_ready(ram_rx_ready) | ||
| 105 | , .uart_valid(ram_rx_valid) | ||
| 106 | , .uart_data(ram_rx_data) | ||
| 107 | |||
| 108 | , .echo_ready(ram_echo_in0_ready) | ||
| 109 | , .echo_valid(ram_echo_in0_valid) | ||
| 110 | , .echo_data(ram_echo_in0_data) | ||
| 111 | |||
| 112 | , .command_ready(command_ready) | ||
| 113 | , .command_valid(command_valid) | ||
| 114 | , .command_data(command_data) | ||
| 115 | ); | ||
| 116 | |||
| 117 | ram_controller ram | ||
| 118 | ( .clock(internal_clock) | ||
| 119 | , .reset(internal_reset) | ||
| 120 | |||
| 121 | , .command_ready(command_ready) | ||
| 122 | , .command_valid(command_valid) | ||
| 123 | , .command_data(command_data) | ||
| 124 | |||
| 125 | , .result_ready(result_ready) | ||
| 126 | , .result_valid(result_valid) | ||
| 127 | , .result_data(result_data) | ||
| 128 | |||
| 129 | , .ram_resetn(ram_resetn) | ||
| 130 | , .ram_csn(ram_csn) | ||
| 131 | , .ram_clkp(ram_clkp) | ||
| 132 | , .ram_clkn(ram_clkn) | ||
| 133 | , .ram_rwds_oe(ram_rwds_oe) | ||
| 134 | , .ram_rwds_in(ram_rwds) | ||
| 135 | , .ram_rwds_out(ram_rwds_out) | ||
| 136 | , .ram_data_oe(ram_data_oe) | ||
| 137 | , .ram_data_in(ram_data) | ||
| 138 | , .ram_data_out(ram_data_out) | ||
| 139 | ); | ||
| 140 | |||
| 141 | result_printer | ||
| 142 | #( .TAG(0) | ||
| 143 | |||
| 144 | ( .clock(internal_clock) | ||
| 145 | , .reset(internal_reset) | ||
| 146 | |||
| 147 | , .result_ready(result_ready) | ||
| 148 | , .result_valid(result_valid) | ||
| 149 | , .result_data(result_data) | ||
| 150 | |||
| 151 | , .echo_ready(ram_echo_in1_ready) | ||
| 152 | , .echo_valid(ram_echo_in1_valid) | ||
| 153 | , .echo_data(ram_echo_in1_data) | ||
| 154 | ); | ||
| 155 | |||
| 156 | bit slow_clock; | ||
| 157 | bit slow_reset; | ||
| 158 | pll | ||
| 159 | #( .MULTIPLY_BY(1) | ||
| 160 | , .DIVIDE_BY(500) | ||
| 161 | ) slowpll | ||
| 162 | ( .native_clk(clock) | ||
| 163 | , .reset_n(resetn) | ||
| 164 | , .target_clk(slow_clock) | ||
| 165 | , .reset(slow_reset) | ||
| 166 | ); | ||
| 167 | |||
| 168 | bit [8:1][12:1] led; | ||
| 169 | bit [3:1][12:1] switch; | ||
| 170 | |||
| 171 | front_panel panel | ||
| 172 | ( .clk(slow_clock) | ||
| 173 | , .reset(slow_reset) | ||
| 174 | |||
| 175 | , .led(led) | ||
| 176 | , .switch(switch) | ||
| 177 | |||
| 178 | , .gpioa(gpioa) | ||
| 179 | , .gpiob(gpiob) | ||
| 180 | , .gpioc(gpioc) | ||
| 181 | ); | ||
| 182 | |||
| 183 | bit [2:0] switch_df; | ||
| 184 | bit [2:0] switch_if; | ||
| 185 | bit [11:0] switch_sr; | ||
| 186 | bit switch_start; | ||
| 187 | bit switch_load_add; | ||
| 188 | bit switch_dep; | ||
| 189 | bit switch_exam; | ||
| 190 | bit switch_cont; | ||
| 191 | bit switch_stop; | ||
| 192 | bit switch_sing_step; | ||
| 193 | bit switch_sing_inst; | ||
| 194 | |||
| 195 | // Note that we are reversing the order here on a number of aggregates because | ||
| 196 | // the panel model gives us LEDs and switches in schematic-order, which is the | ||
| 197 | // opposite of the bit order | ||
| 198 | assign switch_df = {switch[2][1], switch[2][2], switch[2][3]}; | ||
| 199 | assign switch_if = {switch[2][4], switch[2][5], switch[2][6]}; | ||
| 200 | assign switch_sr = {switch[1][1], switch[1][2], switch[1][3], switch[1][4], switch[1][5], switch[1][6], switch[1][7], switch[1][8], switch[1][9], switch[1][10], switch[1][11], switch[1][12]}; | ||
| 201 | assign switch_start = switch[3][1]; | ||
| 202 | assign switch_load_add = switch[3][2]; | ||
| 203 | assign switch_dep = switch[3][3]; | ||
| 204 | assign switch_exam = switch[3][4]; | ||
| 205 | assign switch_cont = switch[3][5]; | ||
| 206 | assign switch_stop = switch[3][6]; | ||
| 207 | `ifdef HISTORIC_SWITCH_BEHAVIOUR | ||
| 208 | assign switch_sing_step = !switch[3][7]; | ||
| 209 | assign switch_sing_inst = !switch[3][8]; | ||
| 210 | `else | ||
| 211 | assign switch_sing_step = switch[3][7]; | ||
| 212 | assign switch_sing_inst = switch[3][8]; | ||
| 213 | `endif | ||
| 214 | |||
| 215 | bit [11:0] led_pc; | ||
| 216 | bit [11:0] led_memaddr; | ||
| 217 | bit [11:0] led_memdata; | ||
| 218 | bit [11:0] led_acc; | ||
| 219 | bit [11:0] led_mq; | ||
| 220 | bit led_and; | ||
| 221 | bit led_tad; | ||
| 222 | bit led_isz; | ||
| 223 | bit led_dca; | ||
| 224 | bit led_jms; | ||
| 225 | bit led_jmp; | ||
| 226 | bit led_iot; | ||
| 227 | bit led_opr; | ||
| 228 | bit led_fetch; | ||
| 229 | bit led_execute; | ||
| 230 | bit led_defer; | ||
| 231 | bit led_word_count; | ||
| 232 | bit led_current_address; | ||
| 233 | bit led_break; | ||
| 234 | bit led_ion; | ||
| 235 | bit led_pause; | ||
| 236 | bit led_run; | ||
| 237 | bit [4:0] led_step_counter; | ||
| 238 | bit [2:0] led_df; | ||
| 239 | bit [2:0] led_if; | ||
| 240 | bit led_link; | ||
| 241 | |||
| 242 | // Note that we are reversing the order here on a number of aggregates because | ||
| 243 | // the panel model gives us LEDs and switches in schematic-order, which is the | ||
| 244 | // opposite of the bit order | ||
| 245 | assign led[1] = {led_pc[0], led_pc[1], led_pc[2], led_pc[3], led_pc[4], led_pc[5], led_pc[6], led_pc[7], led_pc[8], led_pc[9], led_pc[10], led_pc[11]}; | ||
| 246 | assign led[2] = {led_memaddr[0], led_memaddr[1], led_memaddr[2], led_memaddr[3], led_memaddr[4], led_memaddr[5], led_memaddr[6], led_memaddr[7], led_memaddr[8], led_memaddr[9], led_memaddr[10], led_memaddr[11]}; | ||
| 247 | assign led[3] = {led_memdata[0], led_memdata[1], led_memdata[2], led_memdata[3], led_memdata[4], led_memdata[5], led_memdata[6], led_memdata[7], led_memdata[8], led_memdata[9], led_memdata[10], led_memdata[11]}; | ||
| 248 | assign led[4] = {led_acc[0], led_acc[1], led_acc[2], led_acc[3], led_acc[4], led_acc[5], led_acc[6], led_acc[7], led_acc[8], led_acc[9], led_acc[10], led_acc[11]}; | ||
| 249 | assign led[5] = {led_mq[0], led_mq[1], led_mq[2], led_mq[3], led_mq[4], led_mq[5], led_mq[6], led_mq[7], led_mq[8], led_mq[9], led_mq[10], led_mq[11]}; | ||
| 250 | assign led[6] = {led_word_count, led_defer, led_execute, led_fetch, led_opr, led_iot, led_jmp, led_jms, led_dca, led_isz, led_tad, led_and}; | ||
| 251 | assign led[7] = {2'b0, led_step_counter[4], led_step_counter[3], led_step_counter[2], led_step_counter[1], led_step_counter[0], led_run, led_pause, led_ion, led_break, led_current_address}; | ||
| 252 | assign led[8] = {5'b0, led_link, led_if[0], led_if[1], led_if[2], led_df[0], led_df[1], led_df[2]}; | ||
| 253 | |||
| 254 | core cpu | ||
| 255 | ( .clk(internal_clock) | ||
| 256 | , .reset(internal_reset) | ||
| 257 | |||
| 258 | , .switch_df(switch_df) | ||
| 259 | , .switch_if(switch_if) | ||
| 260 | , .switch_sr(switch_sr) | ||
| 261 | , .switch_start(switch_start) | ||
| 262 | , .switch_load_add(switch_load_add) | ||
| 263 | , .switch_dep(switch_dep) | ||
| 264 | , .switch_exam(switch_exam) | ||
| 265 | , .switch_cont(switch_cont) | ||
| 266 | , .switch_stop(switch_stop) | ||
| 267 | , .switch_sing_step(switch_sing_step) | ||
| 268 | , .switch_sing_inst(switch_sing_inst) | ||
| 269 | |||
| 270 | , .led_pc(led_pc) | ||
| 271 | , .led_memaddr(led_memaddr) | ||
| 272 | , .led_memdata(led_memdata) | ||
| 273 | , .led_acc(led_acc) | ||
| 274 | , .led_mq(led_mq) | ||
| 275 | , .led_and(led_and) | ||
| 276 | , .led_tad(led_tad) | ||
| 277 | , .led_isz(led_isz) | ||
| 278 | , .led_dca(led_dca) | ||
| 279 | , .led_jms(led_jms) | ||
| 280 | , .led_jmp(led_jmp) | ||
| 281 | , .led_iot(led_iot) | ||
| 282 | , .led_opr(led_opr) | ||
| 283 | , .led_fetch(led_fetch) | ||
| 284 | , .led_execute(led_execute) | ||
| 285 | , .led_defer(led_defer) | ||
| 286 | , .led_word_count(led_word_count) | ||
| 287 | , .led_current_address(led_current_address) | ||
| 288 | , .led_break(led_break) | ||
| 289 | , .led_ion(led_ion) | ||
| 290 | , .led_pause(led_pause) | ||
| 291 | , .led_run(led_run) | ||
| 292 | , .led_step_counter(led_step_counter) | ||
| 293 | , .led_df(led_df) | ||
| 294 | , .led_if(led_if) | ||
| 295 | , .led_link(led_link) | ||
| 296 | ); | ||
| 297 | |||
| 298 | endmodule | ||
