我正在为 DE10-Lite FPGA 开发一个 Verilog 项目,该项目通过 SPI 与 3 轴加速度计连接。我为每个轴设置了单独的 SPI 模块 (spi_ee_config):、x_info
和y_info
。z_info
每个模块都输出自己的芯片选择 ( oSPI_CSN
) 和时钟 ( oSPI_CLK
) 信号。但是,当我尝试编译时,出现以下错误:
据我所知,这意味着多个模块正在尝试使用同一条线路,从而导致冲突。但由于我从 3 个轴读取数据,我不确定如何正确共享 SPI 总线而不出现此错误。
我应该如何构造 Verilog 代码,以便每次只有一个模块驱动 CS 和 CLK 线路?我应该手动多路复用输出吗?或者是否有更好的模式来处理共享同一总线的多个 SPI 模块?
任何指导或代码片段都将不胜感激。
代码问题:
这里存在冲突,因为所有 3 个 spi_ee_config_# 都使用相同的 SPI 控制器:
spi_ee_config_X x_info (
.oSPI_CSN(GSENSOR_CS_N),
.oSPI_CLK(GSENSOR_SCLK)
);
spi_ee_config_y y_info (
.oSPI_CSN(GSENSOR_CS_N),
.oSPI_CLK(GSENSOR_SCLK)
);
spi_ee_config_z z_info (
.oSPI_CSN(GSENSOR_CS_N),
.oSPI_CLK(GSENSOR_SCLK)
);
回到 spi_controller:
module spi_controller (
input iRSTN;
input iSPI_CLK;
input iSPI_CLK_OUT;
input [SI_DataL:0] iP2S_DATA;
input iSPI_GO;
output oSPI_END;
output reg [SO_DataL:0] oS2P_DATA;
// SPI Side
inout SPI_SDIO;
output oSPI_CSN; <<<<<<
output oSPI_CLK; <<<<<<<
// Structural coding
assign read_mode = iP2S_DATA[SI_DataL];
assign write_address = spi_count[3];
assign oSPI_END = ~|spi_count;
assign oSPI_CSN = ~iSPI_GO;
assign oSPI_CLK = spi_count_en ? iSPI_CLK_OUT : 1'b1;
assign SPI_SDIO = spi_count_en && (!read_mode || write_address) ? iP2S_DATA[spi_count] : 1'bz;
always @ (posedge iSPI_CLK or negedge iRSTN)
if (!iRSTN)
begin
spi_count_en <= 1'b0;
spi_count <= 4'hf;
end
else
begin
if (oSPI_END)
spi_count_en <= 1'b0;
else if (iSPI_GO)
spi_count_en <= 1'b1;
if (!spi_count_en)
spi_count <= 4'hf;
else
spi_count <= spi_count - 4'b1;
if (read_mode && !write_address)
oS2P_DATA <= {oS2P_DATA[SO_DataL-1:0], SPI_SDIO};
end
endmodule