Add bb_spi_controller
Bit banged spi controller, very simple but very slow.
This commit is contained in:
@@ -23,3 +23,10 @@ test_addr_decode:
|
|||||||
script:
|
script:
|
||||||
- cd hw/fpga/simulation/modelsim/
|
- cd hw/fpga/simulation/modelsim/
|
||||||
- vsim -do "do cs_testbench.do"
|
- vsim -do "do cs_testbench.do"
|
||||||
|
|
||||||
|
test_bb_spi:
|
||||||
|
stage: test
|
||||||
|
image: bslathi19/modelsim_18.1:lite
|
||||||
|
script:
|
||||||
|
- cd hw/fpga/simulation/modelsim/
|
||||||
|
- vsim -do "do bb_spi_testbench.do"
|
||||||
|
|||||||
43
hw/fpga/bb_spi_controller.sv
Normal file
43
hw/fpga/bb_spi_controller.sv
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
module bb_spi_controller(
|
||||||
|
input clk,
|
||||||
|
input rst,
|
||||||
|
|
||||||
|
input spi_cs,
|
||||||
|
|
||||||
|
input logic [7:0] data_in,
|
||||||
|
output logic [7:0] data_out,
|
||||||
|
|
||||||
|
input rw,
|
||||||
|
|
||||||
|
output logic SPI_SSn,
|
||||||
|
output logic SPI_MOSI,
|
||||||
|
output logic SPI_SCLK,
|
||||||
|
input SPI_MISO,
|
||||||
|
input SPI_slave_IRQ
|
||||||
|
);
|
||||||
|
|
||||||
|
logic [7:0] val;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
assign data_out = val;
|
||||||
|
|
||||||
|
|
||||||
|
assign SPI_SCLK = val[0];
|
||||||
|
assign SPI_SSn = val[1];
|
||||||
|
assign SPI_MOSI = val[2];
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (rst) begin
|
||||||
|
val <= 8'h2; //start with SS high
|
||||||
|
end
|
||||||
|
|
||||||
|
if (spi_cs & ~rw)
|
||||||
|
val <= data_in;
|
||||||
|
|
||||||
|
val[3] <= SPI_MISO;
|
||||||
|
val[4] <= SPI_slave_IRQ;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
endmodule
|
||||||
74
hw/fpga/hvl/bb_spi_testbench.sv
Normal file
74
hw/fpga/hvl/bb_spi_testbench.sv
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
module testbench();
|
||||||
|
|
||||||
|
timeunit 10ns;
|
||||||
|
|
||||||
|
timeprecision 1ns;
|
||||||
|
|
||||||
|
logic clk, rst, spi_cs;
|
||||||
|
logic [7:0] data_in, data_out;
|
||||||
|
logic rw;
|
||||||
|
logic SPI_SSn, SPI_MOSI, SPI_SCLK, SPI_MISO;
|
||||||
|
logic SPI_slave_IRQ;
|
||||||
|
|
||||||
|
|
||||||
|
bb_spi_controller dut(.*);
|
||||||
|
|
||||||
|
always #5 clk = clk === 1'b0;
|
||||||
|
|
||||||
|
task write_byte(input logic [8:0] wdata);
|
||||||
|
for (int i = 0; i < 8; i++) begin
|
||||||
|
write_bit(8'b0 + (wdata[i] << 2));
|
||||||
|
write_bit(8'b1 + (wdata[i] << 2));
|
||||||
|
end
|
||||||
|
write_bit(8'b0);
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task write_bit(input logic [8:0] wdata);
|
||||||
|
@(negedge clk);
|
||||||
|
spi_cs <= '1;
|
||||||
|
data_in <= wdata;
|
||||||
|
rw <= '0;
|
||||||
|
@(posedge clk);
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task read(output logic [8:0] rdata);
|
||||||
|
@(negedge clk);
|
||||||
|
spi_cs <= '1;
|
||||||
|
rdata <= data_out;
|
||||||
|
rw <= '1;
|
||||||
|
@(posedge clk);
|
||||||
|
endtask
|
||||||
|
|
||||||
|
always @(posedge SPI_SCLK) begin
|
||||||
|
assert(SPI_MOSI == data_in[2]) else begin
|
||||||
|
$error("SPI_MOSI data error");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin : TEST_VECTORS
|
||||||
|
SPI_slave_IRQ <= '0;
|
||||||
|
SPI_MISO <= '0;
|
||||||
|
|
||||||
|
rst <= '1;
|
||||||
|
repeat(5) @(posedge clk);
|
||||||
|
rst <= '0;
|
||||||
|
@(posedge clk);
|
||||||
|
|
||||||
|
write_byte(8'ha5);
|
||||||
|
|
||||||
|
repeat(5) @(posedge clk);
|
||||||
|
|
||||||
|
SPI_slave_IRQ <= '1;
|
||||||
|
@(posedge clk);
|
||||||
|
@(posedge clk);
|
||||||
|
assert (data_out[4] == '1) else begin
|
||||||
|
$error("IRQ expected");
|
||||||
|
end
|
||||||
|
|
||||||
|
repeat(5) @(posedge clk);
|
||||||
|
|
||||||
|
$finish();
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
24
hw/fpga/simulation/modelsim/bb_spi_testbench.do
Normal file
24
hw/fpga/simulation/modelsim/bb_spi_testbench.do
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
transcript on
|
||||||
|
if {[file exists rtl_work]} {
|
||||||
|
vdel -lib rtl_work -all
|
||||||
|
}
|
||||||
|
vlib rtl_work
|
||||||
|
vmap work rtl_work
|
||||||
|
|
||||||
|
vlog -sv -work work {../../bb_spi_controller.sv}
|
||||||
|
vlog -sv -work work {../../hvl/bb_spi_testbench.sv}
|
||||||
|
|
||||||
|
vsim -t 1ps -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L stratixv_ver -L stratixv_hssi_ver -L stratixv_pcie_hip_ver -L rtl_work -L work -voptargs="+acc" testbench
|
||||||
|
|
||||||
|
add wave -group {dut} -radix hexadecimal sim:/testbench/dut/*
|
||||||
|
|
||||||
|
onfinish stop
|
||||||
|
run -all
|
||||||
|
|
||||||
|
if { [coverage attribute -name TESTSTATUS -concise] == "1"} {
|
||||||
|
echo Warning
|
||||||
|
quit -f -code 0
|
||||||
|
}
|
||||||
|
|
||||||
|
quit -code [coverage attribute -name TESTSTATUS -concise]
|
||||||
|
|
||||||
@@ -49,7 +49,6 @@ set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 256
|
|||||||
set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (SystemVerilog)"
|
set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (SystemVerilog)"
|
||||||
set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation
|
set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation
|
||||||
set_global_assignment -name EDA_OUTPUT_DATA_FORMAT "SYSTEMVERILOG HDL" -section_id eda_simulation
|
set_global_assignment -name EDA_OUTPUT_DATA_FORMAT "SYSTEMVERILOG HDL" -section_id eda_simulation
|
||||||
set_global_assignment -name SYSTEMVERILOG_FILE super6502.sv
|
|
||||||
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
|
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
|
||||||
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
|
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
|
||||||
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
|
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
|
||||||
@@ -91,7 +90,11 @@ set_location_assignment PIN_W7 -to cpu_mlb
|
|||||||
set_location_assignment PIN_W8 -to cpu_irqb
|
set_location_assignment PIN_W8 -to cpu_irqb
|
||||||
set_location_assignment PIN_P11 -to clk
|
set_location_assignment PIN_P11 -to clk
|
||||||
set_location_assignment PIN_B8 -to rst
|
set_location_assignment PIN_B8 -to rst
|
||||||
|
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
|
||||||
|
set_global_assignment -name SYSTEMVERILOG_FILE bb_spi_controller.sv
|
||||||
|
set_global_assignment -name SYSTEMVERILOG_FILE super6502.sv
|
||||||
set_global_assignment -name QIP_FILE ram.qip
|
set_global_assignment -name QIP_FILE ram.qip
|
||||||
set_global_assignment -name SDC_FILE super6502.sdc
|
set_global_assignment -name SDC_FILE super6502.sdc
|
||||||
set_global_assignment -name QIP_FILE rom.qip
|
set_global_assignment -name QIP_FILE rom.qip
|
||||||
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
|
set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW"
|
||||||
|
set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"
|
||||||
Reference in New Issue
Block a user