Skip to content

Instantly share code, notes, and snippets.

@buttercutter
Created December 27, 2017 11:15
Show Gist options
  • Save buttercutter/9b7241bd0af9d9f16709c533a51c9dbc to your computer and use it in GitHub Desktop.
Save buttercutter/9b7241bd0af9d9f16709c533a51c9dbc to your computer and use it in GitHub Desktop.
module xillydemo
(
input clk_100,
input otg_oc,
inout [55:0] PS_GPIO,
output [3:0] GPIO_LED,
output [3:0] vga4_blue,
output [3:0] vga4_green,
output [3:0] vga4_red,
output vga_hsync,
output vga_vsync,
output audio_mclk,
output audio_dac,
input audio_adc,
input audio_bclk,
input audio_lrclk,
output smb_sclk,
inout smb_sdata,
output [1:0] smbus_addr
);
// Clock and quiesce
wire bus_clk;
wire quiesce;
// Memory arrays
reg [7:0] demoarray[0:31];
reg [7:0] litearray0[0:31];
reg [7:0] litearray1[0:31];
reg [7:0] litearray2[0:31];
reg [7:0] litearray3[0:31];
// Wires related to /dev/xillybus_mem_8
wire user_r_mem_8_rden;
wire user_r_mem_8_empty;
reg [7:0] user_r_mem_8_data;
wire user_r_mem_8_eof;
wire user_r_mem_8_open;
wire user_w_mem_8_wren;
wire user_w_mem_8_full;
wire [7:0] user_w_mem_8_data;
wire user_w_mem_8_open;
wire [4:0] user_mem_8_addr;
wire user_mem_8_addr_update;
// Wires related to /dev/xillybus_read_32
wire user_r_read_32_rden;
wire user_r_read_32_empty;
wire [31:0] user_r_read_32_data;
wire user_r_read_32_eof;
wire user_r_read_32_open;
// Wires related to /dev/xillybus_read_8
wire user_r_read_8_rden;
wire user_r_read_8_empty;
wire [7:0] user_r_read_8_data;
wire user_r_read_8_eof;
wire user_r_read_8_open;
// Wires related to /dev/xillybus_write_32
wire user_w_write_32_wren;
wire user_w_write_32_full;
wire [31:0] user_w_write_32_data;
wire user_w_write_32_open;
// Wires related to /dev/xillybus_write_8
wire user_w_write_8_wren;
wire user_w_write_8_full;
wire [7:0] user_w_write_8_data;
wire user_w_write_8_open;
// Wires related to /dev/xillybus_audio
wire user_r_audio_rden;
wire user_r_audio_empty;
wire [31:0] user_r_audio_data;
wire user_r_audio_eof;
wire user_r_audio_open;
wire user_w_audio_wren;
wire user_w_audio_full;
wire [31:0] user_w_audio_data;
wire user_w_audio_open;
// Wires related to /dev/xillybus_smb
wire user_r_smb_rden;
wire user_r_smb_empty;
wire [7:0] user_r_smb_data;
wire user_r_smb_eof;
wire user_r_smb_open;
wire user_w_smb_wren;
wire user_w_smb_full;
wire [7:0] user_w_smb_data;
wire user_w_smb_open;
// Wires related to Xillybus Lite
wire user_clk;
wire user_wren;
wire [3:0] user_wstrb;
wire user_rden;
reg [31:0] user_rd_data;
wire [31:0] user_wr_data;
wire [31:0] user_addr;
wire user_irq;
// Note that none of the ARM processor's direct connections to pads is
// attached in the instantion below. Normally, they should be connected as
// toplevel ports here, but that confuses Vivado 2013.4 to think that
// some of these ports are real I/Os, causing an implementation failure.
// This detachment results in a lot of warnings during synthesis and
// implementation, but has no practical significance, as these pads are
// completely unrelated to the FPGA bitstream.
xillybus xillybus_ins (
// Ports related to /dev/xillybus_mem_8
// FPGA to CPU signals:
.user_r_mem_8_rden(user_r_mem_8_rden),
.user_r_mem_8_empty(user_r_mem_8_empty),
.user_r_mem_8_data(user_r_mem_8_data),
.user_r_mem_8_eof(user_r_mem_8_eof),
.user_r_mem_8_open(user_r_mem_8_open),
// CPU to FPGA signals:
.user_w_mem_8_wren(user_w_mem_8_wren),
.user_w_mem_8_full(user_w_mem_8_full),
.user_w_mem_8_data(user_w_mem_8_data),
.user_w_mem_8_open(user_w_mem_8_open),
// Address signals:
.user_mem_8_addr(user_mem_8_addr),
.user_mem_8_addr_update(user_mem_8_addr_update),
// Ports related to /dev/xillybus_read_32
// FPGA to CPU signals:
.user_r_read_32_rden(user_r_read_32_rden),
.user_r_read_32_empty(user_r_read_32_empty),
.user_r_read_32_data(user_r_read_32_data),
.user_r_read_32_eof(user_r_read_32_eof),
.user_r_read_32_open(user_r_read_32_open),
// Ports related to /dev/xillybus_read_8
// FPGA to CPU signals:
.user_r_read_8_rden(user_r_read_8_rden),
.user_r_read_8_empty(user_r_read_8_empty),
.user_r_read_8_data(user_r_read_8_data),
.user_r_read_8_eof(user_r_read_8_eof),
.user_r_read_8_open(user_r_read_8_open),
// Ports related to /dev/xillybus_write_32
// CPU to FPGA signals:
.user_w_write_32_wren(user_w_write_32_wren),
.user_w_write_32_full(user_w_write_32_full),
.user_w_write_32_data(user_w_write_32_data),
.user_w_write_32_open(user_w_write_32_open),
// Ports related to /dev/xillybus_write_8
// CPU to FPGA signals:
.user_w_write_8_wren(user_w_write_8_wren),
.user_w_write_8_full(user_w_write_8_full),
.user_w_write_8_data(user_w_write_8_data),
.user_w_write_8_open(user_w_write_8_open),
// Ports related to /dev/xillybus_audio
// FPGA to CPU signals:
.user_r_audio_rden(user_r_audio_rden),
.user_r_audio_empty(user_r_audio_empty),
.user_r_audio_data(user_r_audio_data),
.user_r_audio_eof(user_r_audio_eof),
.user_r_audio_open(user_r_audio_open),
// CPU to FPGA signals:
.user_w_audio_wren(user_w_audio_wren),
.user_w_audio_full(user_w_audio_full),
.user_w_audio_data(user_w_audio_data),
.user_w_audio_open(user_w_audio_open),
// Ports related to /dev/xillybus_smb
// FPGA to CPU signals:
.user_r_smb_rden(user_r_smb_rden),
.user_r_smb_empty(user_r_smb_empty),
.user_r_smb_data(user_r_smb_data),
.user_r_smb_eof(user_r_smb_eof),
.user_r_smb_open(user_r_smb_open),
// CPU to FPGA signals:
.user_w_smb_wren(user_w_smb_wren),
.user_w_smb_full(user_w_smb_full),
.user_w_smb_data(user_w_smb_data),
.user_w_smb_open(user_w_smb_open),
// Xillybus Lite signals:
.user_clk ( user_clk ),
.user_wren ( user_wren ),
.user_wstrb ( user_wstrb ),
.user_rden ( user_rden ),
.user_rd_data ( user_rd_data ),
.user_wr_data ( user_wr_data ),
.user_addr ( user_addr ),
.user_irq ( user_irq ),
// General signals
.clk_100(clk_100),
.otg_oc(otg_oc),
.PS_GPIO(PS_GPIO),
.GPIO_LED(GPIO_LED),
.bus_clk(bus_clk),
.quiesce(quiesce),
// VGA port related outputs
.vga4_blue(vga4_blue),
.vga4_green(vga4_green),
.vga4_red(vga4_red),
.vga_hsync(vga_hsync),
.vga_vsync(vga_vsync)
);
assign user_irq = 0; // No interrupts for now
always @(posedge user_clk)
begin
if (user_wstrb[0])
litearray0[user_addr[6:2]] <= user_wr_data[7:0];
if (user_wstrb[1])
litearray1[user_addr[6:2]] <= user_wr_data[15:8];
if (user_wstrb[2])
litearray2[user_addr[6:2]] <= user_wr_data[23:16];
if (user_wstrb[3])
litearray3[user_addr[6:2]] <= user_wr_data[31:24];
if (user_rden)
user_rd_data <= { litearray3[user_addr[6:2]],
litearray2[user_addr[6:2]],
litearray1[user_addr[6:2]],
litearray0[user_addr[6:2]] };
end
// A simple inferred RAM
always @(posedge bus_clk)
begin
if (user_w_mem_8_wren)
demoarray[user_mem_8_addr] <= user_w_mem_8_data;
if (user_r_mem_8_rden)
user_r_mem_8_data <= demoarray[user_mem_8_addr];
end
assign user_r_mem_8_empty = 0;
assign user_r_mem_8_eof = 0;
assign user_w_mem_8_full = 0;
// 32-bit loopback
fifo_32x512 fifo_32
(
.clk(bus_clk),
.srst(!user_w_write_32_open && !user_r_read_32_open),
.din(user_w_write_32_data),
.wr_en(user_w_write_32_wren),
.rd_en(user_r_read_32_rden),
.dout(user_r_read_32_data),
.full(user_w_write_32_full),
.empty(user_r_read_32_empty)
);
assign user_r_read_32_eof = 0;
// 8-bit loopback
fifo_8x2048 fifo_8
(
.clk(bus_clk),
.srst(!user_w_write_8_open && !user_r_read_8_open),
.din(user_w_write_8_data),
.wr_en(user_w_write_8_wren),
.rd_en(user_r_read_8_rden),
.dout(user_r_read_8_data),
.full(user_w_write_8_full),
.empty(user_r_read_8_empty)
);
assign user_r_read_8_eof = 0;
i2s_audio audio
(
.bus_clk(bus_clk),
.clk_100(clk_100),
.quiesce(quiesce),
.audio_mclk(audio_mclk),
.audio_dac(audio_dac),
.audio_adc(audio_adc),
.audio_bclk(audio_bclk),
.audio_lrclk(audio_lrclk),
.user_r_audio_rden(user_r_audio_rden),
.user_r_audio_empty(user_r_audio_empty),
.user_r_audio_data(user_r_audio_data),
.user_r_audio_eof(user_r_audio_eof),
.user_r_audio_open(user_r_audio_open),
.user_w_audio_wren(user_w_audio_wren),
.user_w_audio_full(user_w_audio_full),
.user_w_audio_data(user_w_audio_data),
.user_w_audio_open(user_w_audio_open)
);
smbus smbus
(
.bus_clk(bus_clk),
.quiesce(quiesce),
.smb_sclk(smb_sclk),
.smb_sdata(smb_sdata),
.smbus_addr(smbus_addr),
.user_r_smb_rden(user_r_smb_rden),
.user_r_smb_empty(user_r_smb_empty),
.user_r_smb_data(user_r_smb_data),
.user_r_smb_eof(user_r_smb_eof),
.user_r_smb_open(user_r_smb_open),
.user_w_smb_wren(user_w_smb_wren),
.user_w_smb_full(user_w_smb_full),
.user_w_smb_data(user_w_smb_data),
.user_w_smb_open(user_w_smb_open)
);
endmodule
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment