blob: 67da9e09219ff5aa8e1ae46d18e0d73e076e283b [file] [log] [blame]
module soc
(
input clk, // 16MHz Clock
output led, // User LED ON=1, OFF=0
inout usb_p, // USB+
inout usb_n, // USB-
output usb_pu // USB 1.5kOhm Pullup EN
);
localparam BIT_SAMPLES = 'd4;
localparam [6:0] DIVF = 12*BIT_SAMPLES-1;
wire clk_pll;
wire clk_1mhz;
wire clk_2mhz;
wire clk_4mhz;
wire clk_8mhz;
wire lock;
wire dp_pu;
wire dp_rx;
wire dn_rx;
wire dp_tx;
wire dn_tx;
wire tx_en;
wire [7:0] out_data;
wire out_valid;
wire in_ready;
wire [7:0] in_data;
wire in_valid;
wire out_ready;
// if FEEDBACK_PATH = SIMPLE:
// clk_freq = (ref_freq * (DIVF + 1)) / (2**DIVQ * (DIVR + 1));
SB_PLL40_CORE #(.DIVR(4'd0),
.DIVF(DIVF),
.DIVQ(3'd4),
.FILTER_RANGE(3'b001),
.FEEDBACK_PATH("SIMPLE"),
.DELAY_ADJUSTMENT_MODE_FEEDBACK("FIXED"),
.FDA_FEEDBACK(4'b0000),
.DELAY_ADJUSTMENT_MODE_RELATIVE("FIXED"),
.FDA_RELATIVE(4'b0000),
.SHIFTREG_DIV_MODE(2'b00),
.PLLOUT_SELECT("GENCLK"),
.ENABLE_ICEGATE(1'b0))
u_pll (.REFERENCECLK(clk), // 16MHz
.PLLOUTCORE(),
.PLLOUTGLOBAL(clk_pll), // 48MHz
.EXTFEEDBACK(1'b0),
.DYNAMICDELAY(8'd0),
.LOCK(lock),
.BYPASS(1'b0),
.RESETB(1'b1),
.SDI(1'b0),
.SDO(),
.SCLK(1'b0),
.LATCHINPUTVALUE(1'b1));
prescaler u_prescaler (.clk_i(clk),
.rstn_i(lock),
.clk_div16_o(clk_1mhz),
.clk_div8_o(clk_2mhz),
.clk_div4_o(clk_4mhz),
.clk_div2_o(clk_8mhz));
reg [1:0] rstn_sync;
wire rstn;
assign rstn = rstn_sync[0];
always @(posedge clk_1mhz or negedge lock) begin
if (~lock) begin
rstn_sync <= 2'd0;
end else begin
rstn_sync <= {1'b1, rstn_sync[1]};
end
end
reg [20:0] up_cnt;
reg [1:0] sleep_sq;
wire sleep;
always @(posedge clk_1mhz or negedge rstn) begin
if (~rstn) begin
up_cnt <= 'd0;
sleep_sq <= 2'b00;
end else begin
sleep_sq <= {sleep, sleep_sq[1]};
if (up_cnt[20] == 1'b0)
up_cnt <= up_cnt + 1;
else if (~sleep_sq[0])
up_cnt <= 21'hE0000;
end
end
assign led = ~dp_pu | ~up_cnt[20];
app u_app (.clk_i(clk_2mhz),
.rstn_i(rstn),
.sleep_o(sleep),
.out_data_i(out_data),
.out_valid_i(out_valid),
.in_ready_i(in_ready),
.out_ready_o(out_ready),
.in_data_o(in_data),
.in_valid_o(in_valid));
usb_cdc #(.VENDORID(16'h1D50),
.PRODUCTID(16'h6130),
.IN_BULK_MAXPACKETSIZE('d8),
.OUT_BULK_MAXPACKETSIZE('d8),
.BIT_SAMPLES(BIT_SAMPLES),
.USE_APP_CLK(1),
.APP_CLK_RATIO(BIT_SAMPLES*12/2)) // BIT_SAMPLES * 12MHz / 2MHz
u_usb_cdc (.frame_o(),
.configured_o(),
.app_clk_i(clk_2mhz),
.clk_i(clk_pll),
.rstn_i(rstn),
.out_ready_i(out_ready),
.in_data_i(in_data),
.in_valid_i(in_valid),
.dp_rx_i(dp_rx),
.dn_rx_i(dn_rx),
.out_data_o(out_data),
.out_valid_o(out_valid),
.in_ready_o(in_ready),
.dp_pu_o(dp_pu),
.tx_en_o(tx_en),
.dp_tx_o(dp_tx),
.dn_tx_o(dn_tx));
SB_IO #(.PIN_TYPE(6'b101001),
.PULLUP(1'b0))
u_usb_p (.PACKAGE_PIN(usb_p),
.OUTPUT_ENABLE(tx_en),
.D_OUT_0(dp_tx),
.D_IN_0(dp_rx),
.D_OUT_1(1'b0),
.D_IN_1(),
.CLOCK_ENABLE(1'b0),
.LATCH_INPUT_VALUE(1'b0),
.INPUT_CLK(1'b0),
.OUTPUT_CLK(1'b0));
SB_IO #(.PIN_TYPE(6'b101001),
.PULLUP(1'b0))
u_usb_n (.PACKAGE_PIN(usb_n),
.OUTPUT_ENABLE(tx_en),
.D_OUT_0(dn_tx),
.D_IN_0(dn_rx),
.D_OUT_1(1'b0),
.D_IN_1(),
.CLOCK_ENABLE(1'b0),
.LATCH_INPUT_VALUE(1'b0),
.INPUT_CLK(1'b0),
.OUTPUT_CLK(1'b0));
// drive usb_pu to 3.3V or to high impedance
SB_IO #(.PIN_TYPE(6'b101001),
.PULLUP(1'b0))
u_usb_pu (.PACKAGE_PIN(usb_pu),
.OUTPUT_ENABLE(dp_pu),
.D_OUT_0(1'b1),
.D_IN_0(),
.D_OUT_1(1'b0),
.D_IN_1(),
.CLOCK_ENABLE(1'b0),
.LATCH_INPUT_VALUE(1'b0),
.INPUT_CLK(1'b0),
.OUTPUT_CLK(1'b0));
endmodule