andk 0 4 января, 2005 Опубликовано 4 января, 2005 · Жалоба Вот судьба заставила обратиться к плисинам... То есть мой первый опыт. Да, вот есть задача - подключиться к ISA своей железякой. Выбрал AT94s10 - вроде все фичи есть и устраивают. Ну, конечно куча литературы была скачана и прочитана - которая по диагонали, которая повнимательней. Соответсвенно в мозгах пока каша. :) Куплен STK594. Соответственно среда разработки - System designer (Atmel) Ура! Отдельно от компа все весело дрыгает ногами. Подключаем к компу - все печально - шина данных по включению вся в нулях! Начинаю разбор - вроде для начинающего все в пределах нормы - несколько варнингов с виду не страшных - по поводу не подключенных сигналов. Но компилируется. Смотрю дальше - Figaro гад, совершенно спокойно из двунаправленной шины с Z состоянием как я хотел, сделал OBUF! Ну вот и вопрос - почто это он? И как бороться? Не, ну я понимаю, что я что-то не так ему сказал, но где? Собственно файл: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Inter is port ( AddrIn : in std_logic_vector(19 downto 0); -- Input address bus AddrOut : out std_logic_vector(17 downto 0):="000000000000000000"; -- Output latched address bus AenIn : in std_logic; -- Input signal Address enable DataExt : inout std_logic_vector(15 downto 0):="ZZZZZZZZZZZZZZZZ"; -- External Data bus DataInt : inout std_logic_vector(15 downto 0):="ZZZZZZZZZZZZZZZZ"; -- Internal Data bus MemWrIn : in std_logic; -- Input signal MemWr MemRdIn : in std_logic; -- Input signal MemRd IoWrIn : in std_logic; -- Input signal IoWr IoRdIn : in std_logic; -- Input signal IoRd MemCs16 : out std_logic:='Z'; -- Output signal MemCS16 IoCs16 : out std_logic:='Z'; -- Output signal IOCS16 FlashRd : out std_logic:='H'; FlashCs : out std_logic:='H'; SBHE : in std_logic ); end; architecture Behavior of Inter is signal IntAddr : std_logic_vector(19 downto 0); -- Internal buffering address begin -- AddrOut <="000000000000000000"; DataExt <="ZZZZZZZZZZZZZZZZ"; MemCs16 <='Z'; IoCs16 <='Z'; FlashRd <='H'; FlashCs <='H'; ----------------------------------------------------------- process (AenIn, AddrIn) -- Address latch process begin if(AenIn'event and AenIn='1')then -- rising edge of AEN IntAddr<=AddrIn; -- store to internal buffer if(AddrIn(19 downto 16)=X"f") then -- compare to work address space AddrOut<=AddrIn(17 downto 0); -- if ok, addr to output end if; end if; end process; ----------------------------------------------------------- process(IoWrIn) -- IO write process begin if(IoWrIn'event and IoWrIn='0') then -- failling edge of IOWr if(IntAddr(11 downto 0)=X"378" and ((MemRdIn='1' and MemWrIn='1') and IoRdIn='1')) then DataInt<=DataExt; -- if addr space and concurrent signal is ok end if; end if; end process; ----------------------------------------------------------- process(MemRdIn) -- Memory read end process begin if(MemRdIn'event and MemRdIn='1') then -- failling edge of MemRd DataExt<="ZZZZZZZZZZZZZZZZ"; end if; end process; ----------------------------------------------------------- process(IoRdIn) -- IO read end process begin if(IoRdIn'event and IoRdIn='1') then -- failling edge of MemRd DataExt<="ZZZZZZZZZZZZZZZZ"; end if; end process; ----------------------------------------------------------- process(IoRdIn) -- IO read process begin if(IoRdIn'event and IoRdIn='0') then -- failling edge of IORd if(IntAddr(11 downto 0)=X"378" and ((MemWrIn='1' and IoWrIn='1') and MemRdIn='1')) then DataExt<=X"0000"; end if; end if; end process; ----------------------------------------------------------- end; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k2i 0 4 января, 2005 Опубликовано 4 января, 2005 · Жалоба 1.Z- состояние должно включаться не по фронту а по уровню, например так if IORdIn = '0' and AddrIn = "....." then DataExt <= DataInt; else DataExt <= "ZZZZZZZZZZZZZZZZ"; end if; 2. Плата должна работать только при совпадении выделенного ей адреса с адресом на шине. 3. возможно что-то ещё, трудно разобраться в этом коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andk 0 5 января, 2005 Опубликовано 5 января, 2005 · Жалоба То есть нужно писать так? process(IoRdIn) -- IO read process begin if(IoRdIn='0') then -- low level of IORd if(IntAddr(11 downto 0)=X"378" and ((MemWrIn='1' and IoWrIn='1') and MemRdIn='1')) then DataExt<=X"0000"; end if; end if; end process; >> 2. Плата должна работать только при совпадении выделенного ей >>адреса с адресом на шине. А у меня разве не так? >> 3. возможно что-то ещё, трудно разобраться в этом коде. Почему трудно? что я пишу не так? А как нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k2i 0 5 января, 2005 Опубликовано 5 января, 2005 · Жалоба То есть нужно писать так? process(IoRdIn) -- IO read process begin if(IoRdIn='0') then -- low level of IORd if(IntAddr(11 downto 0)=X"378" and ((MemWrIn='1' and IoWrIn='1') and MemRdIn='1')) then DataExt<=X"0000"; end if; end if; end process; <{POST_SNAPBACK}> Да, только надо дописать else DataExt <= "ZZZZZZZZZZZZZZZZ"; >> 2. Плата должна работать только при совпадении выделенного ей >>адреса с адресом на шине. А у меня разве не так? >> 3. возможно что-то ещё, трудно разобраться в этом коде. Почему трудно? что я пишу не так? А как нужно? <{POST_SNAPBACK}> У тебя значение одного и того же сигнала присваивается в разных процессах, а надо в одном, как я уже написал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andk 0 5 января, 2005 Опубликовано 5 января, 2005 · Жалоба >>У тебя значение одного и того же сигнала присваивается в разных процессах, а надо в одном, как я уже написал Упс... То есть ВСЯ работа с шиной данных (DataExt в моем случае) должна быть описана в одном процессе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k2i 0 5 января, 2005 Опубликовано 5 января, 2005 · Жалоба Не вся работа, а только присвоение значений сигналу DataExt. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andk 0 5 января, 2005 Опубликовано 5 января, 2005 · Жалоба Угу, неправильно сформулировал "Погорячился, был не прав (с)" Каждому выходному сигналу - свой процесс - так что ли? И вообще, где написано про правила формирования выходных сигналов человеческим языком? Ну так чтоб хотя бы на одной странице, а не размазано по всему документу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Sam_ 0 18 января, 2005 Опубликовано 18 января, 2005 · Жалоба Правила определены в стандарте VHDL. А на Figaro зря ругаешься. Он только размещает проект на кристалле, используя входной нетлист. obuf, inbuf или bidir определяет синтезатор(компилятор для VHDL). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться