Перейти к содержанию
    

SPI проблема выводов

Здравствуйте!

Возникла проблема следующего вида:

На плате есть 2 разные микросхемы, висят на SPI. Нужно в зависимости от выбранной микросхемы (CS1 = 0 или CS2 = 0) менять местами MOSI и MISO.

То есть, если выбрана первая микросхема - то MOSI это MOSI, а MISO это MISO. А вот когда выбрана вторая микросхема (CS2 = 0) то MOSI должна стать MISO, а MISO - MOSI на ПЛИС.

ПЛИС Xilinx Spartan 6, код SPI взят из библиотеки Gaisler.

Получившийся код:

entity leon3mp is ...
port(
...
mfmiso : inout std_logic;
mfmosi : inout std_logic;
mfscl : inout std_logic;
mfcs1 : out std_logic;
mfcs2 : out std_logic;
...
);
...
signal spi_mosi_local, spi_miso_local: std_logic;
signal spii : spi_in_type;
signal spio : spi_out_type;

spi_change_io: process(clkm, rstn)
begin
  if rstn = '0' then
mfmosi <= '0';
mfmiso <= '0';
spi_miso_local <= '0';
spi_mosi_local <= '0';
  elsif clk'event and clk = '1' then
if (mfcs2 = '0') then 
   mfmiso <= spi_mosi_local;
   spi_miso_local <= mfmosi;
else
   mfmosi <= spi_mosi_local;
   spi_miso_local <= mfmiso;
end if;
   end if;
end process;

spimctrl : if CFG_SPIM_ENABLE = 1 generate 
spi_mctrl : spictrl 
generic map (pindex => CFG_SPIM_PINDEX, paddr => CFG_SPIM_PADDR, pirq => CFG_SPIM_PIRQ, fdepth => 1, slvselen => 0, slvselsz => 1)
port map (rstn, clkm, apbi2, apbo2(CFG_SPIM_PINDEX), spii, spio, open);

misopad : inpad generic map (tech => padtech)
	port map (spi_miso_local, spii.miso); 

mosipad : outpad generic map (tech => padtech)
	port map (spi_mosi_local, spio.mosi);

sckpad : iopad generic map (tech => padtech)
	port map (mfscl, spio.sck, spio.sckoen, spii.sck);		
end generate;

На этапе синтеза выдает ошибку вида:

ERROR:Xst:528 - Multi-source in Unit <leon3mp> on signal <N0>; this signal is connected to multiple drivers.

и кучу Drivers дальше, в том числе

Output signal of OBUF instance <spimctrl.mosipad/xcv.x0/ttl0.slow0.op>

Dangling signal <spi_mosi_local> in Unit <leon3mp> is tied to 0 by XST

и много

Dangling signal <N0> in Unit <iopad> is tied to 0 by XST

Dangling signal <N0> in Unit <unisim_iopad> is tied to 0 by XST

 

В чем ошибка данного решения, и как правильно решить данную проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

Возникла проблема следующего вида:

На плате есть 2 разные микросхемы, висят на SPI. Нужно в зависимости от выбранной микросхемы (CS1 = 0 или CS2 = 0) менять местами MOSI и MISO.

То есть, если выбрана первая микросхема - то MOSI это MOSI, а MISO это MISO. А вот когда выбрана вторая микросхема (CS2 = 0) то MOSI должна стать MISO, а MISO - MOSI на ПЛИС.

ПЛИС Xilinx Spartan 6, код SPI взят из библиотеки Gaisler.

Получившийся код:

entity leon3mp is ...
port(
...
mfmiso : inout std_logic;
mfmosi : inout std_logic;
mfscl : inout std_logic;
mfcs1 : out std_logic;
mfcs2 : out std_logic;
...
);
...
signal spi_mosi_local, spi_miso_local: std_logic;
signal spii : spi_in_type;
signal spio : spi_out_type;

spi_change_io: process(clkm, rstn)
begin
  if rstn = '0' then
mfmosi <= '0';
mfmiso <= '0';
spi_miso_local <= '0';
spi_mosi_local <= '0';
  elsif clk'event and clk = '1' then
if (mfcs2 = '0') then 
   mfmiso <= spi_mosi_local;
   spi_miso_local <= mfmosi;
else
   mfmosi <= spi_mosi_local;
   spi_miso_local <= mfmiso;
end if;
   end if;
end process;

spimctrl : if CFG_SPIM_ENABLE = 1 generate 
spi_mctrl : spictrl 
generic map (pindex => CFG_SPIM_PINDEX, paddr => CFG_SPIM_PADDR, pirq => CFG_SPIM_PIRQ, fdepth => 1, slvselen => 0, slvselsz => 1)
port map (rstn, clkm, apbi2, apbo2(CFG_SPIM_PINDEX), spii, spio, open);

misopad : inpad generic map (tech => padtech)
	port map (spi_miso_local, spii.miso); 

mosipad : outpad generic map (tech => padtech)
	port map (spi_mosi_local, spio.mosi);

sckpad : iopad generic map (tech => padtech)
	port map (mfscl, spio.sck, spio.sckoen, spii.sck);		
end generate;

На этапе синтеза выдает ошибку вида:

ERROR:Xst:528 - Multi-source in Unit <leon3mp> on signal <N0>; this signal is connected to multiple drivers.

и кучу Drivers дальше, в том числе

Output signal of OBUF instance <spimctrl.mosipad/xcv.x0/ttl0.slow0.op>

Dangling signal <spi_mosi_local> in Unit <leon3mp> is tied to 0 by XST

и много

Dangling signal <N0> in Unit <iopad> is tied to 0 by XST

Dangling signal <N0> in Unit <unisim_iopad> is tied to 0 by XST

 

В чем ошибка данного решения, и как правильно решить данную проблему?

у Вас просто SPI заработал?

Я бы делал два модуля SPI, выводы SPI комутировал с помощью буферов в INOUT блоке ПЛИС "в зависимости от выбранной микросхемы (CS1 = 0 или CS2 = 0) менять местами MOSI и MISO" - остальные выводы SPI с помощью мультиплексоров.

Например, можно использовать IOBUF Primitive: Bi-Directional Buffer (можно описать на языке вставку логики с третьим состоянием)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чем собственно обусловлена такая задача? Может проще перепаять пару проводов на макетке, а не городить огород в плисине?

Изменено пользователем Lerk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чем собственно обусловлена такая задача? Может проще перепаять пару проводов на макетке, а не городить огород в плисине?

Если устройство пойдет в серию, то это на каждом придется проводки накидывать, легче тогда уж плату переразвести. Это не желательно, если есть возможность решить данную проблему с помощью ПЛИС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оф гайд по этому поводу

Если просто, то:

assign INOUT= DIR ? OUT : 8'bZ ;

Изменено пользователем Lerk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо, благодаря Вашим подсказкам, получился вполне такой рабочий код:

state <= mfcs1; -- 

IOBUF_1 : IOBUF --
 generic map (
  DRIVE => 12,
  IOSTANDARD => "DEFAULT",
  SLEW => "SLOW")
 port map (
  O => I0, -- Buffer output
  IO => mfmiso, -- Buffer inout port (connect directly to top-level port)
  I => spi_mosi_local, -- Buffer input
  T => not state -- 3-state enable input, high=input, low=output
 );


IOBUF_2 : IOBUF --
 generic map (
  DRIVE => 12,
  IOSTANDARD => "DEFAULT",
  SLEW => "SLOW")
 port map (
  O => I1, -- Buffer output
  IO => mfmosi, -- Buffer inout port (connect directly to top-level port)
  I => spi_mosi_local, -- Buffer input
  T => state -- 3-state enable input, high=input, low=output
 );


MUXF7_L_1 : MUXF7_L
 port map (
  LO => spi_miso_local, -- Output of MUX to local routing
  I0 => I0, -- Input (tie to MUXF6 LO out or LUT6 O6 pin)
  I1 => I1, -- Input (tie to MUXF6 LO out or LUT6 O6 pin)
  S =>  state -- Input select to MUX
);

spimctrl1 : if CFG_SPIM_ENABLE = 1 generate 
spi_mctrl1 : spictrl 
generic map (pindex => CFG_SPIM_PINDEX, paddr => CFG_SPIM_PADDR, pirq => CFG_SPIM_PIRQ, fdepth => 1, slvselen => 0, slvselsz => 1)
port map (rstn, clkm, apbi2, apbo2(CFG_SPIM_PINDEX), spii, spio, open);	

	sckpad : iopad generic map (tech => padtech)
	port map (mfscl, spio.sck, spio.sckoen, spii.sck);	
end generate;

spii.miso <= spi_miso_local;		
spi_mosi_local <= spio.mosi;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...