| /* |
| * Hello world on the ulx3s FTDI serial port at 3000000 baud. |
| */ |
| `default_nettype none |
| `include "uart.v" |
| `include "pll_120.v" |
| |
| module top( |
| input clk_25mhz, |
| output [7:0] led, |
| output wifi_gpio0, |
| input ftdi_txd, // from the ftdi chip |
| output ftdi_rxd, // to the ftdi chip |
| ); |
| // gpio0 must be tied high to prevent board from rebooting |
| assign wifi_gpio0 = 1; |
| |
| reg [7:0] led_reg; |
| assign led = led_reg; |
| |
| // Generate a 120 MHz clock from the 25 MHz reference |
| wire clk, locked, reset = !locked; |
| pll_120 pll_120_i(clk_25mhz, clk, locked); |
| |
| // send/recv data at on the FTDI port |
| // 120 MHz / 40 == 3 megabaud |
| wire uart_txd_ready; |
| reg [7:0] uart_txd; |
| reg uart_txd_strobe; |
| wire uart_rxd_strobe; |
| wire [7:0] uart_rxd; |
| |
| uart #(.DIVISOR(40)) uart_i( |
| .clk(clk), |
| .reset(reset), |
| // physical interface |
| .serial_txd(ftdi_rxd), // fpga --> ftdi |
| .serial_rxd(ftdi_txd), // fpga <-- ftdi |
| // logical interface |
| .txd(uart_txd), |
| .txd_ready(uart_txd_ready), |
| .txd_strobe(uart_txd_strobe), |
| .rxd(uart_rxd), |
| .rxd_strobe(uart_rxd_strobe), |
| ); |
| |
| reg [31:0] counter; |
| |
| always @(posedge clk) |
| begin |
| uart_txd_strobe <= 0; |
| counter <= counter + 1; |
| |
| if (reset) begin |
| counter <= 0; |
| end else |
| if (uart_rxd_strobe) |
| begin |
| // echo any input on the serial port back to the serial port |
| led_reg <= uart_rxd; |
| uart_txd <= uart_rxd; |
| uart_txd_strobe <= 1; |
| end else |
| if (counter[26:0] == 0 |
| && uart_txd_ready |
| && !uart_txd_strobe) |
| begin |
| // periodically print an increasing counter on the serial port |
| led_reg <= counter[31:23]; |
| uart_txd <= "0" + counter[31:27]; |
| uart_txd_strobe <= 1; |
| end |
| end |
| endmodule |