Click Here To Return:

Verilog FPGA SPI Instantiation:


parameter SPI_REG_ADDR = 12'h004;
parameter FPGA_RST_ADDR = 16'h0009;

reg [1:0] qual_counter;
wire qual_data;
wire [7:0] spi_data_out;
wire spi_irq_o;
wire ack_4;
wire proc_irq;

always @(posedge sys_clock)
begin
	if(proc_cs)
		qual_counter[1:0] <= #1 2'b00;
	else
		qual_counter[1:0] <= qual_counter[1:0] + 2'b01;
end

assign #1 qual_data = ((qual_counter[1:0] == 2'b01) && (~proc_rw));

assign #1 proc_data[7:0] = (~proc_cs && proc_rw && (proc_addr[15:4] == SPI_REG_ADDR)) ?
	spi_data_out[7:0] : 8'bzzzzzzzz;

assign #1 proc_data[7:0] = (~proc_cs && proc_rw && (proc_addr[15:0] == IRQ_REG_ADDR)) ?
	{1'b0,1'b0,1'b0,1'b0,spi_irq_o,i2c1_irq_o,i2c2_irq_o,i2c3_irq_o} :
	8'bzzzzzzzz;

assign #1 proc_irq = spi_irq_o | i2c1_irq_o | i2c2_irq_o | i2c3_irq_o;

simple_spi_top my_spi(
  .clk_i(sys_clock),
  .rst_i(~((proc_addr[15:0] == FPGA_RST_ADDR) && (qual_data))),
  .cyc_i(((qual_counter[1:0] == 2'h2) || (qual_counter[1:0] == 2'h3)) &&
  			 (proc_addr[15:4] == SPI_REG_ADDR)),
  .stb_i(((qual_counter[1:0] == 2'h2) || (qual_counter[1:0] == 2'h3)) &&
  			 (proc_addr[15:4] == SPI_REG_ADDR)),
  .adr_i(proc_addr[1:0]),
  .we_i(~proc_rw),
  .dat_i(proc_data[7:0]),
  .dat_o(spi_data_out[7:0]),
  .ack_o(ack_4),
  .inta_o(spi_irq_o),
  .sck_o(spi_sck),
  .mosi_o(spi_mosi),
  .miso_i(spi_miso)
	);

Click Here To Return: