1 `include "master_rom.v"
7 // s/192/3/ for 19200 baud uart
10 module master(input CLKin, output [4:0] led, output uart_tx, input uart_rx, output reg ready_out = 1, input ready_in);
14 //pll pll (.clock_in(CLKin), .clock_out(clk));
16 reg [20:0] counter = 0;
20 always @ (posedge CLKin) begin
21 if(counter == 5000) begin
26 counter <= counter + 1;
29 reg [3:0] program_counter = 0;
30 wire [31:0] rom_output;
32 master_rom master_rom (.clk(clk), .addr(program_counter), .data(rom_output));
36 `define STATE_WAIT_PROPAGATE 1
37 `define STATE_WAIT_NEWS 2
38 `define STATE_PROPAGATE_NEWS 3
39 `define STATE_WASTE_TIME 4
41 reg [5:0] state = `STATE_SEND;
42 reg [5:0] uart_ptr = 0;
47 reg [7:0] tx_byte = 0;
51 // 19200 (actually 300) baud uart
52 uart #(.CLOCK_DIVIDE(`UART_DIVIDE)) uart (.clk(clk), .rx(uart_rx), .tx(uart_tx), .received(received), .transmit(transmit), .tx_byte(tx_byte), .rx_byte(rx_byte), .is_receiving(is_receiving), .is_transmitting(is_transmitting));
54 reg [15:0] waste_counter = 0;
56 reg [7:0] saved_news [3:0];
58 assign led[4] = state != `STATE_WASTE_TIME;
61 always @(posedge clk) begin
66 end else if(uart_ptr == 4) begin
67 program_counter <= program_counter + 1;
69 if(rom_output[26:24] == 6) // `OP_ROUTE
70 state <= `STATE_WAIT_NEWS;
72 state <= `STATE_WAIT_PROPAGATE;
73 end else if(!is_transmitting && ready_in) begin
74 tx_byte <= rom_output[uart_ptr * 8 +: 8];
76 uart_ptr <= uart_ptr + 1;
80 `STATE_WAIT_PROPAGATE: begin
82 state <= `STATE_WASTE_TIME;
86 `STATE_WASTE_TIME: begin
87 if(waste_counter == 100) begin
91 waste_counter <= waste_counter + 1;
94 `STATE_WAIT_NEWS: begin
95 /** On a route instruction, we:
96 - receive the instruction back
99 - go back to `STATE_SEND
101 if(uart_ptr == 8) begin
102 state <= `STATE_PROPAGATE_NEWS;
104 end else if(received) begin
105 if(uart_ptr[2]) /* uart_ptr >= 4 */
106 saved_news[uart_ptr[1:0]] <= rx_byte;
107 uart_ptr <= uart_ptr + 1;
109 end // case: `STATE_WAIT_NEWS
111 `STATE_PROPAGATE_NEWS: begin
112 if(uart_ptr == 4) begin
113 state <= `STATE_WASTE_TIME;
115 end else if(!is_transmitting && ready_in) begin
116 tx_byte <= saved_news[uart_ptr];
118 uart_ptr <= uart_ptr + 1;