• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > FPGA:EPP(增強型并行端口)

    FPGA:EPP(增強型并行端口)

    作者: 時間:2024-01-04 來源:EEPW編譯 收藏

    使與 PC 的通信變得快速而簡單。
    在這里,我們使用Pluto-P 板與支持的PC進行通信。

    本文引用地址:http://www.czjhyjcfj.com/article/202401/454465.htm

    1 - 什么是 EPP?

    EPP 是 IEEE 1284(并行端口標準)的一部分。
    IEEE 1284 還定義了 SPP 和 ECP,但 EPP 提供了兩者的優點,即速度和簡單性。

    EPP的主要特點是:

    • 通過并行端口提供雙向通信,即對連接到 PC 并行端口的外圍設備進行讀寫的方式。

    • 事務是 8 位寬的,并且是原子的。主機 (PC) 始終是事務的發起者,讀取或寫入。

    • 沒有爆發的概念。您可以發送 1 個字節,如果需要,也可以發送 1000000 個字節,只需在 PC 上使用軟件循環即可。 您還可以按任意順序混合讀取和寫入。

    EPP 允許“地址”和“數據”交易。
    換言之,可以從 PC 發出四種類型的 EPP 交易:

    • 寫入地址

    • 讀取地址

    • 寫入數據

    • 讀取數據

    我們將把連接到EPP端口。 當 PC 執行“寫入地址”(或“寫入數據”)時,它實際上只是向 發送 8 位,并指示它是“地址”或“數據”。 FPGA可以使用“address”或“data”值做任何事情。 FPGA 可以實現一個寄存器組(有 256 個寄存器)。 或者,它可以使用“地址”來閃爍LED,并使用“數據”來發出聲音。 PC 不會知道其中的區別。

    讀取也是如此,PC可以讀取“地址”或“數據”,這實際上可能是FPGA返回的任何8位值。

    EPP 2 - 軟件

    EPP軟件支持非常簡單。 我看看。

    BIOS

    首先進入 PC 的 BIOS(通電時可訪問)并啟用 EPP(在并行端口屬性中)。

    并行端口地址

    從軟件的角度來看,EPP 事務需要 IO 讀取或寫入。

    最常見的 EPP 端口地址是 0x378。在 Window 的控制面板中找到它。

    C 函數

    首先是 EPP_init() 函數。

    #define EPP_port_addr 0x378 // your parallel port address

    void EPP_init()
    {
    IO_WRITE(EPP_port_addr+2, 0x04);
    }

    很簡單,對吧?

    實際上,如果您的編譯器不提供 IO 函數,您可能需要自己編寫 IO 函數。

    void IO_WRITE(WORD addr, BYTE data)
    {
    _asm
    {
    mov dx, addr
    mov al, data
    out dx, al
    }
    }

    BYTE IO_READ(WORD addr)
    {
    _asm
    {
    mov dx, addr
    in al, dx
    }
    }

    現在我們看到 EPP 支持四種類型的事務。讓我們為每個函數編寫一個函數。

    void EPP_write_addr(BYTE address)
    {
    IO_WRITE(EPP_port_addr+3, address);
    }

    void EPP_write_data(BYTE data)
    {
    IO_WRITE(EPP_port_addr+4, data);
    }

    BYTE EPP_read_addr()
    {
    return IO_READ(EPP_port_addr+3);
    }

    BYTE EPP_read_data()
    {
    return IO_READ(EPP_port_addr+4);
    }

    就這樣。
    EPP 硬件處理所有 EPP 協議細節,因此軟件不必執行太多操作。

    EPP 3 - 硬件協議

    下面是來自 PC 的 DB25 打印機連接器的視圖。

    引腳 2 至 9 是 8 位總線。在 EPP 模式下,8 位總線是雙向的。
    還有其他重要的引腳是:

    引 腳名字方向積極
    17地址選通PC -> FPGA地址交易
    14數據選通PC -> FPGA數據事務
    11FPGA -> PC對頻閃的響應
    1PC -> FPGA0 表示寫入事務,1 表示讀取事務

    您可以看到有 2 個“頻閃”信號和一個“等待”信號。 “閃光燈”來自 PC,而“等待”來自 PC。

    其工作原理如下:對于每筆交易,PC 都會斷言其中一個選通,FPGA 會以等待來響應。
    讓我們選擇一個頻閃信號(一次只激活一個),讓我們看一個 EPP 事務:

    解釋:

    1. 電腦想要啟動事務。它斷言其中一個頻閃 (=low)。
      如果事務是寫,則 PC 也會將“寫”驅動為低電平,并驅動 8 位總線。否則,它將“寫”驅動為高電平,并使 8 位總線懸空。

    2. FPGA 檢測到其中一個選通被置位,并通過取消置位“等待”(=高電平)進行響應。
      如果事務是讀取,則 FPGA 開始驅動 8 位總線。

    3. PC 檢測到等待已取消置位,因此它會取消置位選通。
      如果事務是寫入,則 PC 將停止驅動 8 位總線。

    4. FPGA 檢測到選通已取消置位,因此它斷言“等待”。
      如果事務是讀取,則FPGA停止驅動8位總線。

    所有這些都是在硬件中完成的;除了啟動交易之外,PC 軟件無需執行任何操作。

    EPP 4 - HDL

    讓我們看看在 FPGA 中實現 EPP 端口是多么容易。

    首先,讓我們從并行端口信號創建一些信號。 我們反轉一些信號,使所有新信號都處于高電平有效狀態。

    // Let's create a few signals from the "PP" parallel port pins
    // first for the EPP outputs (i.e. outputs from the PC, inputs for us)
    wire EPP_write = ~PP[1];wire EPP_addr_strobe = ~PP[17];
    wire EPP_data_strobe = ~PP[14];
    wire [7:0] EPP_datain = PP[9:2];
    // now for the EPP inputs
    wire EPP_wait;
    assign PP[11] = EPP_wait;
    wire [7:0] EPP_dataout;
    assign PP[9:2] = EPP_dataout;

    現在,大多數FPGA設計都使用自己的時鐘。 讓我們將時鐘稱為“clk”,并將頻閃信號與時鐘同步。

    // Use a 3-taps shift register to synchronize EPP_strobe to our clock
    wire EPP_strobe = EPP_data_strobe | EPP_addr_strobe;  // only one is active at a time
    reg [2:0] EPP_strobe_reg;
    always @(posedge clk) EPP_strobe_reg <= {EPP_strobe_reg[1:0], EPP_strobe};

    // detect the strobe edges
    wire EPP_strobe_edge1 = (EPP_strobe_reg[2:1]==2'b01);
    wire EPP_strobe_edge2 = (EPP_strobe_reg[2:1]==2'b10);

    // respond right away to a transaction
    assign EPP_wait = EPP_strobe_reg[1];

    現在我們可以處理 EPP 寫入了。讓我們將接收到的值存儲到寄存器中。

    // EPP writes
    reg [7:0] addr_reg, data_reg;
    always @(posedge clk) if(EPP_strobe_edge1 & EPP_write & EPP_addr_strobe) addr_reg <= EPP_datain;
    always @(posedge clk) if(EPP_strobe_edge1 & EPP_write & EPP_data_strobe) data_reg <= EPP_datain;

    EPP 現在閱讀。讓我們回讀寄存器中存儲的內容......

    // EPP reads
    wire EPP_read = ~EPP_write;
    wire [7:0] EPP_data_mux = EPP_addr_strobe ? addr_reg : data_reg;
    assign EPP_dataout = (EPP_read & EPP_wait) ? EPP_data_mux : 8'hZZ;

    就是這樣。
    祝賀!您現在可以使用 EPP 讀取和寫入 FPGA。

    接下來要嘗試什么?

    • 延遲EPP_wait信號(如果使用長并行電纜,信號的穩定速度可能會很慢,因此可能需要延遲)。

    • 使用自動遞增地址計數器創建寄存器庫。

    輪到你來實驗了!



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 红桥区| 仙居县| 五常市| 偃师市| 板桥市| 财经| 宜良县| 中江县| 克什克腾旗| 沛县| 都江堰市| 始兴县| 马边| 广南县| 左贡县| 泸定县| 冷水江市| 峨山| 通化县| 阿克| 通山县| 佛坪县| 长宁区| 论坛| 临泉县| 沙坪坝区| 德安县| 宕昌县| 印江| 江孜县| 察雅县| 盐亭县| 华安县| 防城港市| 余江县| 喜德县| 抚远县| 改则县| 天祝| 永吉县| 青浦区|