blob: 0f898e1bb8ae010a7b8a50f0678472180c4d1f0e [file] [log] [blame]
/*
usb_uart_ecp5
Simple wrapper around the usb_uart which incorporates the Pin driver logic
so this doesn't clutter the top level circuit
Make the signature generic (usb_uart) and rely on the file inclusion process (makefile)
to bring the correct architecture in
----------------------------------------------------
usb_uart u_u (
.clk_48mhz (clk_48mhz),
.reset (reset),
// pins
.pin_usb_p( pin_usb_p ),
.pin_usb_n( pin_usb_n ),
// uart pipeline in (w.r.t module)
.pipe_in( pipe_in )
// uart pipeline out (w.r.t. module)
.pipe_out( pipe_out )
);
Utilization
707 LUTs?
*/
`include "../../pipe/rtl/pipe_defs.v"
module usb_uart #( parameter PipeSpec = `PS_d8 ) (
input clk_48mhz,
input reset,
// USB pins
inout pin_usb_p,
inout pin_usb_n,
inout [`P_m(PipeSpec):0] pipe_in,
inout [`P_m(PipeSpec):0] pipe_out,
output [11:0] debug
);
wire [`P_Data_m(PipeSpec):0] in_data;
wire in_valid;
wire in_ready;
wire [`P_Data_m(PipeSpec):0] out_data;
wire out_valid;
wire out_ready;
p_unpack_data #( .PipeSpec( PipeSpec ) ) in_unpack_data( .pipe(pipe_in), .data(in_data) );
p_unpack_valid_ready #( .PipeSpec( PipeSpec ) ) in_unpack_valid_ready( .pipe(pipe_in), .valid(in_valid), .ready(in_ready) );
// start and stop signals are ignored - packetization has to be escaped
usb_uart_np u_u_np(
clk_48mhz, reset,
pin_usb_p, pin_usb_n,
in_data, in_valid, in_ready,
out_data, out_valid, out_ready,
debug
);
p_pack_data #( .PipeSpec( PipeSpec ) ) out_pack_d( .data(out_data), .pipe(pipe_out) );
p_pack_valid_ready #( .PipeSpec( PipeSpec ) ) out_pack_vr( .valid(out_valid), .ready(out_ready), .pipe(pipe_out) );
endmodule
module usb_uart_np (
input clk_48mhz,
input reset,
// USB pins
inout pin_usb_p,
inout pin_usb_n,
// uart pipeline in (out of the device, into the host)
input [7:0] uart_in_data,
input uart_in_valid,
output uart_in_ready,
// uart pipeline out (into the device, out of the host)
output [7:0] uart_out_data,
output uart_out_valid,
input uart_out_ready,
output [11:0] debug
);
wire usb_p_tx;
wire usb_n_tx;
wire usb_p_rx;
wire usb_n_rx;
wire usb_tx_en;
// wire [11:0] debug_dum;
usb_uart_core_np u_u_c_np (
.clk_48mhz (clk_48mhz),
.reset (reset),
// pins - these must be connected properly to the outside world. See below.
.usb_p_tx(usb_p_tx),
.usb_n_tx(usb_n_tx),
.usb_p_rx(usb_p_rx),
.usb_n_rx(usb_n_rx),
.usb_tx_en(usb_tx_en),
// uart pipeline in
.uart_in_data( uart_in_data ),
.uart_in_valid( uart_in_valid ),
.uart_in_ready( uart_in_ready ),
// uart pipeline out
.uart_out_data( uart_out_data ),
.uart_out_valid( uart_out_valid ),
.uart_out_ready( uart_out_ready ),
.debug( debug )
);
wire usb_p_in;
wire usb_n_in;
assign usb_p_rx = usb_tx_en ? 1'b1 : usb_p_in;
assign usb_n_rx = usb_tx_en ? 1'b0 : usb_n_in;
// T = TRISTATE (not transmit)
BB io_p( .I( usb_p_tx ), .T( !usb_tx_en ), .O( usb_p_in ), .B( pin_usb_p ) );
BB io_n( .I( usb_n_tx ), .T( !usb_tx_en ), .O( usb_n_in ), .B( pin_usb_n ) );
endmodule