Roberto_Tolas 0 13 февраля, 2015 Опубликовано 13 февраля, 2015 · Жалоба Здравствуйте! Возникла проблема следующего вида: На плате есть 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 В чем ошибка данного решения, и как правильно решить данную проблему? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 13 февраля, 2015 Опубликовано 13 февраля, 2015 · Жалоба Здравствуйте! Возникла проблема следующего вида: На плате есть 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 0 13 февраля, 2015 Опубликовано 13 февраля, 2015 (изменено) · Жалоба А чем собственно обусловлена такая задача? Может проще перепаять пару проводов на макетке, а не городить огород в плисине? Изменено 13 февраля, 2015 пользователем Lerk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Roberto_Tolas 0 13 февраля, 2015 Опубликовано 13 февраля, 2015 · Жалоба А чем собственно обусловлена такая задача? Может проще перепаять пару проводов на макетке, а не городить огород в плисине? Если устройство пойдет в серию, то это на каждом придется проводки накидывать, легче тогда уж плату переразвести. Это не желательно, если есть возможность решить данную проблему с помощью ПЛИС. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lerk 0 13 февраля, 2015 Опубликовано 13 февраля, 2015 (изменено) · Жалоба оф гайд по этому поводу Если просто, то: assign INOUT= DIR ? OUT : 8'bZ ; Изменено 13 февраля, 2015 пользователем Lerk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Roberto_Tolas 0 13 февраля, 2015 Опубликовано 13 февраля, 2015 · Жалоба Всем спасибо, благодаря Вашим подсказкам, получился вполне такой рабочий код: 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; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться