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

Начинаю на FpSlick и ни хрена не пойму

Вот судьба заставила обратиться к плисинам...

То есть мой первый опыт.

Да, вот есть задача - подключиться к 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;

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


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

1.Z- состояние должно включаться не по фронту а по уровню,

например так

 

if IORdIn = '0' and AddrIn = "....." then

DataExt <= DataInt;

else

DataExt <= "ZZZZZZZZZZZZZZZZ";

end if;

 

2. Плата должна работать только при совпадении выделенного ей адреса с адресом на шине.

 

3. возможно что-то ещё, трудно разобраться в этом коде.

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


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

То есть нужно писать так?

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. возможно что-то ещё, трудно разобраться в этом коде.

Почему трудно? что я пишу не так?

А как нужно?

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


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

То есть нужно писать так?

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;

 

 

 

Да, только надо дописать

 

else DataExt <= "ZZZZZZZZZZZZZZZZ";

 

 

>> 2. Плата должна работать только при совпадении выделенного ей >>адреса с адресом на шине.

А у меня разве не так?

 

 

>> 3. возможно что-то ещё, трудно разобраться в этом коде.

Почему трудно? что я пишу не так?

А как нужно?

 

У тебя значение одного и того же сигнала присваивается в разных процессах, а надо в одном, как я уже написал

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


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

>>У тебя значение одного и того же сигнала присваивается в разных процессах, а надо в одном, как я уже написал

 

Упс...

То есть ВСЯ работа с шиной данных (DataExt в моем случае) должна быть описана в одном процессе?

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


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

Угу, неправильно сформулировал "Погорячился, был не прав (с)"

Каждому выходному сигналу - свой процесс - так что ли?

И вообще, где написано про правила формирования выходных сигналов человеческим языком? Ну так чтоб хотя бы на одной странице, а не размазано по всему документу?

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


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

Правила определены в стандарте VHDL.

 

А на Figaro зря ругаешься. Он только размещает проект на кристалле, используя входной нетлист. obuf, inbuf или bidir определяет синтезатор(компилятор для VHDL).

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...