关于IO ports和IO memory

在IA32 Manuals-Basic Architecture中, 对于IO有二种寻址方式:1, IO Port(IO Address Space); 2,
Memory-Mapped IO.

        1) IO Port方式.
        使用体系结构相关的in/out指令来访问IO端口,并且能够保证每一条指令都在下一条之前完成,也就是in/out
指令是自然有序的。 一共有2^16(64K)个单独的8-bit端口,编号从0到FFFFH(其中从0F8H到0FFH被保留),任意两个连续
的8bit端口可以被看做是一个16bit端口,同样,任意4个连续的8bit端口可以被看做是一个32bit端口。

        2) IO Address Space方式.
        可以使用任意的mov、and、or等指令来访问,就象访问主存一样。

        对于Linux内核来说,若想访问io ports,需要request_region来分配io ports, 返回之后的struct resource
就包含了start和end,在此之间的区域可以用in/out指令来访问。 /proc/ioports记录了目前已分配的所有IO端口。
        对memory-mapped io来说,需要request_mem_region来分配IO内存(也就是外设的寄存器或者存储体),它也是
返回一个struct resource结构,其中有start和end字段,可以用来作为ioremap函数的参数。 对request_mem_region分配
的IO内存进行了ioremap之后,就可以在程序中象访问普通内存区那样来访问它们了。
        IO Ports和IO Momory之间的转换,可以用ioport_map/ioport_unmap来实现。

 

Quote : http://linux.chinaunix.net/bbs/viewthread.php?tid=890288&page=1#pid6311319

### Zynq 7020 IO 控制点亮LED的实现方法 在 Zynq 7020 中实现通过 IO 控制点亮 LED 的功能,可以通过硬件设计软件配置相结合的方式完成。以下是具体的方法: #### 方法一:使用 MIO (Multiplexer I/O) 控制 MIO 是一种固定的外设接口资源,可以直接映射到 PS(Processing System)中的 GPIO 外设。这种方法适用于简单的应用需求。 1. **配置 Vivado 工程** 在 Vivado 中创建一个新的工程并导入 Zynq 7020 的板级支持包(BSP)。设置 Block Design 并启用 `GPIO` 模块[^1]。 2. **分配引脚** 使用 Xilinx 提供的约束文件(XDC 文件),将目标 LED 对应的管脚绑定到指定的 MIO 引脚上。例如: ```text set_property PACKAGE_PIN T18 [get_ports {LED_0}] -iostandard LVCMOS33 ``` 3. **生成比特流文件** 完成设计后,生成比特流文件并将其实例化到 FPGA 部分。 4. **编写驱动程序** 利用 SDK 或 Vitis 编写 C/C++ 程序控制 GPIO 输出高低电平。示例代码如下: ```c #include "xgpio.h" int main() { XGpio Gpio; XGpio_Initialize(&Gpio, XPAR_AXI_GPIO_0_DEVICE_ID); XGpio_SetDataDirection(&Gpio, 1, 0); // 设置方向为输出 while (1) { XGpio_DiscreteWrite(&Gpio, 1, 0xF); // 所有 LED 点亮 usleep(500000); // 延时 500ms XGpio_DiscreteWrite(&Gpio, 1, 0x0); // 所有 LED 关闭 usleep(500000); // 延时 500ms } return 0; } ``` --- #### 方法二:使用 EMIO (External Memory Interface Output) 控制 EMIO 可以灵活地将 PL(Programmable Logic)部分的任意信号路由至外部设备,适合更复杂的逻辑设计场景。 1. **定义 RTL 模块** 创建一个 Verilog HDL 模块用于控制 LED 的开关行为。以下是一个基于计数器的设计实例[^3]: ```verilog module led_control ( input wire sys_clk, input wire reset_btn, output reg [3:0] leds ); reg [25:0] counter; always @(posedge sys_clk or posedge reset_btn) begin if (reset_btn) begin leds <= 4'b0000; // 初始化 LEDs counter <= 26'd0; // 清零计数器 end else begin if (counter >= 26'd49999999) begin leds <= ~leds; // 翻转 LED 状态 counter <= 26'd0; // 计数器清零 end else begin counter <= counter + 26'd1; // 自增计数器 end end end endmodule ``` 2. **集成模块到 Block Design** 将上述模块作为 IP Core 添加到项目中,并将其输出端口连接到实际的 LED 引脚。 3. **验证设计** 合成、实施并下载比特流文件到开发板。运行后观察 LED 是否按照预期闪烁。 --- #### 注意事项 - 当连接用户 LED 灯的 IO 电压为高时,LED 灯熄灭;当连接 IO 电压为低时,LED 灯被点亮[^2]。 - 如果需要按键复位功能,则需额外引入按键输入信号并与主控逻辑同步处理。 --- ### 结论 以上两种方式均可有效实现 Zynq 7020 开发板上的 LED 点亮操作。对于简单应用场景推荐采用 MIO 方案,而对于复杂定制化需求则更适合选用 EMIO 技术路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值