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

 
 
> Почему зависает компьютер?, При отладке 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
Ответов (1 - 5)
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
Гвоздик
сообщение Jun 22 2006, 19:04
Сообщение #5


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

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



Спасибо всем. После непоняток я просто тупо передрал исходник с www.fpga4fun.com, переделав его на VHDL и плата задышала! Правда после отработки проги комп все равно подвешивается, ну да ладно пока и так сойдет. Как более-менее отлажу - выложу исходник обязательно, если не забуду.
На шине PCI у меня ничего больше не воткнуто, так что 200-й адрес, к счастью, оказался свободным. Буду рубить дальше!
Go to the top of the page
 
+Quote Post
Гвоздик
сообщение Jun 25 2006, 12:45
Сообщение #6


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

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



Привожу исходные тексты модулей ведомого на шине 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_SYMBOL_CODE_WIDTH : natural := 7;
    VALID_SYMBOL_POSITION_WIDTH : natural := 12;
    CARD_ADDRESS : natural := 512; -- 0x200
    C_BE_WRITE_COMMAND : natural := 3;
    LCD_POSITION_WIDTH : natural := 4);
  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 : inout std_logic;
    DEVSELn : inout std_logic;
    VALID_SYMBOL_CODE : out std_logic_vector(VALID_SYMBOL_CODE_WIDTH downto 0);
    BUS_ENABLEn : out std_logic;
    LCD_SYMBOL_POSITION : out std_logic_vector(LCD_POSITION_WIDTH downto 0);
    TEST_LED : out std_logic_vector(3 downto 0));
end entity pci_target;

architecture behavioural of pci_target is

constant SpaceSymbolCode : std_logic_vector(VALID_SYMBOL_CODE_WIDTH downto 0) := X"20";
signal Transaction, TransactionStart, TransactionEnd, Targeted, LastDataTransfer, DevSelOE, DevSel, DataTransfer : std_logic;
signal ValidLcdSymbolCode : std_logic_vector(VALID_SYMBOL_CODE_WIDTH downto 0) := X"00";
signal ValidLcdSymbolPositionSignal : std_logic_vector(LCD_POSITION_WIDTH downto 0) := "11111";
signal TestLedSignal : std_logic_vector(3 downto 0) := X"F";

begin
  process(RSTn, CLK)
  begin
    if (RSTn = '0') then
      Transaction <= '0';
      DevSelOE <= '0';
      DevSel <= '0';
      ValidLcdSymbolPositionSignal <= "00000";
      ValidLcdSymbolCode <= SpaceSymbolCode;
    else
      if (CLK'event and CLK = '1') then
        if (Transaction = '0') then
          Transaction <= TransactionStart;
          DevSelOE <= Targeted;
          DevSel <= Targeted;
        else
          Transaction <= not TransactionEnd;
          if (TransactionEnd = '1') then
            DevSelOE <= '0';
          end if;
          DevSel <= DevSel and (not LastDataTransfer);
        end if;
        if (DataTransfer = '1') then
          ValidLcdSymbolCode(VALID_SYMBOL_CODE_WIDTH downto 0) <= AD(VALID_SYMBOL_CODE_WIDTH downto 0);
          ValidLcdSymbolPositionSignal(LCD_POSITION_WIDTH downto 0) <= AD(VALID_SYMBOL_POSITION_WIDTH downto (VALID_SYMBOL_CODE_WIDTH + 1));
          TestLedSignal <= not ValidLcdSymbolPositionSignal(3 downto 0);
        end if;
      end if;
    end if;
  end process;

  process(TransactionStart, AD(AD_PCI_BUS_WIDTH downto 0), C_BEn(C_BE_WIDTH downto 0))
  begin
    if ((AD(AD_PCI_BUS_WIDTH downto 0) = CARD_ADDRESS) and (C_BEn(C_BE_WIDTH downto 0) = C_BE_WRITE_COMMAND)) then
      Targeted <= TransactionStart;
    else
      Targeted <= '0';
    end if;
  end process;

  process(DevSelOE, DevSel)
  begin
    if (DevSelOE = '1') then
      DEVSELn <= not DevSel;
      TRDYn <= not DevSel;
    else
      DEVSELn <= 'Z';
      TRDYn <= 'Z';
    end if;
  end process;

  TransactionStart <= (not Transaction) and (not FRAMEn);
  TransactionEnd <= Transaction and FRAMEn and IRDYn;
  LastDataTransfer <= FRAMEn and (not IRDYn) and (not TRDYn);
  DataTransfer <= DevSel and (not IRDYn) and (not TRDYn);

  BUS_ENABLEn <= '0'; -- enable bus formers for 5V pci
  VALID_SYMBOL_CODE(VALID_SYMBOL_CODE_WIDTH downto 0) <= ValidLcdSymbolCode(VALID_SYMBOL_CODE_WIDTH downto 0);
  LCD_SYMBOL_POSITION(LCD_POSITION_WIDTH downto 0) <= ValidLcdSymbolPositionSignal(LCD_POSITION_WIDTH downto 0);
  TEST_LED <= TestLedSignal;

end architecture behavioural;
Go to the top of the page
 
+Quote Post

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

 


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


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