diff options
Diffstat (limited to '')
| -rw-r--r-- | hdl/core.sv | 31 | ||||
| -rw-r--r-- | hdl/defs.svh | 2 | ||||
| -rw-r--r-- | hdl/rs232.sv | 26 | ||||
| -rw-r--r-- | hdl/top.sv | 133 |
4 files changed, 161 insertions, 31 deletions
diff --git a/hdl/core.sv b/hdl/core.sv index 7fdd20a..6827b8e 100644 --- a/hdl/core.sv +++ b/hdl/core.sv | |||
| @@ -8,6 +8,14 @@ module core | |||
| 8 | ( input bit clk | 8 | ( input bit clk |
| 9 | , input bit reset | 9 | , input bit reset |
| 10 | 10 | ||
| 11 | , input bit uart_tx_ready | ||
| 12 | , output bit uart_tx_valid | ||
| 13 | , output uart_byte_t uart_tx_data | ||
| 14 | |||
| 15 | , output bit uart_rx_ready | ||
| 16 | , input bit uart_rx_valid | ||
| 17 | , input uart_byte_t uart_rx_data | ||
| 18 | |||
| 11 | , input bit mem_command_ready | 19 | , input bit mem_command_ready |
| 12 | , output bit mem_command_valid | 20 | , output bit mem_command_valid |
| 13 | , output pdp_command_t mem_command | 21 | , output pdp_command_t mem_command |
| @@ -115,23 +123,12 @@ bit tx_ready; | |||
| 115 | bit tx_valid; | 123 | bit tx_valid; |
| 116 | bit [7:0] tx_data; | 124 | bit [7:0] tx_data; |
| 117 | 125 | ||
| 118 | alt_jtag_atlantic | 126 | assign tx_ready = uart_tx_ready; |
| 119 | #( .INSTANCE_ID(JTAG_INSTANCE) | 127 | assign uart_tx_valid = tx_valid; |
| 120 | , .LOG2_RXFIFO_DEPTH(10) | 128 | assign uart_tx_data = tx_data; |
| 121 | , .LOG2_TXFIFO_DEPTH(10) | 129 | assign uart_rx_ready = rx_ready; |
| 122 | , .SLD_AUTO_INSTANCE_INDEX("NO") | 130 | assign rx_valid = uart_rx_valid; |
| 123 | ) uart | 131 | assign rx_data = uart_rx_data; |
| 124 | ( .clk(clk) | ||
| 125 | , .rst_n(!reset) | ||
| 126 | |||
| 127 | , .r_dat(tx_data) | ||
| 128 | , .r_val(tx_valid) | ||
| 129 | , .r_ena(tx_ready) | ||
| 130 | |||
| 131 | , .t_dat(rx_data) | ||
| 132 | , .t_dav(rx_ready) | ||
| 133 | , .t_ena(rx_valid) | ||
| 134 | ); | ||
| 135 | 132 | ||
| 136 | bit [`PDP_ADDRESS_BITS-3-1:7] page; | 133 | bit [`PDP_ADDRESS_BITS-3-1:7] page; |
| 137 | 134 | ||
diff --git a/hdl/defs.svh b/hdl/defs.svh index 44336eb..3206764 100644 --- a/hdl/defs.svh +++ b/hdl/defs.svh | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | `define PDP_ADDRESS_BITS 15 | 6 | `define PDP_ADDRESS_BITS 15 |
| 7 | 7 | ||
| 8 | `define NUM_PDPS 12 | 8 | `define NUM_PDPS 2 |
| 9 | 9 | ||
| 10 | `define UART_BYTE_BITS 8 | 10 | `define UART_BYTE_BITS 8 |
| 11 | 11 | ||
diff --git a/hdl/rs232.sv b/hdl/rs232.sv index 2f631f8..03378ef 100644 --- a/hdl/rs232.sv +++ b/hdl/rs232.sv | |||
| @@ -20,7 +20,7 @@ module rs232_tx | |||
| 20 | , STOP | 20 | , STOP |
| 21 | } state; | 21 | } state; |
| 22 | 22 | ||
| 23 | bit [$clog2(`UART_BYTE_BITS+1):0] data_bits; | 23 | bit [$clog2(`UART_BYTE_BITS):0] data_bits; |
| 24 | 24 | ||
| 25 | always @(posedge clock) begin | 25 | always @(posedge clock) begin |
| 26 | if (reset) begin | 26 | if (reset) begin |
| @@ -34,7 +34,7 @@ module rs232_tx | |||
| 34 | hold_valid = 1; | 34 | hold_valid = 1; |
| 35 | hold = out_data; | 35 | hold = out_data; |
| 36 | state = state.first; | 36 | state = state.first; |
| 37 | data_bits = `UART_BYTE_BITS; | 37 | data_bits = 0; |
| 38 | end | 38 | end |
| 39 | 39 | ||
| 40 | if (hold_valid) begin | 40 | if (hold_valid) begin |
| @@ -46,10 +46,11 @@ module rs232_tx | |||
| 46 | end | 46 | end |
| 47 | 47 | ||
| 48 | DATA: begin | 48 | DATA: begin |
| 49 | --data_bits; | 49 | tx = hold[data_bits]; |
| 50 | tx = !out_data[data_bits]; | 50 | if (data_bits == `UART_BYTE_BITS-1) |
| 51 | if (data_bits == 0) | ||
| 52 | state = state.next; | 51 | state = state.next; |
| 52 | else | ||
| 53 | ++data_bits; | ||
| 53 | end | 54 | end |
| 54 | 55 | ||
| 55 | STOP: begin | 56 | STOP: begin |
| @@ -86,8 +87,8 @@ module rs232_rx | |||
| 86 | , STOP | 87 | , STOP |
| 87 | } state; | 88 | } state; |
| 88 | 89 | ||
| 89 | uart_byte_t buffer; | 90 | uart_byte_t buffer; |
| 90 | bit [$clog2(`UART_BYTE_BITS+1):0] data_bits; | 91 | bit [$clog2(`UART_BYTE_BITS):0] data_bits; |
| 91 | 92 | ||
| 92 | always @(posedge clock) begin | 93 | always @(posedge clock) begin |
| 93 | if (reset) begin | 94 | if (reset) begin |
| @@ -105,21 +106,22 @@ module rs232_rx | |||
| 105 | if (rx == 0) begin | 106 | if (rx == 0) begin |
| 106 | state = state.next; | 107 | state = state.next; |
| 107 | buffer = 0; | 108 | buffer = 0; |
| 108 | data_bits = `UART_BYTE_BITS; | 109 | data_bits = 0; |
| 109 | end | 110 | end |
| 110 | end | 111 | end |
| 111 | 112 | ||
| 112 | DATA: begin | 113 | DATA: begin |
| 113 | --data_bits; | 114 | buffer[data_bits] = rx; |
| 114 | buffer[data_bits] = !rx; | 115 | if (data_bits == `UART_BYTE_BITS-1) |
| 115 | if (data_bits == 0) | ||
| 116 | state = state.next; | 116 | state = state.next; |
| 117 | else | ||
| 118 | ++data_bits; | ||
| 117 | end | 119 | end |
| 118 | 120 | ||
| 119 | STOP: begin | 121 | STOP: begin |
| 120 | if (!in_valid && rx == 1) begin | 122 | if (!in_valid && rx == 1) begin |
| 121 | in_valid = 1; | 123 | in_valid = 1; |
| 122 | in_data = data_bits; | 124 | in_data = buffer; |
| 123 | end | 125 | end |
| 124 | state = state.next; | 126 | state = state.next; |
| 125 | end | 127 | end |
| @@ -9,6 +9,9 @@ module top | |||
| 9 | , inout wire [40:31] gpioc | 9 | , inout wire [40:31] gpioc |
| 10 | , output wire clock_out | 10 | , output wire clock_out |
| 11 | 11 | ||
| 12 | , output wire rs232_tx | ||
| 13 | , input wire rs232_rx | ||
| 14 | |||
| 12 | , output bit ram_resetn | 15 | , output bit ram_resetn |
| 13 | , output bit ram_csn | 16 | , output bit ram_csn |
| 14 | , output bit ram_clkp | 17 | , output bit ram_clkp |
| @@ -29,7 +32,91 @@ module top | |||
| 29 | , .reset(internal_reset) | 32 | , .reset(internal_reset) |
| 30 | ); | 33 | ); |
| 31 | 34 | ||
| 32 | assign clock_out = internal_clock; | 35 | //assign clock_out = internal_clock; |
| 36 | |||
| 37 | bit rs232_clock = 0; | ||
| 38 | bit [17:0] rs232_div = 0; | ||
| 39 | always @(posedge internal_clock) begin | ||
| 40 | if (internal_reset) begin | ||
| 41 | rs232_clock = 0; | ||
| 42 | rs232_div = 0; | ||
| 43 | end else begin | ||
| 44 | if (++rs232_div == 49987) begin // (30MHz/2)/300 | ||
| 45 | ++rs232_clock; | ||
| 46 | rs232_div = 0; | ||
| 47 | end | ||
| 48 | end | ||
| 49 | end | ||
| 50 | |||
| 51 | assign clock_out = rs232_clock; | ||
| 52 | |||
| 53 | bit wire_tx_ready; | ||
| 54 | bit wire_tx_valid; | ||
| 55 | uart_byte_t wire_tx_data; | ||
| 56 | |||
| 57 | rs232_tx wiretx | ||
| 58 | ( .clock(rs232_clock) | ||
| 59 | , .reset(internal_reset) | ||
| 60 | |||
| 61 | , .out_ready(wire_tx_ready) | ||
| 62 | , .out_valid(wire_tx_valid) | ||
| 63 | , .out_data(wire_tx_data) | ||
| 64 | |||
| 65 | , .tx(rs232_tx) | ||
| 66 | ); | ||
| 67 | |||
| 68 | bit rs232_tx_ready; | ||
| 69 | bit rs232_tx_valid; | ||
| 70 | uart_byte_t rs232_tx_data; | ||
| 71 | |||
| 72 | fifo | ||
| 73 | #( .WIDTH_BITS($bits(uart_byte_t)) | ||
| 74 | ) fifotx | ||
| 75 | ( .clock_in(internal_clock) | ||
| 76 | , .clock_out(rs232_clock) | ||
| 77 | |||
| 78 | , .in_ready(rs232_tx_ready) | ||
| 79 | , .in_valid(rs232_tx_valid) | ||
| 80 | , .in_data(rs232_tx_data) | ||
| 81 | |||
| 82 | , .out_ready(wire_tx_ready) | ||
| 83 | , .out_valid(wire_tx_valid) | ||
| 84 | , .out_data(wire_tx_data) | ||
| 85 | ); | ||
| 86 | |||
| 87 | bit wire_rx_ready; | ||
| 88 | bit wire_rx_valid; | ||
| 89 | uart_byte_t wire_rx_data; | ||
| 90 | |||
| 91 | rs232_rx wirerx | ||
| 92 | ( .clock(rs232_clock) | ||
| 93 | , .reset(internal_reset) | ||
| 94 | |||
| 95 | , .in_ready(wire_rx_ready) | ||
| 96 | , .in_valid(wire_rx_valid) | ||
| 97 | , .in_data(wire_rx_data) | ||
| 98 | |||
| 99 | , .rx(rs232_rx) | ||
| 100 | ); | ||
| 101 | |||
| 102 | bit rs232_rx_ready; | ||
| 103 | bit rs232_rx_valid; | ||
| 104 | uart_byte_t rs232_rx_data; | ||
| 105 | |||
| 106 | fifo | ||
| 107 | #( .WIDTH_BITS($bits(uart_byte_t)) | ||
| 108 | ) fiforx | ||
| 109 | ( .clock_in(rs232_clock) | ||
| 110 | , .clock_out(internal_clock) | ||
| 111 | |||
| 112 | , .in_ready(wire_rx_ready) | ||
| 113 | , .in_valid(wire_rx_valid) | ||
| 114 | , .in_data(wire_rx_data) | ||
| 115 | |||
| 116 | , .out_ready(rs232_rx_ready) | ||
| 117 | , .out_valid(rs232_rx_valid) | ||
| 118 | , .out_data(rs232_rx_data) | ||
| 119 | ); | ||
| 33 | 120 | ||
| 34 | bit ram_rx_ready; | 121 | bit ram_rx_ready; |
| 35 | bit ram_rx_valid; | 122 | bit ram_rx_valid; |
| @@ -334,12 +421,28 @@ module top | |||
| 334 | genvar i; | 421 | genvar i; |
| 335 | for (i = 0; i < `NUM_PDPS; ++i) begin : core | 422 | for (i = 0; i < `NUM_PDPS; ++i) begin : core |
| 336 | 423 | ||
| 424 | bit tx_ready; | ||
| 425 | bit tx_valid; | ||
| 426 | uart_byte_t tx_data; | ||
| 427 | |||
| 428 | bit rx_ready; | ||
| 429 | bit rx_valid; | ||
| 430 | uart_byte_t rx_data; | ||
| 431 | |||
| 337 | core | 432 | core |
| 338 | #( .JTAG_INSTANCE(1+i) | 433 | #( .JTAG_INSTANCE(1+i) |
| 339 | ) cpu | 434 | ) cpu |
| 340 | ( .clk(internal_clock) | 435 | ( .clk(internal_clock) |
| 341 | , .reset(internal_reset) | 436 | , .reset(internal_reset) |
| 342 | 437 | ||
| 438 | , .uart_tx_ready(tx_ready) | ||
| 439 | , .uart_tx_valid(tx_valid) | ||
| 440 | , .uart_tx_data(tx_data) | ||
| 441 | |||
| 442 | , .uart_rx_ready(rx_ready) | ||
| 443 | , .uart_rx_valid(rx_valid) | ||
| 444 | , .uart_rx_data(rx_data) | ||
| 445 | |||
| 343 | , .mem_command_ready(pdp_command_ready[i]) | 446 | , .mem_command_ready(pdp_command_ready[i]) |
| 344 | , .mem_command_valid(pdp_command_valid[i]) | 447 | , .mem_command_valid(pdp_command_valid[i]) |
| 345 | , .mem_command(pdp_command_data[i]) | 448 | , .mem_command(pdp_command_data[i]) |
| @@ -388,6 +491,34 @@ module top | |||
| 388 | , .led_link(local_led_link[i]) | 491 | , .led_link(local_led_link[i]) |
| 389 | ); | 492 | ); |
| 390 | 493 | ||
| 494 | if (i == `NUM_PDPS-1) begin | ||
| 495 | assign tx_ready = rs232_tx_ready; | ||
| 496 | assign rs232_tx_valid = tx_valid; | ||
| 497 | assign rs232_tx_data = tx_data; | ||
| 498 | |||
| 499 | assign rs232_rx_ready = rx_ready; | ||
| 500 | assign rx_valid = rs232_rx_valid; | ||
| 501 | assign rx_data = rs232_rx_data; | ||
| 502 | end else begin | ||
| 503 | alt_jtag_atlantic | ||
| 504 | #( .INSTANCE_ID(1+i) | ||
| 505 | , .LOG2_RXFIFO_DEPTH(10) | ||
| 506 | , .LOG2_TXFIFO_DEPTH(10) | ||
| 507 | , .SLD_AUTO_INSTANCE_INDEX("NO") | ||
| 508 | ) uart | ||
| 509 | ( .clk(internal_clock) | ||
| 510 | , .rst_n(!internal_reset) | ||
| 511 | |||
| 512 | , .r_dat(tx_data) | ||
| 513 | , .r_val(tx_valid) | ||
| 514 | , .r_ena(tx_ready) | ||
| 515 | |||
| 516 | , .t_dat(rx_data) | ||
| 517 | , .t_dav(rx_ready) | ||
| 518 | , .t_ena(rx_valid) | ||
| 519 | ); | ||
| 520 | end | ||
| 521 | |||
| 391 | end | 522 | end |
| 392 | 523 | ||
| 393 | endgenerate | 524 | endgenerate |
