summaryrefslogtreecommitdiff
path: root/hdl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--hdl/core.sv31
-rw-r--r--hdl/defs.svh2
-rw-r--r--hdl/rs232.sv26
-rw-r--r--hdl/top.sv133
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;
115bit tx_valid; 123bit tx_valid;
116bit [7:0] tx_data; 124bit [7:0] tx_data;
117 125
118alt_jtag_atlantic 126assign tx_ready = uart_tx_ready;
119 #( .INSTANCE_ID(JTAG_INSTANCE) 127assign uart_tx_valid = tx_valid;
120 , .LOG2_RXFIFO_DEPTH(10) 128assign uart_tx_data = tx_data;
121 , .LOG2_TXFIFO_DEPTH(10) 129assign uart_rx_ready = rx_ready;
122 , .SLD_AUTO_INSTANCE_INDEX("NO") 130assign rx_valid = uart_rx_valid;
123 ) uart 131assign 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
136bit [`PDP_ADDRESS_BITS-3-1:7] page; 133bit [`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
diff --git a/hdl/top.sv b/hdl/top.sv
index 20294ff..ca45aa9 100644
--- a/hdl/top.sv
+++ b/hdl/top.sv
@@ -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