Estou trabalhando em um projeto Verilog para a placa FPGA DE10-Lite que faz interface com um acelerômetro de 3 eixos sobre SPI. Tenho módulos SPI separados (spi_ee_config) para cada eixo: x_info
, y_info
, e z_info
. Cada módulo emite seus próprios sinais chip select ( oSPI_CSN
) e clock ( oSPI_CLK
). No entanto, quando tento compilar, recebo o seguinte erro:
Pelo que entendi, isso significa que vários módulos estão tentando usar o mesmo fio, o que causa um conflito. Mas como estou lendo de 3 eixos, não tenho certeza de como compartilhar o barramento SPI corretamente sem atingir esse erro.
Como devo estruturar meu código Verilog para que apenas um módulo acione as linhas CS e CLK por vez? Devo multiplexar as saídas manualmente ou há um padrão melhor para lidar com múltiplos módulos SPI que compartilham o mesmo barramento?
Qualquer orientação ou trecho de código seria bem-vindo.
Problema de código:
Conflito aqui, pois todos os 3 spi_ee_config_# usam o mesmo controlador 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)
);
Raízes de volta ao 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
Sim. Aqui está um código de exemplo para um mux para o relógio serial:
Você faria algo semelhante para os sinais de seleção de escravos.