реклама на сайте
подробности

 
 
> Почему зависает компьютер?, При отладке PCI-платы в ДОСе
Гвоздик
сообщение Jun 20 2006, 15:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 2-12-04
Из: Чебоксары
Пользователь №: 1 289



Здраствуйте. Пытаюсь отладить ведомое устройство (target) на PCI-шине (33 МГц), после прочтения форума по этой теме нарочно приобрел старую материнскую плату на Пентиуме 100, чтобы не отключались клоки на шине для устройства без конфигурации (клоки действительно идут - проверяю через ЖКИ), однако при посылке данных в порт 0х200 (адрес моей платы) компьютер зависает намертво после первой же передачи данных в порт. Гружусь с дисковода с дискеты в ДОС. Отладочная плата Max2 Development kit, исходные тексты прилагаю (для ПЛИС и отсылочную программу для ДОСа). В чем может быть дело? Почитал на www.fpga4fun.com, что можно и без конфигурации по-простому гонять данные через PCI. Почему не выходит, эх кабы знать...
Код
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity pci_target is
  generic(AD_PCI_BUS_WIDTH : natural := 31;
    C_BE_WIDTH : natural := 3;
    VALID_CARD_DATA_WIDTH : natural := 7;
    CARD_ADDRESS : natural := 512; -- 0x200
    C_BE_WRITE_COMMAND : natural := 3);
  port(RSTn : in std_logic;
    CLK : in std_logic;
    AD : in std_logic_vector(AD_PCI_BUS_WIDTH downto 0);
    FRAMEn : in std_logic;
    C_BEn : in std_logic_vector(C_BE_WIDTH downto 0);
    IRDYn : in std_logic;
    TRDYn : out std_logic;
    DEVSELn : out std_logic;
    valid_card_data : out std_logic_vector(VALID_CARD_DATA_WIDTH downto 0);
    BUS_ENABLEn : out std_logic;
    test_led : out std_logic);
end entity pci_target;

architecture behavioural of pci_target is
signal devsel_sig_n : std_logic := 'Z';
signal trdy_sig_n : std_logic := 'Z';
signal card_address_found : std_logic := '0';
signal valid_card_data_sig : std_logic_vector(VALID_CARD_DATA_WIDTH downto 0) := X"00";
signal test_led_sig : std_logic := '1';
begin
  process(RSTn, CLK, FRAMEn, AD(AD_PCI_BUS_WIDTH downto 0))
  begin
    if (RSTn = '0') then
      devsel_sig_n <= 'Z';
      trdy_sig_n <= 'Z';
      card_address_found <= '0';
      valid_card_data_sig <= X"00";
      test_led_sig <= '1';
    else
      if (CLK'event and CLK = '1') then
        test_led_sig <= '0';
        if (FRAMEn = '0') then
          if (IRDYn = '1') then
            trdy_sig_n <= 'Z';
            if ((AD(AD_PCI_BUS_WIDTH downto 0) = CARD_ADDRESS) and (C_BEn(C_BE_WIDTH downto 0) = C_BE_WRITE_COMMAND)) then
              card_address_found <= '1';
              devsel_sig_n <= '0';
            else
              card_address_found <= '0';
              devsel_sig_n <= 'Z';
            end if;
          else
            if ((card_address_found = '1') and (C_BEn(0) = '0')) then
              valid_card_data_sig(VALID_CARD_DATA_WIDTH downto 0) <= AD(VALID_CARD_DATA_WIDTH downto 0);
              trdy_sig_n <= '0';
              devsel_sig_n <= '0';
            else
              trdy_sig_n <= 'Z';
              devsel_sig_n <= 'Z';
            end if;
          end if;
        else
          devsel_sig_n <= 'Z';
          trdy_sig_n <= 'Z';
          card_address_found <= '0';
        end if;
      end if;
    end if;
  end process;

  valid_card_data(VALID_CARD_DATA_WIDTH downto 0) <= valid_card_data_sig(VALID_CARD_DATA_WIDTH downto 0);
  DEVSELn <= devsel_sig_n;
  TRDYn <= trdy_sig_n;
  BUS_ENABLEn <= '0'; -- enable bus formers for 5V pci
  test_led <= test_led_sig;

end architecture behavioural;

и досовский исходник еще:
Код
#include <stdio.h>
#include <dos.h>
int main(void)
{
  int port = 0x200;
  unsigned char lcd_text[16] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
    0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
  unsigned char i = 0;
  clrscr();
  printf("Output scan codes to the port: %d in endless cycle...\n",port);
  for (i = 0; i < 16; i++)
  {
    outportb(port, lcd_text[i]);
    printf("To the port %d was sent data %d\n",port, lcd_text[i]);
  }
  printf("\n");
  for (i = 0; i < 16; i++)
  {
    outp(port, (int)lcd_text[i]);
    printf("Second output to the port %d and data = %d", port, lcd_text[i]);
  }
  return 0;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ktod
сообщение Jun 21 2006, 14:10
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 27-09-05
Пользователь №: 8 979



Для начала смените адрес. 0x200 находится в общем адресном пространстве шины ISA. Смените на что ни будь вроде 0xe800. А на самом деле нужно смотреть какой адрес вободен.
Попробуйте писать DWORD, а не байт.

Но если комп просто зависает, скорее всего не правильно задана логика работы автомата. В результате чего нет сигнала готовности таргета #TRDY при выставленном #DEVSEL. Получается вечное ожидание. Бывало такое при разработке.


--------------------
Ignoramus et Ignorabimus
Go to the top of the page
 
+Quote Post
Kopart
сообщение Jun 21 2006, 14:20
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(ktod @ Jun 21 2006, 18:10) *
Для начала смените адрес. 0x200 находится в общем адресном пространстве шины ISA. Смените на что ни будь вроде 0xe800. А на самом деле нужно смотреть какой адрес вободен.
Попробуйте писать DWORD, а не байт.

Но если комп просто зависает, скорее всего не правильно задана логика работы автомата. В результате чего нет сигнала готовности таргета #TRDY при выставленном #DEVSEL. Получается вечное ожидание. Бывало такое при разработке.


На шине PCI при конфигурации выделяется свободное адрессное пространство.
Без конфигурации Вы думаете что этот адрес0xE800 уже будет свободен?
Для PCI апаратно инвариантно как писать - 4-мя байтами или одним.


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
ktod
сообщение Jun 21 2006, 16:29
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 27-09-05
Пользователь №: 8 979



Цитата(NiOS @ Jun 21 2006, 21:20) *
На шине PCI при конфигурации выделяется свободное адрессное пространство.
Без конфигурации Вы думаете что этот адрес0xE800 уже будет свободен?

Я ясно сказал, что свободен ли этот адрес нужно проверять.
А на лысой мамке от пня он _почти наверное_ свободен. Или Вы предпочитаете набивать слоты расширения различной переферией при начальной отладке проекта на pci?

Сообщение отредактировал ktod - Jun 21 2006, 16:30


--------------------
Ignoramus et Ignorabimus
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 22:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016