1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Thiết kế card PCI ?

Chủ đề trong 'Điện - Điện tử - Viễn thông' bởi ahuy82, 11/10/2003.

  1. 0 người đang xem box này (Thành viên: 0, Khách: 0)
  1. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    Đúng như Quen_Mang_Kinh nói, tùy từng ứng dụng mà có thể sẽ làm cho PCI card trở nên phức tạp hay đơn giản.
    Ví dụ với một bộ PCI tiêu chuẩn thì thành phần căn bản gồm:
    Các thanh ghi tham số: mỗi bộ PCI tiêu chuẩn đều có vài chục byte chứa các thông tin về hãng sản xuất, loại ứng dụng, địa chỉ, đặc tính...Các thông số này thường được ấn ra bởi nhà sản xuất. Các thông số này được chứa tại một địa chỉ tiêu chuẩn mà tất cả các nhà sản xuất phải tuân theo. Vì khi cắm một thẻ PCI vào mạng thì bộ xử lý với sẽ đọc thông tin và có thể tự động chọn chương trình giao diện. Với PC, khi install window hoặc Linux thì các thông tin về hầu hết các thẻ PCI có trên thị trường được tải vào máy. Bộ xử lý sẽ tìm ra chương trình driver cho phù hợp với thẻ cắm vào và cho tạo giao diện. Ta gọi chức năng là Plug&Play.
    Demulitplexer - vì PCI dùng chung 32 đường dây cho địa chị và dữ kiện, nên khi nhận được địa chỉ thì demultiplexer này sẽ đưa địa chỉ qua một phần đệm.
    Mã hóa địa chỉ - phần này sẽ so sánh địa chỉ chứ trong phần đệm với địa chỉ được định trong các thanh nghi và định xem có phải địa chỉ của mình không. Khi đúng thì nó sẽ báo cho các phần khác trong bộ PCI chuẩn bị làm việc (có thể là truyền, nhận, thay đổi tham số,....). Còn không đúng thì bỏ qua. Các thanh ghi địa chỉ này có thể được định bởi nhà sản xuất hay người dùng. Ta có thể gán cho một thẻ PCI một địa chỉ ta muốn, nhưng trong phạm vi vi cho phép.
    Phần giải lệnh - Đi kèm với địa chỉ là 4 bít lệnh. Lệnh này cho biết khi nào thì truyền tải 8 bít hay 16 hay 32, lệnh truy cập bộ nhớ hay thiết bị ngoại vi...
    Bộ Đệm dữ kiện - Bộ đệm này làm việc như một nhớ với tốc độ nhanh để đáp ứng kịp với tốc độ của mạng là 33 MHz. Khi bộ xử lý truy cập các thanh ghi để lấy thông tin thì truyền tải từng 32-bit một, nhưng khi truy cập các bộ đệm này thì bộ xử lý thường truyền tải dữ kiện theo khối, thật nhanh. Chỉ một địa chỉ được gởi ra và một tràn các dữ kiện. Bộ đệm này tự động tăng con chỉ lên một đơn vị, chứa hoặc lấy ra từng 32-bít một theo thứ tự. Có 2 bộ đệm cho chức năng này: một là bộ đệm nhận vào từ mạng, hai là bộ đệm truyền ra mạng. Vì tốc độ hoạt động của ngoại vi và tốc độ mạng khác nhau nên cần phần này giúp không bị mất dữ kiện.
    Phần nối cho người dùng - phần này cho phép người dùng nối các thiết bị ứng dụng vào, có thể là các cổng I/O, các ADC, DAC,.. Phần này giúp lấy các dữ kiện ra từ bộ đệm chứ dữ kiện nhận được từ mạng, và ghi vào các bộ đệm để chuẩn bị gởi ra mạng với tốc độ là của mạng. Các tín hiệu ra của phần này có nghi thức giao diện đơn giản giống như của các cổng parallel, có thể là 8 bít, 16, 32 hoặc/và bất kỳ. Người dùng chỉ cần làm phần giao diện với các cổng này với thiết bị ngoại vi.
    Về phần cứng thì thật là khó và có thể không thể thực hiện được một bộ PCI tiêu chuẩn mà chỉ dùng toàn chip 74. Vì phải cần cả hàng chục con thanh ghi để chứ các thông tin, và cả trăm con để làm phần đệm cho dữ kiện. Khi đó mạch to, dây dẫn dài, tín hiệu biết dạng, không còn đạt tốc độ truyền dẫn của mạng và dẫn đến thất bại.
    Nhưng nếu chỉ nối với PCI với các ứng dụng tốc độ chậm thì ta có thể loại bỏ bộ đệm, bỏ luôn cả phần chứa thông tin vì ta chẳng cần nó với lại ta chẳng là một hãng sản xuất nào cả :). Ta chỉ cần phần mã hóa dữ kiện, phần giải lệnh và phần nối từ thiết bị ngoại vi với mạng. Và điều cuối cùng xung nhịp mạch PCI phải đồng bộ với xung nhịp của hệ thống, tức ta không cần tạo xung clock riêng mà lấy xung từ mạng PCI. Tần số clock này là 32 MHz.
  2. Pionez

    Pionez Thành viên quen thuộc

    Tham gia ngày:
    03/01/2002
    Bài viết:
    253
    Đã được thích:
    0
    Chưa giúp được gì cho người ta thì đừng có hỏi kiểu khinh người như vậy dù bạn có là ai đi nữa.
    PS: Xin lỗi vì đã post một bài chẳng mang một chút thông tin nào thêm cho câu hỏi của ahuy82 cả. Tuy nhiên đọc cái bài này mình thấy ngứa mắt quá không nhịn nổi.
    --
    Hướng tới một cộng đồng sử dụng mã nguồn mở ở Việt Nam
    Pionez
  3. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    mình không nghĩ quen_mang_kinh có ý khinh khi đâu. mình nghĩ có thể họ là sinh viên với nhau nên hiểu nhau và có lẽ là cũng thật lòng đấy thôi
    nghia
    Được txnghia sửa chữa / chuyển vào 15:14 ngày 17/10/2003
  4. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    Truyện dài PCI
    Ðến hôm nay thì rất nhiều các hãng làm chip lớn nổi tiếng đều đặc biệt quan tâm và phát triển mạng và kỹ thuật PCI. Hầu như tháng nào cũng có hội thảo giới thiệu về PCI ở thung lũng điện tử San Jose. PCI tiêu chuẩn chạy cũng đã thấy khíp, 33MHz, hiệu quả gấp 10 lần ISA, nay lại ra thêm PCI-X (PCI Express) tốc độ truyền mạng lên đến gần 200MHz. Các PCI này nhằm giải quyết nhu cầu tăng tốc độ cho các trạm nối internet, network, xử lý hình 3 chiều, về các vấn đề về truyền tải thông tin, ra-đa,...
    Máy tính thường của ta không cần nhanh đến thế và với PCI tiêu chuẩn là đủ. Các hãng sản xuất trước đây chỉ làm ra các bộ PCI chuyên cho từng ứng dụng như ethernet card, video card....Nếu ta muốn dùng những chip này cho các ứng dụng khác, nối với mạch của ta thì thật là khó vì các chân đã được định sẵn, chứng năng không phù hợp vói ứng dụng ta muốn. Một nhà thiết kế hay hãng nào muốn làm một PCI cho riêng ứng dụng của hãng thì phải tốn hàng triệu Mỹ kim ban đầu để thiết kế và thời gian cả năm để thử nghiệm, và sau đó mới làm ra hàng loạt. Như thế thì chỉ có những hãng thật lớn mới có thể thực hiện được thôi.
    Thấy được vấn đề này mà các hãng suất PCI và các hãng điện tử đã dùng đến các PLD -programmable Logic Device - chip có thể tạo các mạch điện logic bên trong theo các chương trình viết trên computer.
    Có 2 loại PLD thông dụng, một loại vẫn giữ nguyên kết nối các cổng logic khi ngắt nguồn cấp điện và một loại khi ngắt điện nó lại trở thành một chip trống rỗng. Mỗi lần bậc máy lên chip này cần phải được tải vào các chương trình định sẵn, và sau vài mili giây thì chip lại trở thành một chip hoạt động theo ý của người thiết kế. Các chương trình định sẵn được thiết kế trên máy tính (PC) và được chứa trong bộ nhớ Flash hay EEPROM để giữ được dữ kiện lúc ngắt điện. Và khi khởi động dữ kiện này được tải vào Chip. Loại này có tên là FPGA-Field Programmable Gage Array.
    Tuy hơi rắc rối nhưng loại này có sức chứa cao gấp hàng ngàn lần loại kia. Loại này có thể chứa đến cả 10 triệu cổng logic, trong khi loại kia chỉ chứa chừng vài ngàn. Các hãng hàng đầu trong nghành chế tạo PLD là Xilinx (xilinx.com) và Altera (altera.com). PLD có loại chứa từ vài trăm cổng logic đến vài triệu, số chân ra từ vài chân đến trên 1 ngàn chân, giá từ vài đô đến cả vài ngàn đô một con. Ngôn ngữ tạo mạch cho các chip PLD này thông dụng là VHDL và verilog. Ở Âu châu thì VHDL thông dụng hơn. Nhưng hôm nay thì ở Mỹ cũng đã dùng VHDL thật rộng rãi. Các trường đại học đã cho dạy ngôn ngữ này 5, 7 năm trước. Người thiết kế có thể thiết kế mạch bằng các vẽ sơ đồ mạch với các chip trong thư viện của phần mềm được cung cấp, hay lấy từ internet, hay phải mua lại của người khác. Sau khi lập trình hay vẽ mạch xong bạn chạy các test về tín hiệu trên PC, sau đó download xuống PLD cho chạy thử. Nếu chưa đạt thì sửa lại và lại download xuống đến khi đạt yêu cầu mà chẳng cần phải nối hay sửa một dây điện nào.
    Gần đây người đã cũng đã có thể bỏ vào chip các bộ xử lý khá mạnh và nó chỉ chiếm một phần nhỏ trong PLD, các phần còn lại để tạo thiết kế giao diện phù hợp cho người dùng và thiết kế các mạch cần thiết. Vì vậy với nhiều ứng thì chỉ cần một chip PLD làm được tất cả.
    PLD hiện đang nở rộ, phát triển nhanh không ngờ, và tương lai vững chắc. Các hãng như Intel, IBM, Motorolla,... đã liên kết với 2 đầu đàn trong nghành chế tạo PLD như Xilinx và Altera để cung cấp các chip thật linh hoạt cho người thiết kế, tạo tính cạnh tranh, sớm bán các thiết bị ra thị trường.
    Với các bạn chưa quen biết với kỹ thuật này, mình mạnh tiếng khuyên các bạn nên tìm hiểu và làm quen với nó với một tương lai rất hứa hẹn. Bạn có thể tự mình thiết kế chip theo chức năng của mình, giảm sự phụ thuộc vào các hãng sản xuất, và biết đâu chừng khi có hãng điện tử nước ngoài vào đầu tư, bạn là những đầu tàu trong nghành này tại Việt Nam, sản xuất chip điện tử Made In Vietnam. Nếu bạn nắm vững về kỹ thuật này và với kiến thức về toán và lập trình và say mê điện tử, thì điều đó quả thật không xa
    Trở lại PCI, thì rất nhiều hãng và thiết kế viên chọn FPGA làm phần giao diện. Phần này nếu có công thì tự thiết lấy nếu không thì tìm trên internet hay mua từ các hãng sản xuất. Giá không rẻ đâu. Với PCI thì chừng 2 ngàn đô. Hãng đó sẽ gởi cho mình một file (gọi là soft core) và dùng file này để tải vào chip tạo giao diện PCI. Phần giao diện PCI chiếm một phần nhỏ trong FPGA, chừa khoảng trống cho bạn thiết kế các mạch ứng dụng nối vào mạng PCI.
    Sau đây là các thông tin và mã nguồn:
    www.xilinx.com -- thông tin về FPGA, PCI....
    www.altera.com -- thông tin về FPGA, PCI...
    www.quicklogic -- nhiều tài liệu, mã nguồn rất hay về thiết kế PCI và FPGA...
    http://www.latticesemi.com -- nhiều tại liệu, thiết kế mẫu, bằng verilog cho PCI và FPGA. Bạn cần đang ký với một ít thông tin về bạn để có thể load các file về.
    Dưới đây là mã nguồn PCI viết bằng VHDL. mã nguồn này còn thiếu một phần
    Được txnghia sửa chữa / chuyển vào 15:27 ngày 17/10/2003
    Được txnghia sửa chữa / chuyển vào 15:29 ngày 17/10/2003
  5. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    [library IEEE;
    use IEEE.STD_LOGIC_1164.all;
    use IEEE.STD_LOGIC_arith.all;
    use IEEE.STD_LOGIC_UNSIGNED.all;
    entity easy_sam is
    port (
    -- PCI slot signals

    rst_n : in std_logic;
    clk : in std_logic;
    ad : in std_logic_vector(31 downto 0);
    ad_o : out std_logic_vector(31 downto 0);
    cbe : in std_logic_vector(3 downto 0);
    irq_n : out std_logic;
    led3 : out std_logic;
    -- easy pci core backend
    addr : in std_logic_vector(31 downto 2);
    cmd : in std_logic_vector(3 downto 0);
    cfg_wr_en : in std_logic;
    cfg_rd_en : in std_logic;
    b0_sel : out std_logic;
    b0_mem_io : out std_logic;
    b0_wait : out std_logic_vector(1 downto 0);
    b0_b_wait : out std_logic_vector(1 downto 0);
    b0_linear : out std_logic;
    b0_wr_en : in std_logic;
    b0_rd_en : in std_logic;
    -- local I/O signal

    gen_out : out std_logic_vector(31 downto 0);
    gen_in : in std_logic_vector(23 downto 0);

    irq_1 : in std_logic; -- trigger input from the local device
    irq_2 : in std_logic

    );
    end easy_sam;
    architecture BEHAVIOR of easy_sam is
    -- config register map constant
    constant CFG_00h : std_logic_vector(5 downto 0) := "000000";
    constant CFG_04h : std_logic_vector(5 downto 0) := "000001";
    constant CFG_08h : std_logic_vector(5 downto 0) := "000010";
    constant CFG_0ch : std_logic_vector(5 downto 0) := "000011";
    constant CFG_10h : std_logic_vector(5 downto 0) := "000100";
    constant CFG_14h : std_logic_vector(5 downto 0) := "000101";
    constant CFG_18h : std_logic_vector(5 downto 0) := "000110";
    constant CFG_1ch : std_logic_vector(5 downto 0) := "000111";
    constant CFG_2ch : std_logic_vector(5 downto 0) := "001011";
    constant CFG_3ch : std_logic_vector(5 downto 0) := "001111";
    -- PCI Bus Command Encoding --

    -- PCI Bus Command Encoding --

    constant CMD_IO_SPACE : std_logic_vector (3 downto 1) := "001";
    constant CMD_MEM_SPACE : std_logic_vector (3 downto 1) := "011";
    constant CMD_CFG : std_logic_vector (3 downto 1) := "101";
    constant CMD_MEM_MULTI : std_logic_vector (3 downto 1) := "110";
    constant CMD_MEM_CACHE : std_logic_vector (3 downto 1) := "111";
    signal IO_SEL,MEMORY_SEL, CONFIG_SEL, MEMORY_MULT,MEMORY_CACHE : boolean;

    -- config base address 0 signal definition
    signal base0 : std_logic_vector(31 downto 4);
    signal base0_mem_type_n : std_logic;

    -- local device control signals
    signal gen_o : std_logic_vector(31 downto 0);
    signal gen_o_init : std_logic_vector(31 downto 0);
    -- interrupt related signals
    signal irq_1_ack : std_logic;
    signal irq_2_ack : std_logic;
    signal irq_1_ck : std_logic;
    signal irq_2_ck : std_logic;
    signal irq_1_en : std_logic;
    signal irq_2_en : std_logic;
    signal irq_1_trg : std_logic; -- default positive
    signal irq_2_trg : std_logic; -- default postive
    signal irq_1_o : std_logic;
    signal irq_2_o : std_logic;

    -- I/O map of the general I/O
    -- 0 : gen out
    -- 4 : gen in & irq status read, oilsp input
    --
    -- configuration parameters
    constant ADDONE_GENERIC_PCI_ID : std_logic_vector (15 downto 0) := "1111111111111110";
    constant ADDONE_VENDOR_ID : std_logic_vector (15 downto 0) := "1000111111111110";
    constant CLASS_CODE_NETWORK : std_logic_vector (15 downto 0) := "0000001000000000";
    constant PLX_9050_DEV_ID : std_logic_vector (15 downto 0) := "1001000001010000"; -- 9050
    constant PLX_VENDOR_ID : std_logic_vector (15 downto 0) := "0001000010110101"; -- 10b5
    -- config information
    signal dev_id : std_logic_vector (15 downto 0);
    signal ven_id : std_logic_vector (15 downto 0);
    signal class_code : std_logic_vector (23 downto 0);
    signal rev_id : std_logic_vector (7 downto 0);
    signal subsys_id : std_logic_vector (15 downto 0);
    signal subsys_ven_id : std_logic_vector (15 downto 0);
    --
    -- reg 3ch area
    --
    signal irq_line : std_logic_vector(7 downto 0); -- irq line routing register
    signal irq_pin : std_logic_vector(7 downto 0); -- irq pin
    signal min_gnt : std_logic_vector(7 downto 0);
    signal max_lat : std_logic_vector(7 downto 0);
    begin
    -- generate the match con***ion of this device
    -- no memory burst supported
    -- return the result of the comparison of the address range and supported command
    b0_sel <= ''1'' when ((addr(31 downto 4) = base0(31 downto 4)) and cmd(3 downto 1)=CMD_MEM_SPACE )
    else ''0'';
    -- if memory resource set 1 else set to 0

    base0_mem_type_n <= ''0'';

    b0_mem_io <= not base0_mem_type_n;

    b0_wait <= "00";
    b0_b_wait <= "00";
    b0_linear <= ''1'';
    -- backend target register write process

    WRITE_PROCESS : process
    (
    rst_n,
    clk
    )
    begin
    if (rst_n=''0'') then

    gen_o <= "00000000000000000000000000000000";
    irq_1_ack <= ''0'';
    irq_2_ack <= ''0'';

    irq_1_en <= ''0'';
    irq_2_en <= ''0'';
    irq_1_trg <= ''1'';
    irq_2_trg <= ''1'';
    -- config base address register
    base0 <= "0000000000000000000000000000";
    irq_line <= "00000000";

    elsif (clk''event and clk=''1'') then
    -- ready signal generation
    -- burst is not supported
    --
    --
    if (b0_wr_en=''1'') then -- single transfer, not supported the burst mode
    case (addr(3 downto 2)) is
    when "00" =>
    gen_o <= ad;

    assert FALSE report "MAS_CTRL MAS_CONTROL_REG_PRO: write 001, mas_cmd, mas_en" severity NOTE;
    when "01" =>
    irq_2_ack <= ad(31);
    irq_1_ack <= ad(30);

    irq_2_en <= ad(29);
    irq_1_en <= ad(28);

    irq_2_trg <= ad(27);
    irq_1_trg <= ad(26);

    assert FALSE report "MAS_CTRL MAS_CONTROL_REG_PRO: write 001, mas_cmd, mas_en" severity NOTE;
    when others =>
    irq_2_ack <= ''0'';
    irq_1_ack <= ''0'';

    assert FALSE report "MAS_CTRL MAS_CONTROL_REG_PRO: write other address " severity NOTE;
    end case;
    else
    irq_2_ack <= ''0'';
    irq_1_ack <= ''0'';
    end if;
    -- config write process
    if (cfg_wr_en=''1'') then
    case (addr(7 downto 2)) is
    when CFG_10h =>
    -- check the bit flags for each byte enable bit.

    if (cbe(3)=''0'') then
    base0(31 downto 24) <= ad(31 downto 24);
    end if;

    if (cbe(2)=''0'') then
    base0(23 downto 16) <= ad(23 downto 16);
    end if;

    if (cbe(1)=''0'') then
    base0(15 downto 8) <= ad(15 downto 8);
    end if;

    if (cbe(0)=''0'') then
    base0(7 downto 4) <= ad(7 downto 4);
    end if;
    -- base0 <= ad(31 downto 5);

    assert FALSE report "PCI_CONFIG_CONFIG_PRO : CONFIG address 10 base address 0 register writing" severity NOTE;
    -- when CFG_14h =>

    -- if (cbe(3)=''0'') then
    -- base1(31 downto 24) <= ad(31 downto 24);
    -- end if;

    -- if (cbe(2)=''0'') then
    -- base1(23 downto 16) <= ad(23 downto 16);
    -- end if;

    -- if (cbe(1)=''0'') then
    -- base1(15 downto 12) <= ad(15 downto 12);
    -- end if;

    -- base1 <= ad(31 downto 12);
    -- assert FALSE report "PCI_CONFIG_CONFIG_PRO : CONFIG address 10 base address 1 register writing" severity NOTE;
    when CFG_3ch =>
    if (cbe(0)=''0'') then
    irq_line <= ad(7 downto 0);
    end if;

    assert FALSE report "PCI_CONFIG_CONFIG_PRO : CONFIG address 3c irq line register writing" severity NOTE;
    when others =>

    end case;

    end if;
    end if;
    end process WRITE_PROCESS;
    --
    --
    --
    --
    --
    READ_PROCESS : process
    (
    rst_n,

    b0_rd_en,
    cfg_rd_en,

    addr,
    base0,
    base0_mem_type_n,

    cbe,
    gen_o,
    irq_2_ack,
    irq_1_ack,

    irq_2_en,
    irq_1_en,

    irq_2_trg,
    irq_1_trg,

    irq_2_o,
    irq_1_o,

    gen_in,

    -- config info
    irq_line,
    irq_pin,
    min_gnt,
    max_lat,
    dev_id,
    ven_id,
    class_code,
    rev_id,
    subsys_id,
    subsys_ven_id
    )
    begin
    if (rst_n=''0'') then
    -- the initial con***ion
    ad_o <= "00000000000000000000000000000000";

    elsif (cfg_rd_en=''1'') then

    -- config info

    case (addr(7 downto 2)) is
    when CFG_00h =>
    ad_o(31 downto 16) <= dev_id;
    ad_o(15 downto 0) <= ven_id;
    assert FALSE report "PCI_CONFIG_CONFIG_O_PRO : CONFIG address DEVICE ID and Venad_or ID reading" severity NOTE;
    when CFG_08h =>
    ad_o(31 downto 8) <= class_code;
    ad_o(7 downto 0) <= rev_id;
    assert FALSE report "PCI_CONFIG_CONFIG_O_PRO : CONFIG address 08 reading" severity NOTE;
    when CFG_10h =>
    ad_o(31 downto 4) <= base0(31 downto 4);
    ad_o(3) <= ''1''; -- prefetchable , all byte is used in this application, so there is no side effect
    ad_o(2 downto 1) <= "00"; -- locate anywhere in 32bit address space
    ad_o(0) <= base0_mem_type_n; -- memory space indecator, 0 : memory, 1 : I/o
    assert FALSE report "PCI_CONFIG_CONFIG_O_PRO : CONFIG address 10 reading" severity NOTE;
    --when CFG_14h =>
    -- ad_o(31 downto 12) <= base1(31 downto 12);
    -- ad_o(11 downto 4) <= "00000000"; -- address range area
    -- ad_o(3) <= ''1''; -- prefetchable , all byte is used in this application, so there is no side effect
    -- ad_o(2 downto 1) <= "00"; -- locate anywhere in 32bit address space
    -- ad_o(0) <= ''0''; -- memory space indecator
    -- assert FALSE report "PCI_CONFIG_CONFIG_O_PRO : CONFIG address 14 reading" severity NOTE;
    when CFG_2ch =>
    -- sub system ID and subsystem vendor ID
    ad_o(31 downto 16) <= subsys_id;
    ad_o(15 downto 0) <= subsys_ven_id;
    assert FALSE report "PCI_CONFIG_CONFIG_O_PRO : CONFIG address 2c reading" severity NOTE;
    when CFG_3ch =>
    ad_o(31 downto 24) <= max_lat;
    ad_o(23 downto 16) <= min_gnt;
    ad_o(15 downto 8) <= irq_pin;
    ad_o(7 downto 0) <= irq_line;
    assert FALSE report "PCI_CONFIG_CONFIG_O_PRO : CONFIG address 3c reading" severity NOTE;
    when others =>
    ad_o <= "00000000000000000000000000000000";

    end case;

    elsif (b0_rd_en=''1'') then
    -- local device register reading
    case (addr(3 downto 2)) is
    when "00" =>
    ad_o <= gen_o;
    when "01" =>

    ad_o(31) <= ''0''; -- irq_2_ack, auto cleared
    ad_o(30) <= ''0''; -- irq_1_ack, auto cleared

    ad_o(29) <= irq_2_en;
    ad_o(28) <= irq_1_en;

    ad_o(27) <= irq_2_trg;
    ad_o(26) <= irq_1_trg;

    ad_o(25) <= irq_2_o;
    ad_o(24) <= irq_1_o;

    ad_o(23 downto 0) <= gen_in;

    assert FALSE report "MAS_CTRL MAS_DO_PRO : 001 , read mas_parameters" severity NOTE;
    when others =>

    ad_o <= "00000000000000000000000000000000";
    assert FALSE report "MAS_CTRL MAS_DO_PRO : read other address " severity NOTE;
    end case;

    else
    ad_o <= "00000000000000000000000000000000";
    assert FALSE report "MAS_CTRL MAS_DO_PRO : other events" severity NOTE;

    end if;
    end process READ_PROCESS;
    --
    -- any other local logic insertion here
    -- for the ASIC applicaiton, do not generate the tri state I/O port
    -- all the tri-output or inout port is defined in the top module of the design
    --
    -- async interrupt output process
    IRQ_1_PROCESS : process (

    rst_n,
    irq_1_ack,
    irq_1_ck
    )
    begin
    if ((rst_n=''0'') or (irq_1_ack=''1'')) then
    irq_1_o <= ''0'';

    elsif (irq_1_ck''event and irq_1_ck=''1'') then
    irq_1_o <= ''1'';
    end if;

    end process IRQ_1_PROCESS;

    IRQ_2_PROCESS : process (

    rst_n,
    irq_2_ack,
    irq_2_ck
    )

    begin
    if ((rst_n=''0'') or (irq_2_ack=''1'')) then
    irq_2_o <= ''0'';

    elsif (irq_2_ck''event and irq_2_ck=''1'') then
    irq_2_o <= ''1'';
    end if;

    end process IRQ_2_PROCESS;

    -- irq 1, 2 trigger edge selection assignment

    irq_1_ck <= irq_1 when (irq_1_trg=''1'') else (not irq_1);
    irq_2_ck <= irq_2 when (irq_2_trg=''1'') else (not irq_2);

    -- irq output connection
    irq_n <= ''0'' when (
    ((irq_1_en=''1'') and (irq_1_o=''1'')) or
    ((irq_2_en=''1'') and (irq_2_o=''1''))
    ) else ''1'';

    gen_out <= gen_o;

    led3 <= gen_o(31);
    -- config information definitions
    -- class_code <= "000001101000000000000000";-- 068000 , other bridge device CLASS_CODE_NETWORK;
    class_code <= "000001111000000000000000";-- 078000 , other communication device
    rev_id <= "00000000";
    -- initial constant definitions
    -- device ID and vendor ID setting

    dev_id <= PLX_9050_DEV_ID+1;
    ven_id <= PLX_VENDOR_ID;
    subsys_id <= PLX_9050_DEV_ID;
    subsys_ven_id <= PLX_VENDOR_ID;

    min_gnt <= "00000000";
    max_lat <= "00000000";
    irq_pin <= "00000001";

    -- end of local design


    end BEHAVIOR;
  6. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    library IEEE;
    use IEEE.STD_LOGIC_1164.all;
    use IEEE.STD_LOGIC_arith.all;
    use IEEE.STD_LOGIC_UNSIGNED.all;
    entity pci_t_easy is
    port (
    -- PCI BUS signals
    ad : inout std_logic_vector(31 downto 0);
    cbe : in std_logic_vector(3 downto 0);
    frame_n : in std_logic;
    irdy_n : in std_logic;
    idsel : in std_logic;
    par : inout std_logic;
    perr_n : inout std_logic;
    serr_n : inout std_logic;
    trdy_n : inout std_logic;
    stop_n : inout std_logic;
    devsel_n : inout std_logic;
    lock_n : in std_logic;
    inta_n : out std_logic;
    clk : in std_logic;
    rst_n : in std_logic;
    -- dream tech local I/O control signals

    gen_out : out std_logic_vector(31 downto 0);
    gen_in : in std_logic_vector(23 downto 0);

    irq_1 : in std_logic;
    irq_2 : in std_logic;
    -- here all the functions are embeded in FPGA

    led0 : out std_logic;
    led1 : out std_logic;
    led2 : out std_logic;
    led3 : out std_logic
    );
    end pci_t_easy;
    architecture BEHAVIOR of pci_t_easy is
    --
    -- component definitions
    --
    component pci_tcore

    port (

    -- PCI BUS signals

    ad : in std_logic_vector(31 downto 0);
    cbe : in std_logic_vector(3 downto 0);

    ad_o : out std_logic_vector(31 downto 0);
    ad_oe : out std_logic;

    frame_n : in std_logic;
    irdy_n : in std_logic;
    idsel : in std_logic;

    par : in std_logic;
    par_o : out std_logic;
    par_oe : out std_logic;

    perr_n : in std_logic;
    perr_o_n : out std_logic;
    perr_oe : out std_logic;

    serr_o_n : out std_logic;
    serr_oe : out std_logic;

    trdy_n : in std_logic;
    trdy_o_n : out std_logic;
    trdy_oe : out std_logic;

    stop_n : in std_logic;
    stop_o_n : out std_logic;

    devsel_n : in std_logic;
    devsel_o_n : out std_logic;
    devsel_oe : out std_logic;
    lock_n : in std_logic;

    clk : in std_logic;
    rst_n : in std_logic;


    tar_state_o : out std_logic_vector(2 downto 0);

    ------ backend local interface
    addr_o : out std_logic_vector(31 downto 2);
    cmd_o : out std_logic_vector(3 downto 0);

    cfg_wr_en : out std_logic;
    cfg_rd_en : out std_logic;

    b_sel : in std_logic_vector(6 downto 0); -- boot rom and 5 to 0 base

    b_mem_io : in std_logic;
    b_wait : in std_logic_vector(1 downto 0);
    b_b_wait : in std_logic_vector(1 downto 0);
    b_linear : in std_logic;
    b_wr_en : out std_logic;
    b_rd_en : out std_logic

    );

    end component;

    component easy_sam

    port (

    -- PCI slot signals

    rst_n : in std_logic;
    clk : in std_logic;

    ad : in std_logic_vector(31 downto 0);
    ad_o : out std_logic_vector(31 downto 0);

    cbe : in std_logic_vector(3 downto 0);

    irq_n : out std_logic;
    led3 : out std_logic;

    -- easy pci core backend
    addr : in std_logic_vector(31 downto 2);
    cmd : in std_logic_vector(3 downto 0);
    cfg_wr_en : in std_logic;
    cfg_rd_en : in std_logic;

    b0_sel : out std_logic;
    b0_mem_io : out std_logic;

    b0_wait : out std_logic_vector(1 downto 0);
    b0_b_wait : out std_logic_vector(1 downto 0);
    b0_linear : out std_logic;

    b0_wr_en : in std_logic;
    b0_rd_en : in std_logic;
    -- local I/O signal

    gen_out : out std_logic_vector(31 downto 0);
    gen_in : in std_logic_vector(23 downto 0);

    irq_1 : in std_logic; -- trigger input from the local device
    irq_2 : in std_logic

    );

    end component;

    ------------------ END OF component definitions
    --
    --
    -- signal definitions
    --
    --
    -- pci tareget core connection signals

    -- for PCI BUS connection signals

    signal ad_o : std_logic_vector(31 downto 0);
    signal ad_oe : std_logic;
    signal par_o : std_logic;
    signal par_oe : std_logic;
    signal perr_o_n : std_logic;
    signal perr_oe : std_logic;

    signal serr_o_n : std_logic;
    signal serr_oe : std_logic;

    signal trdy_o_n : std_logic;
    signal trdy_oe : std_logic;
    signal stop_o_n : std_logic;
    signal devsel_o_n : std_logic;
    signal devsel_oe : std_logic;
    signal co_ad_o : std_logic_vector(31 downto 0);
    signal sm_ad_o : std_logic_vector(31 downto 0);
    signal sm_irq_n : std_logic;
    signal tar_state : std_logic_vector(2 downto 0);
    -- easy user interface

    signal addr : std_logic_vector(31 downto 2);
    signal cmd : std_logic_vector(3 downto 0);
    signal cfg_wr_en : std_logic;
    signal cfg_rd_en : std_logic;

    signal b_sel : std_logic_vector(6 downto 0);

    signal b_mem_io : std_logic;
    signal b_wait : std_logic_vector(1 downto 0);
    signal b_b_wait : std_logic_vector(1 downto 0);
    signal b_linear : std_logic;
    signal b_wr_en : std_logic;
    signal b_rd_en : std_logic;
    begin
    -- component instantiation
    -- PCI target core instantiation
    CORE : pci_tcore port map (
    -- PCI BUS signals
    ad => ad,
    cbe => cbe,
    ad_o => co_ad_o,

    ad_oe => ad_oe,
    frame_n => frame_n,
    irdy_n => irdy_n,
    idsel => idsel,

    par => par,
    par_o => par_o,
    par_oe => par_oe,
    perr_n => perr_n,
    perr_o_n => perr_o_n,
    perr_oe => perr_oe,

    serr_o_n => serr_o_n,
    serr_oe => serr_oe,
    trdy_n => trdy_n,
    trdy_o_n => trdy_o_n,
    trdy_oe => trdy_oe,
    stop_n => stop_n,
    stop_o_n => stop_o_n,
    devsel_n => devsel_n,
    devsel_o_n => devsel_o_n,
    devsel_oe => devsel_oe,
    lock_n => lock_n,
    clk => clk,
    rst_n => rst_n,
    tar_state_o => tar_state,
    -- output to backend devices

    addr_o => addr,
    cmd_o => cmd,

    -- easy local interface signals connection

    cfg_wr_en => cfg_wr_en,
    cfg_rd_en => cfg_rd_en,
    b_sel => b_sel,
    b_mem_io => b_mem_io,
    b_wait => b_wait,
    b_b_wait => b_b_wait,
    b_linear => b_linear,
    b_wr_en => b_wr_en,
    b_rd_en => b_rd_en
    );
    SAMPLE : easy_sam port map (
    -- PCI slot signals

    rst_n => rst_n,
    clk => clk,

    ad => ad,
    ad_o => sm_ad_o,
    cbe => cbe,
    irq_n => sm_irq_n,
    led3 => led3,
    --
    -- easy pci core backend
    -- this signals connected to the easy sample module
    --
    addr => addr,
    cmd => cmd,
    cfg_wr_en => cfg_wr_en,
    cfg_rd_en => cfg_rd_en,
    b0_sel => b_sel(0),
    b0_mem_io => b_mem_io,
    b0_wait => b_wait,
    b0_b_wait => b_b_wait,
    b0_linear => b_linear,
    b0_wr_en => b_wr_en,
    b0_rd_en => b_rd_en,
    -- local I/O signal

    gen_out => gen_out,
    gen_in => gen_in,

    irq_1 => irq_1,
    irq_2 => irq_2
    );

    --
    ------------------- END of component instantiation
    --

    --
    -- top module I/O port connection here
    --
    --
    -- PCI target control signals
    --
    trdy_n <= trdy_o_n when trdy_oe=''1'' else ''Z'';
    stop_n <= stop_o_n when trdy_oe=''1'' else ''Z'';
    devsel_n <= devsel_o_n when devsel_oe=''1'' else ''Z'';
    -- PCI error report signals
    par <= par_o when par_oe=''1'' else ''Z'';
    perr_n <= perr_o_n when perr_oe=''1'' else ''Z'';
    serr_n <= ''0'' when serr_oe=''1'' else ''Z'';

    -- PCI BUS data signals connection
    -- global output

    ad_o <= co_ad_o or sm_ad_o;
    ad <= ad_o when ad_oe=''1'' else "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
    -- interrupt output connection, o/d signal
    inta_n <= ''0'' when sm_irq_n=''0'' else ''Z'';
    -- LED connection

    led0 <= ''0'' when not (tar_state="000") else ''1'';
    led1 <= ''1'';
    led2 <= ''1'';
    -- unused backend local device input termination
    b_sel(6 downto 1) <= "000000";
    end BEHAVIOR;
  7. nhakhanh

    nhakhanh Thành viên mới

    Tham gia ngày:
    26/02/2002
    Bài viết:
    27
    Đã được thích:
    0
    cái này cũng gần giống hôm em thưc hành ở trường.
    cũng học cái VHDL để viết chương trình nạp vào mấy con
    FPGA gì đó...nhưng mà giờ quên hết rồi
    conan0211
  8. Quen_mang_kinh

    Quen_mang_kinh Thành viên quen thuộc

    Tham gia ngày:
    23/05/2002
    Bài viết:
    542
    Đã được thích:
    1
    Bác pionez dễ nóng thế không tốt cho sức khoẻ đâu.
    Bác đã học đại học và đã làm tốt nghiệp chưa nhỉ. Làm một đề tài tốt nghiệp chỉ trong vòng 3 tháng cho nên sinh viên phải xem xét kĩ đề tài của mình để chọn vấn đề vừa mang tính mới, vừa mang tính ứng dụng nhưng lại phải giới hạn để không bị °bể sô°... Thường thì sinh viên cần có một nền tảng trước đó và xây dựng trên nền tảng đấy.
    Để thiết kế một card PCI ngoài kiến thức cơ bản về phần cứng máy tính, bạn cũng nên có kinh nghiệm tương đối về hệ thống số, nắm được các viết driver trong window - tức là cũng phải biết lập trình API trong Win trước rồi...
    Con nhiều °cơ sở hạ tầng kiến thức° khác mà mình cho là bạn đã biết rồi như kiến thức về vi xử lý, đọc tài liệu tiếng Anh, kinh nghiệm xử dụng IC và làm mạch in, Sử dụng chương trình vẽ mạch...
    Rõ ràng nếu bạn có nhiều thời gian nghiên cứu hoặc đã có kiến thức và quan trọng hơn là kinh nghiệm thiết kế ngoại vi PC thì dù có khó khăn nhưng sẽ làm được. Nhưng nếu bạn °bắt đầu từ đầu° thì rõ ràng là cần phải giới hạn đề tài của mình lại để có thể kịp tiến độ.
    Cũng có thể tại mình sống ở VN, đã từng bỏ cả ngày trời chạy khắp SG kiếm một con 74HCT mà không được nên mình bi quan chăng.
    Cảm ơn bác txnghia đã post những bài rất cơ bản về PCI.
    Bây giờ thử một vấn đề thực tế nhé. Ta lấy xung 32 MHz từ main máy tính chia 32 được 1MHz để dùng cho Vi xử lý thì dùng IC gì được nhỉ nhớ mua ở chợ Nhật tảo hoặc chợ trời nhé.
  9. Quen_mang_kinh

    Quen_mang_kinh Thành viên quen thuộc

    Tham gia ngày:
    23/05/2002
    Bài viết:
    542
    Đã được thích:
    1
    Bac Txnghia tiep tuc ke chuyen PCI nhe
  10. Pionez

    Pionez Thành viên quen thuộc

    Tham gia ngày:
    03/01/2002
    Bài viết:
    253
    Đã được thích:
    0
    Tất nhiên là mình đã tốt nghiệp đại học, tất nhiên mình cũng đã từng làm các đề tài với quy mô tương đương một đề tài tốt nghiệp, và hơi đen đủi mình đi từ con số xấp xỉ 0. Những đề tài mình làm, mình chỉ có thể dành thời gian một ngày/tuần/3 tháng. Cụ thể những gì mình làm thì nhỏ mọn lắm, chẳng bõ nói ra.
    Cái này thì đúng rồi, yên trí, khi người ta bắt đầu vào công việc người ta sẽ nhìn thấy mình sẽ làm được gì.
    32 MHz khá nhanh, tìm con IC đếm hoạt động ở 32MHz hơi khó. Tuy nhiên mình có thể dùng một phương pháp rẻ tiền mà hiệu quả : dùng vài con flip-flop để chia tần số (7474 thì phải) xuống tầm 4 MHz, sau đó xài Inter Timer 8254 (programmable) thì thích thú.
    --
    Hướng tới một cộng đồng sử dụng mã nguồn mở ở Việt Nam
    Pionez

Chia sẻ trang này