Полная версия этой страницы:
ISA шина
Здравствуйте Все!
Давно мучает вопрос --
Создавли плату ввода-вывода на ISA шине на Altera МАХ3256;
Она стабильно работала на всех материнках с процессорами AMD, а на материнках с INTEL на некоторых работала через раз, на некоторых вообще не запускалась.
Будто-бы все сделали как надо.
Пришлось перейти на МАХ7000, все проблемы исчезли.
Может кто сталкивался с таким и как бороться?
Заранее спасибо.
Инженер
Jan 16 2008, 14:43
Временные диаграммы сигналов чтения/записи для разных чипсетов? У них фронты сигналов чтения/зиписи могут не совпадать, поэтому и не работало. То, что все заработало на другой серии ПЛИС мало о чем говорит. Там все может работать на грани.
vol2003
Feb 7 2008, 08:22
Более того, если даже оно заработало, оно может в любой момент отвалиться опять при изменении условий окружающей среды (например, летом жарко будет или рядом мощный трансформатор поставят). Это такие ошибки, которые лучше не оставлять "на потом" по возможности, поскольку всплывет оно наверняка у заказчика в самый неподходящий момент.
Так что "заработало" - это как правило означает просто "гораздо реже возникает ошибка". Но все равно - возникает, скорее всего.
3ABXO3
Sep 30 2008, 15:02
Подскажите, пожалуйста, куды дальше рыть копать…
вот описал 16-bit ISA устройство… заливаю в плис EPM3256 все работает:
1. запись байта по адресу 300
2. чтение байта по адресу 300
3. запись слова по адресу 300
кроме:
4. чтение слова по адресу 300 возвращает байт
VHDL - код
library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.numeric_std.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ISA_16bit is
port(
I_ADR : in std_logic_vector (9 downto 0);
I_RESET : in std_logic;
I_AEN : in std_logic;
I_IOW : in std_logic;
I_IOR : in std_logic;
I_IOCS16 : out std_logic;
I_DATA : inout std_logic_vector (15 downto 0);
OutPort0 : out std_logic_vector (15 downto 0)
);
end ISA_16bit;
architecture BEHAVIOR of ISA_16bit is
component ISA_16bit
port(
I_ADR : in std_logic_vector (9 downto 0);
I_RESET : in std_logic;
I_AEN : in std_logic;
I_IOW : in std_logic;
I_IOR : in std_logic;
I_IOCS16 : out std_logic;
I_DATA : inout std_logic_vector (15 downto 0);
OutPort0 : out std_logic_vector (15 downto 0)
);
end component;
CONSTANT BASE : integer := 768;
CONSTANT ZST : std_logic_vector (15 downto 0) := "ZZZZZZZZZZZZZZZZ";
CONSTANT NUL : std_logic_vector (15 downto 0) := "0000000000000000";
SIGNAL SelectPort0 : std_logic;
SIGNAL InOutPort0 : std_logic_vector (15 downto 0);
begin
SelectPort0 <= '1' when (conv_integer(I_ADR) = BASE and I_AEN = '0') else '0';
I_IOCS16<='0' when (SelectPort0 = '1') else 'Z';
I_DATA <= InOutPort0 when (SelectPort0 = '1' and I_IOR = '0') else ZST;
OutPort0 <= InOutPort0;
Write:process (I_IOW,I_RESET)
begin
if I_IOW'event and I_IOW='1' then
if SelectPort0 = '1' then InOutPort0<=I_DATA; end if;
end if;
if I_RESET='1' then InOutPort0<=NUL; end if;
end process Write;
end BEHAVIOR;
вот функция работы с портом
void cmd (){
int port,dataW,dataR;
port=TDATAPORT.PORT;
dataW=TDATAPORT.HDATA16;
while(!kbhit()) {
asm {mov dx,port
mov ax,dataW
out dx,ax
in ax,dx
mov dataR,ax
}
fprintf(stdout,"->0x%X..0x%X",dataW,dataR);
}
fprintf(stdout,"\n");
}
Все решилось просто...
ошибки на ПП
Весь код рабочий
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.