въпрос за IDE контролер, начинаещ

S

sdmmqy

Guest
лице е pioIntfc
края pioIntfc;
архитектура на арх pioIntfc е
- Таймер регистър, което си струва пъти за определяне на фазите на диска R / W операция
timer_r сигнал, timer_x: естествен OP_CYCLES гама downto 0;

- Параметри PIO режим времето превръща в грозен цикли часовник за яснота
- Постоянни OP_CYCLES: грозен: = TO_UNSIGNED (OP_CYCLES_N, timer_r'length);
- Постоянни SETUP_CYCLES: грозен: = TO_UNSIGNED (SETUP_CYCLES_N, timer_r'length);
- Постоянни PULSE_CYCLES: грозен: = TO_UNSIGNED (PULSE_CYCLES_N, timer_r'length);
- Постоянни HOLD_CYCLES: грозен: = TO_UNSIGNED (HOLD_CYCLES_N, timer_r'length);

- Членки на машината PIO състояние
тип cntlState е (
RW_SETUP, - настройка на адрес / данни, преди да прочетете пулс
RD_PULSE, - прочетете импулс активни
RD_HOLD, - притежават адрес / данни след като прочетете пулс
WR_PULSE, - пише импулс активни
WR_HOLD - притежават адрес / данни след напишете пулс
);
state_r сигнал, state_x: cntlState; - регистрирайте държавни и следващото състояние

- PIO интерфейс регистри
pioBusy_r сигнал, pioBusy_x: std_logic; - R / W-напредък в регистър
dior_r сигнал, dior_x: std_logic; - диск чете сигнал регистър
diow_r сигнал, diow_x: std_logic; - запис на диск регистър сигнал
da_r сигнал, da_x: std_logic_vector (pioAddr'range); - диск регистър регистър адрес
ddOut_r сигнал, ddOut_x: std_logic_vector (ddOut'range); - изходни данни на диска регистър
ddOutEnbl_r сигнал, ddOutEnbl_x: std_logic; - давам възможност на изходни данни на диска регистър
ddIn_r сигнал, ddIn_x: std_logic_vector (ddIn'range); - въвеждане на данни от диска регистър

- Доклади за състоянието на интерфейса PIO
status_r сигнал, status_x: std_logic_vector (3 downto 0);

- Debounce брояч за заявки за прекъсване вход
intrqCnt_r сигнал, intrqCnt_x: std_logic_vector (3 downto 0);
постоянен DEBOUNCE_CNT: природни: = 10;
pioIntrq_r сигнал, pioIntrq_x: std_logic;
intrq_r сигнал, intrq_x: std_logic;

започвам

-------------------------------------------------- ---------
- Да прилага някои вътрешни сигнали към страната домакин и на диск пристанища
-------------------------------------------------- ---------

dior_n <= dior_r;
diow_n <= diow_r;
DA <= da_r (da'range);
cs0_n <= da_r (3);
cs1_n <= da_r (4);
ddOut <= ddOut_r;
ddOutEnbl <= ddOutEnbl_r;
pioDOut <= ddIn_r; - изходни данни да бъде домакин е въвеждане на данните от диска
pioBusy <= pioBusy_r;
pioIntrq <= pioIntrq_r;
статут <= status_r;
dmack_n <= '1 '; - никога не признават ДМА искания от диск

-------------------------------------------------- ---------
- Изчисляване на следващото състояние и резултати
-------------------------------------------------- ---------

комбинаторен: процес (pioRd, pioWr, pioAddr, pioDIn, state_r, timer_r, dior_r, pioBusy_r,
diow_r, da_r, ddOut_r, ddOutEnbl_r, ddIn_r, ddIn, status_r)
започвам

-------------------------------------------------- ---------
- Стойности за настройка по подразбиране за сигнали
-------------------------------------------------- ---------

state_x <= state_r;
dior_x <= dior_r;
diow_x <= diow_r;
da_x <= da_r;
ddOut_x <= ddOut_r;
ddOutEnbl_x <= ddOutEnbl_r;
ddIn_x <= ddIn_r;
pioBusy_x <= pioBusy_r;
status_x <= status_r;

-------------------------------------------------- ---------
- Актуализиране на таймери
-------------------------------------------------- ---------- Основни таймер за последователността на фазите на R / W вълниако timer_r / = 0, тогава- Снижаване на таймера и не правят нищо друго, тъй като предишните- Фаза все още не е приключила.timer_x <= timer_r - 1;в противен случай- Предишната фаза е приключена, когато таймера достигне нула.- По подразбиране, оставете на таймера на нула.
АБ / W ОП ще го- Да не е нула по-долу.

-- compute the next state and outputs

timer_x <= timer_r; --------------------------------------------- --------------
- изчисляване на следващото състояние и резултати
-------------------------------------------------- ---------
случай е state_r

-------------------------------------------------- ---------
- Изчакване за диск да чете и пише операция
-------------------------------------------------- ---------
когато RW_SETUP =>
dior_x <= '1 '; - не се чете и пише на диска, докато поиска
diow_x <= '1 ';
- ddOutEnbl_x <= НЕ, - не диск с данни автобус до поискано
IF (pioRd = '0 '), тогава
- Операция за четене се иска
- pioBusy_x <= YES; - да зает малко
da_x <= pioAddr; - изход диск адрес регистър
timer_x <= 10; - SETUP_CYCLES; - да таймер за настройка на адрес
state_x <= RD_PULSE; - следващото състояние след настройка допълва адрес
status_x <= "0010";
ELSIF (pioWr = '0 '), тогава
- Операция за запис се иска
- PioBusy_x <= YES; - да зает малко
da_x <= pioAddr; - изход диск адрес регистър
ddOut_x <= pioDIn; - изходни данни на диска
ddOutEnbl_x <= '1 '; - давам възможност на автобус продукция
timer_x <= SETUP_CYCLES; - да таймер за адрес / данни за настройка
state_x <= WR_PULSE; - следващото състояние след адрес / данни за настройка допълва
status_x <= "0100";
в противен случай
- Не се изисква операция
pioBusy_x <= '0 '; - ясно зает малко
state_x <= RW_SETUP; - да върне на това състояние и да чакат за R / W искане
status_x <= "0001";
крайна сметка, ако;

-------------------------------------------------- ---------
- Пулс диск прочетете за контрол на сигнала
-------------------------------------------------- ---------
когато RD_PULSE =>
dior_x <= '0 '; - по-ниска диск прочетете за контрол линия
timer_x <= PULSE_CYCLES; - натоварване продължителност на импулса прочети
state_x <= RD_HOLD; - следващото състояние след импулс завършва

-------------------------------------------------- ---------
- Вземете данни и задръжте адрес, след като прочетете импулс завършва
-------------------------------------------------- ---------
когато RD_HOLD =>
ddIn_x <= ddIn; - натоварване на данни от диска
dior_x <= '1 '; - да прекрати четат пулс
timer_x <= HOLD_CYCLES; - посочете срока, задръжте след операция прочети
state_x <= RW_SETUP; - търси друга работа след задържането период

-------------------------------------------------- ---------
- Диск импулс пиша за контрол на сигнала
-------------------------------------------------- ---------
когато WR_PULSE =>
diow_x <= '0 '; - по-ниска запис на диск контролната линия
timer_x <= PULSE_CYCLES; - натоварване продължителност на импулса пиша
state_x <= WR_HOLD; - следващото състояние след импулс завършва

-------------------------------------------------- ---------
- Притежават адреса и данните, след като напишете импулс завършва
-------------------------------------------------- ---------
когато WR_HOLD =>
diow_x <= '1 '; - да прекрати напишете пулс
timer_x <= HOLD_CYCLES; - посочете срока, задръжте пиша след операцията
state_x <= RW_SETUP; - търси друга работа след задържането период

-------------------------------------------------- ---------
- Неизвестен състояние
-------------------------------------------------- ---------
, когато другите =>
state_x <= RW_SETUP; - проучване, ако в грешната държава
status_x <= "1000";

края случай;
крайна сметка, ако;
комбинаторен край процес;
-------------------------------------------------- ---------
- Актуалност регистри за съответния край часовник
-------------------------------------------------- ---------

актуализация: процес (pioRst, CLK)
започвам

ако pioRst = '1 'после
- Асинхронно нулиране
state_r <= RW_SETUP;
timer_r <= 0;
pioBusy_r <= '0 ';
pioIntrq_r <= '0 ';
intrq_r <= '0 ';
intrqCnt_r <= (другите => '0 ');
dior_r <= '1 ';
diow_r <= '1 ';
da_r <= (другите => '0 ');
ddOut_r <= (другите => '0 ');
ddOutEnbl_r <= '0 ';
ddIn_r <= (другите => '0 ');
status_r <= (другите => '0 ');

ELSIF rising_edge (CLK), тогаваstate_r <= state_x;timer_r <= timer_x;pioBusy_r <= pioBusy_x;pioIntrq_r <= pioIntrq_x;intrq_r <= intrq_x;intrqCnt_r <= intrqCnt_x;dior_r <= dior_x;diow_r <= diow_x;da_r <= da_x;ddOut_r <= ddOut_x;ddOutEnbl_r <= ddOutEnbl_x;ddIn_r <= ddIn_x;status_r <= status_x;

end process update;

крайна сметка, ако;
актуализация края процес;
края арка;Added след 4 минути:само след time_x, timer_r намалее до 0.Много благодаря.

Аз проверка от modelsim, кодовете е ОК.

 

Welcome to EDABoard.com

Sponsor

Back
Top