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

发布时间:2024-01-04  

使与 PC 的通信变得快速而简单。
在这里,我们使用Pluto-P 板与支持的PC进行通信。

本文引用地址:

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 数据事务
11 FPGA -> PC 对频闪的响应
1 PC -> FPGA 0 表示写入事务,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信号(如果使用长并行电缆,信号的稳定速度可能会很慢,因此可能需要延迟)。

  • 使用自动递增地址计数器创建寄存器库。

轮到你来实验了!

文章来源于:电子产品世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>