123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- // vim: ts=4 sw=4 noexpandtab
- /*
- * pyprofibus FPGA PHY
- *
- * Copyright (c) 2019 Michael Buesch <m@bues.ch>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
- `include "profibus_phy_mod.v"
- `include "led_blink_mod.v"
- `ifdef DEBUG
- `define DEBUGOUT output
- `else
- `define DEBUGOUT input
- `endif
- module common_main_module #(
- parameter CLK_HZ = 0,
- ) (
- input clk,
- input n_reset,
- /* SPI bus */
- input spi_mosi,
- inout spi_miso,
- input spi_sck,
- input spi_ss,
- /* Profibus and status */
- input pb_rx,
- output pb_rx_error,
- output pb_rx_irq_edge,
- output pb_rx_irq_level,
- output pb_tx,
- output pb_tx_active,
- output pb_tx_error,
- /* Status and debugging */
- output led,
- `ifdef DEBUG
- output debug,
- `endif
- );
- wire miso;
- wire sck;
- wire ss;
- wire rx_error;
- wire rx_irq_edge;
- wire rx_irq_level;
- wire tx;
- wire tx_error;
- wire rx_active;
- wire tx_active;
- `ifdef DEBUG
- wire debug_w;
- `endif
- profibus_phy pb(
- .clk(clk),
- .n_reset(n_reset),
- .rx_irq_edge(rx_irq_edge),
- .rx_irq_level(rx_irq_level),
- .mosi(spi_mosi),
- .miso(miso),
- .sck(spi_sck),
- .ss(spi_ss),
- .rx(pb_rx),
- .rx_active(rx_active),
- .rx_error(rx_error),
- .tx(tx),
- .tx_active(tx_active),
- .tx_error(tx_error),
- `ifdef DEBUG
- .debug(debug_w),
- `endif
- );
- bufif0(spi_miso, miso, spi_ss);
- bufif0(pb_rx_error, rx_error, 0);
- bufif0(pb_rx_irq_edge, rx_irq_edge, 0);
- bufif0(pb_rx_irq_level, rx_irq_level, 0);
- bufif0(pb_tx, tx, 0);
- bufif0(pb_tx_active, tx_active, 0);
- bufif0(pb_tx_error, tx_error, 0);
- `ifdef DEBUG
- bufif0(debug, debug_w, 0);
- `endif
- wire led_w;
- wire led_enable;
- assign led_enable = tx_active | rx_active;
- led_blink #(
- .BLINK_ON_CLKS(CLK_HZ / 10),
- .BLINK_OFF_CLKS(CLK_HZ / 35),
- ) led_blink (
- .clk(clk),
- .n_reset(n_reset),
- .enable(led_enable),
- .led(led_w),
- );
- bufif0(led, led_w, 0);
- endmodule
- `ifdef TARGET_TINYFPGA_BX
- `include "pll_mod.v"
- /* TinyFPGA BX:
- * +---------------+
- * |P|GND Vin|P|
- * not reset |O|1 GND|P|
- * debug |D|2 3.3V|P|
- * |N|3 T 24|N|
- * |N|4 i 23|N|
- * |N|5 n 22|N|
- * |N|6 y 21|N|
- * |N|7 F 20|O| PB RX IRQ level
- * |N|8 P 19|O| PB RX IRQ edge
- * |N|9 G 18|O| PB TX error
- * SPI MISO |O|10 A 17|O| PB RX error
- * SPI MOSI |I|11 16|O| PB TX active
- * SPI SCK |I|12 B 15|O| PB UART TX
- * SPI SS |I|13 X 14|I| PB UART RX
- * +---------------+
- * P = power
- * I = input
- * O = output
- * D = debug output. Only if DEBUG is enabled. Otherwise N.
- * N = not connected
- */
- module top_module(
- input CLK,
- input SPI_SS,
- input SPI_SCK,
- input SPI_IO0,
- input SPI_IO1,
- input SPI_IO2,
- input SPI_IO3,
- input USBP,
- input USBN,
- output USBPU,
- output LED,
- input PIN_1,
- `DEBUGOUT PIN_2,
- input PIN_3,
- input PIN_4,
- input PIN_5,
- input PIN_6,
- input PIN_7,
- input PIN_8,
- input PIN_9,
- inout PIN_10,
- input PIN_11,
- input PIN_12,
- input PIN_13,
- input PIN_14,
- output PIN_15,
- output PIN_16,
- output PIN_17,
- output PIN_18,
- output PIN_19,
- output PIN_20,
- input PIN_21,
- input PIN_22,
- input PIN_23,
- input PIN_24,
- input PIN_25,
- input PIN_26,
- input PIN_27,
- input PIN_28,
- input PIN_29,
- input PIN_30,
- input PIN_31,
- );
- wire pll_clk_out;
- wire pll_locked;
- pll_module pll(
- .clock_in(CLK),
- .clock_out(pll_clk_out),
- .locked(pll_locked),
- );
- wire n_reset;
- assign n_reset = PIN_1 & pll_locked;
- common_main_module #(
- .CLK_HZ(`PLL_HZ),
- ) common (
- .clk(pll_clk_out),
- .n_reset(n_reset),
- .spi_mosi(PIN_11),
- .spi_miso(PIN_10),
- .spi_sck(PIN_12),
- .spi_ss(PIN_13),
- .pb_rx(PIN_14),
- .pb_rx_error(PIN_17),
- .pb_rx_irq_edge(PIN_19),
- .pb_rx_irq_level(PIN_20),
- .pb_tx(PIN_15),
- .pb_tx_active(PIN_16),
- .pb_tx_error(PIN_18),
- .led(LED),
- `ifdef DEBUG
- .debug(PIN_2),
- `endif
- );
- assign USBPU = 0; /* Disable USB */
- endmodule
- `else /* TARGET */
- `ERROR____TARGET_is_not_known
- `endif /* TARGET */
|