PCI9054入门1:硬件引脚定义、时序、FPGA端驱动源码

news2025/4/17 14:24:39

文章目录

  • 1:PCI9054的FPGA侧(local侧引脚定义)
  • 2:PCI9054的C模式下的读写时序
  • 3:FPGA代码部分
    • 具体代码:

1:PCI9054的FPGA侧(local侧引脚定义)

而PCI9054的本地总线端的主要管脚信号定义如下表所示。这些管脚是连接到本地逻辑控制电路部分的,并由本地逻辑控制电路部分实现接口时序控制。

本组信号引脚主要用于PCI9054与Local端的连接,主要信号包括LA[31:2]、LD[3 1:0]、LHOLD、LHOLDA、ADS#、LCLK、LBE[3:0]#、LW/R#、READY#、WAIT#、BLAST#等。

CCS#:配置寄存器片选。低电平有效时,选中的是PCI9054的内部寄存器,Local端可以通过此方法配置寄存器。

LCLK: Local端的时钟输入,是Local端处理器与PCI9054之间的同步信号,如果没有此信号,PCI插卡将不能启动。

LINT#:本地中断信号。作为输入时可以引起PCI 中断,作为输出时,可以通过改写中断寄存器INTCSR的内容来改变中断状态。

LRESETo#: Local端复位信号。当PC19054复位(RST#有效)时此信号有效,可以用来复位本地处理器。

LA[31:2]:本地地址信号。代表物理地址的高30Bit,突发传输时可以自动增加表明一个连续的数据周期。

LW/R#:Local端的读写复用信号,低电平为读,高电平为写。

READY#:输入/输出准备好信号,表示总线上数据有效或写数据完成,用以连接PCI9054等待状态产生器。

ADS#:地址有效信号。表明LA[31:2]上的地址有效以及一个新的总线交易的开始,在第一个时钟周期内有效。

BLAST#:突发结束。表明总线访问的最后一次传送,由本地总线主设备驱动。

BTERM#:突发中止。用于中止一个突发传输并启动一个新的总线交易。

MODE[1:0]:总线工作模式选择。

<

2:PCI9054的C模式下的读写时序

MODE[1:0]都接地为0,设为C模式。

C模式是一种类似于单片机的工作方式。在这种模式下,PCI9054通过片内逻辑控制,将PCI的地址线和数据线分开,很方便的为本地工作时序提供各种工作方式,设计者只要严格控制Local端和PCI端的各种时序控制线,就可以很好的应用PCI9054芯片。C模式下可以进行配置寄存器、主模式、从模式及 DMA模式等操作。

<
PCI 写发起时序
<
PCI 读发起时序

3:FPGA代码部分

通过parameter来定义各个不同状态的参数。每一个状态的位宽为7位,接下来还需要定义两个7位的寄存器,一个用来表示当前状态,另一个用来表示下一个状态,如下所示:

这段Verilog代码是一个PCI Local Bus接口的模块定义。该模块用于连接PCI 9054芯片与其他组件之间的通信,通过一系列输入和输出信号来实现数据的读写和控制。以下是该代码的一些重要部分解释:

参数部分

序号代号含义
1parameter integer REG_ADDR_WIDTH = 8:定义了寄存器地址的位宽,默认为8位
2parameter integer REG_DATA_WIDTH = 32:定义了寄存器数据的位宽,默认为32位

信号部分

序号代号含义
1输入信号 clk全局系统时钟
2输入信号 areset_n来自PCI 9054的全局复位信号,低电平有效
3输入信号 i_hold本地总线接口的保持信号
4输出信号 o_holda经过逻辑处理后的保持信号
5输入信号 ads_nPCI总线地址有效信号,低电平有效
6输入信号 blast_nPCI总线传输结束信号,低电平有效
7输出信号 o_ready_n: 就绪信号在特定状态下为低电平,表示数据传输准备就绪
8输入信号 lw_rn读写控制信号,高电平表示写操作,低电平表示读操作。
9输入信号 la地址信号
10输入信号 i_ld输入的数据
11输出信号 ld_oen数据输出使能信号
12输出信号 o_ld输出的数据

接下来的代码部分描述了一个状态机,用于管理数据传输过程。不同的状态表示不同的传输阶段,如IDLE、TRANSFER、SINGLE_WAIT和SINGLE_END。

代码中使用的触发器和逻辑门用于控制状态转移和输出信号的生成,以实现稳定的数据传输和寄存器读写操作。

这段代码实现了一个复杂的功能模块,将PCI总线和本地总线之间的数据传输和控制进行了逻辑化和管理,从而实现了稳定的数据交换。

具体代码:




module pci_local_bus #(
    parameter integer REG_ADDR_WIDTH = 8,
    parameter integer REG_DATA_WIDTH = 32
)(
    // global system clock, fixed single-ended 40MHz
    input wire                          clk         ,
    // Global Reset from PCI 9054
    input wire                          areset_n    ,
    // Local Bus Interface
    input wire                          i_hold      ,
    output reg                          o_holda     ,
    input wire                          ads_n       ,
    input wire                          blast_n     ,
	output wire                         o_ready_n	,
    input wire                          lw_rn       ,
    input wire [18:2]                   la          ,
    input wire [REG_DATA_WIDTH-1:0]     i_ld        ,
    output wire                         ld_oen      ,
    output wire [REG_DATA_WIDTH-1:0]    o_ld        ,
    // Register R/W interface
    output wire                         wen         ,
    output wire [REG_ADDR_WIDTH-1:0]    waddr       ,
    output wire [REG_DATA_WIDTH-1:0]    wdata       ,
    output wire                         ren         ,
    output wire [REG_ADDR_WIDTH-1:0]    raddr       ,
    input wire [REG_DATA_WIDTH-1:0]     rdata
);
/*---------------------------------------------------------------------------------------*/
// generate ready state-machine
reg[3:0] current_state, next_state;	

parameter [3:0] SM_IDLE			    = 4'b0001;
parameter [3:0] SM_TRANSFER		    = 4'b0010;
parameter [3:0] SM_SINGLE_WAIT	    = 4'b0100;
parameter [3:0] SM_SINGLE_END		= 4'b1000;

// synchronous logic
always@(posedge clk or negedge areset_n)
begin
	if(~areset_n)
		current_state <= SM_IDLE;
	else
		current_state <= next_state;
end

// combinational logic
always@(*)
case(current_state)
	SM_IDLE:
		if(~ads_n)
			next_state = SM_TRANSFER;
		else
			next_state = SM_IDLE;
	SM_TRANSFER:
		if(~blast_n)
			next_state = SM_SINGLE_WAIT;
		else
			next_state = SM_TRANSFER;
	SM_SINGLE_WAIT:
		next_state = SM_SINGLE_END;
	SM_SINGLE_END:
		if(ads_n && blast_n)
			next_state = SM_IDLE;
		else if(~ads_n)
			next_state = SM_TRANSFER;
		else
			next_state = SM_SINGLE_END;
	default:
		next_state = SM_IDLE;
endcase

// output logic
assign o_ready_n = (current_state == SM_SINGLE_WAIT)?1'b0 : 1'b1;

/*---------------------------------------------------------------------------------------*/
// asserts acknowledge reponsing to HOLD
always@(posedge clk or negedge areset_n)
if(~areset_n)   o_holda  <= 0;
else            o_holda  <= i_hold;
/*---------------------------------------------------------------------------------------*/
// internal register write/read logic

assign wen      = (~o_ready_n & lw_rn)?1'b1 : 1'b0;
assign waddr	= (~o_ready_n & lw_rn)?la[2+REG_ADDR_WIDTH-1:2] : {REG_ADDR_WIDTH{1'b0}};
assign wdata	= (~o_ready_n & lw_rn)?i_ld : {REG_DATA_WIDTH{1'b0}};

assign ren      = (~o_ready_n & ~lw_rn)?1'b1 : 1'b0;
assign raddr	= (~o_ready_n & ~lw_rn)?la[2+REG_ADDR_WIDTH-1:2] : {REG_DATA_WIDTH{1'b0}};

/*---------------------------------------------------------------------------------------*/
// tri-state control
assign ld_oen	= ~ren;
assign o_ld		= rdata;

endmodule



思久欲知 , 知繁渴思 , 唯圣祂奇 , 毋为所困 思久欲知,知繁渴思,唯圣祂奇,毋为所困 思久欲知,知繁渴思,唯圣祂奇,毋为所困





$$
思久欲知,知繁渴思,唯圣祂奇,毋为所困
$$

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/914625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Googlenet深度学习网络的交通工具种类识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ....................................................................................% 获…

PHP反序列化 字符串逃逸

前言 最近在打西电的新生赛&#xff0c;有道反序列化的题卡了很久&#xff0c;今天在NSS上刷题的时候突然想到做法&#xff0c;就是利用字符串逃逸去改变题目锁死的值&#xff0c;从而实现绕过 为了研究反序列化的字符串逃逸 我们先简单的测试下 原理 <?php class escape…

大数据——一文熟悉HBase

1、HBase是什么 HBase是基于HDFS的数据存储&#xff0c;它建立在HDFS文件系统上面&#xff0c;利用了HDFS的容错能力&#xff0c;内部还有哈希表并利用索引&#xff0c;可以快速对HDFS上的数据进行随时读写功能。 Hadoop在已经有一个HiveMapReduce结构的数据读写功能&#x…

Apollo自动驾驶:引领未来的智能出行

自动驾驶技术正日益成为当今科技领域的焦点&#xff0c;它代表着未来出行的一大趋势&#xff0c;而Baidu公司推出的Apollo自动驾驶平台则在这一领域中展现出强大的领导地位。本文将深入探讨Apollo自动驾驶技术的关键特点、挑战以及它对未来智能出行的影响。 Apollo自动驾驶平台…

QT基础教程之二 第一个Qt小程序

QT基础教程之二 第一个Qt小程序 按钮的创建 在Qt程序中&#xff0c;最常用的控件之一就是按钮了&#xff0c;首先我们来看下如何创建一个按钮 QPushButton * btn new QPushButton; 头文件 #include <QPushButton>//设置父亲btn->setParent(this);//设置文字btn-&g…

C++进阶 多线程相关

本篇博客介绍&#xff1a; 主要介绍C中的一些线程操作以及线程库 C进阶 多线程相关 为什么要有线程库线程库介绍线程库常见的接口构造线程对象获取线程idjoin和deteach mutex库原子操作相关条件变量库总结 为什么要有线程库 我们在Linux中写多线程的时候使用的是Linux下提供的…

Windows使用MobaXterm远程访问ubuntu20.04桌面

参考ubuntu 2020.4 安装vnc 一、脚本文件 remote_setup.sh脚本文件内容&#xff1a; #! /bin/bash #参考链接&#xff1a;https://blog.csdn.net/hailangdeyingzi/article/details/124507304 sudo apt update sudo apt install x11vnc -y sudo x11vnc -storepasswd telpo.12…

【论文阅读】POIROT:关联攻击行为与内核审计记录以寻找网络威胁(CCS-2019)

POIROT: Aligning Attack Behavior with Kernel Audit Records for Cyber Threat Hunting CCS-2019 伊利诺伊大学芝加哥分校、密歇根大学迪尔伯恩分校 Milajerdi S M, Eshete B, Gjomemo R, et al. Poirot: Aligning attack behavior with kernel audit records for cyber thre…

Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座

摘要&#xff1a;本文整理自阿里云开源大数据表存储团队负责人&#xff0c;阿里巴巴高级技术专家李劲松&#xff08;之信&#xff09;&#xff0c;在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分&#xff1a; 流计算邂逅数据湖 Paimon CDC 实时入湖 Paimon 不止…

关于打包多模块SpringBoot项目并通过宝塔上传服务器

打包 —— 如何打包多模块项目&#xff0c;参考b站up主&#xff1a;[喜欢编程的代先生] 的视频 总结&#xff1a;1. 对着视频里看一下父模块和各个子模块pom.xml文件关于打包工具的依赖是否正确。2. 从最底层开始打包&#xff0c;逐层向上&#xff0c;最后再合并打包。 部署 …

网络安全(大厂)面试题

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

采购合同有哪些类型?应注意哪些内容?

采购合同为建立和管理客户与供应商的关系奠定了基础。在合同中&#xff0c;卖方同意向买方提供符合特定规格的用品&#xff0c;或承担买方的项目&#xff0c;并提供一个确定的价格&#xff08;通常有批量折扣&#xff09;。 作为回报&#xff0c;买方同意接收并支付一定数量的…

在ubuntu上部署label-studio

1. 安装label-studio 由于服务器的默认python3版本太低&#xff0c;尝试了很多方法&#xff0c;没有升级。因此采用annaconda方式安装label-studio. a.安装anaconda: 参照如下链接&#xff0c;安装anaconda。 Ubuntu安装Anaconda详细步骤&#xff08;Ubuntu22.04.1&#xff…

sql developer 连不上oracle数据库 报错 ORA-01031: insufficient privileges

sql developer 连不上oracle数据库 报错 ORA-01031: insufficient privileges 1、问题描述2、问题原因3、解决方法4、sql developer 连接oracle 成功 1、问题描述 使用sys账户以SYSDBA角色登录失败 报错 ORA-01031: insufficient privileges 2、问题原因 因为没有给sys账户分…

如何用Dockerfile部署LAMP架构

目录 构建LAMP镜像&#xff08;Dockerfile&#xff09; 第一步 创建工作目录 第二步 编写dockerfile文件 Dockerfile文件配置内容 第三步 编写网页执行文件 第四步 编写启动脚本 第五步 赋权并且构建镜像 第六步 检查镜像 第七步 创建容器 第八步 浏览器测试 构建LA…

Vue Cli 脚手架安装

Vue Cli 脚手架安装 首先&#xff0c;改一下仓库地址&#xff0c;使用下面的命令cnpm淘宝镜像加速 npm install cnpm -g --registryhttps://registry.npm.taobao.org下载安装 vue 脚手架 npm install -g vue/cli查看 vue cli 脚手架是否安装成功&#xff0c;如果输入命令出现…

服务机器人,正走向星辰大海

大数据产业创新服务媒体 ——聚焦数据 改变商业 国内机器人联盟&#xff08;IFR&#xff09;将机器人划分为工作机器人、服务机器人、特种机器人三类。服务机器人广泛应用于餐饮场景、酒店场景&#xff0c;早已构成一道靓丽的风景。行业数据显示&#xff0c; 作为服务机器人发…

想解锁禁用的iPhone?除了可以使用电脑之外,这里还有不需要电脑的方法!

多次输入错误的密码后,iPhone将显示“iPhone已禁用”。这种情况看起来很棘手,因为你现在不能用iPhone做任何事情。对于这种情况,我们提供了几种有效的方法来帮助你在最棘手的问题中解锁禁用的iPhone。你可以选择使用或不使用电脑来解锁禁用的iPhone。 一、为什么你的iPhone…

字节码调教的入口 —— JVM 的寄生插件 javaagent 那些事

Java Instrumentation 包 Java Instrumentation 概述 Java Instrumentation 这个技术看起来非常神秘&#xff0c;很少有书会详细介绍。但是有很多工具是基于 Instrumentation 来实现的&#xff1a; APM 产品: pinpoint、skywalking、newrelic、听云的 APM 产品等都基于 Instru…

【C++习题集】-- day6(习题)

目录 选择题 编程题 36932-求最小公倍数⭐ 【解题思路】 选择题 1. 执行下面语句后的输出为 ( ) int I1; if(I<0)printf("****\n") ; elseprintf("%%%%\n"); A、%% B、**** C、有语法错&#xff0c;不能正确执行 D、%%%% 正确答案&#xff1a;A …