全套资源下载地址:https://download.csdn.net/download/sheziqiong/86773461
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86773461
目 录
1 绪论 1
1.1课题研究的目的与意义 1
1.2 PCI发展的历史及现状[2] 2
2 FPGA技术概述 6
2.1 FPGA简介 6
2.2 FPGA设计流程 6
2.3 VHDL测试平台简介 9
3 PCI接口模块 12
3.1 PCI设备的配置空间 13
3.1.1 配置空间的组织 14
3.1.2 配置空间的寄存器 15
3.2 内部寄存器组 16
3.2.1状态与控制寄存器 18
3.3 地址译码模块: 20
3.4 奇偶校验 21
3.5设计的仿真验证介绍 22
4 PCI接口的简化设计 23
4.1 PCI信号定义 23
4.2 PCI配置空间的实现 24
4.3 配置空间读写操作仿真 25
4.4 从模式下的目标状态机设计 26
4.5 存储器单周期读写操作仿真 27
4.6 PCI系统的仿真 28
5 总结 30
参考文献 31
致谢 32

课题的研究内容
本论文主要研究内容与具体工作如下:
学习PCI 协议、FPGA设计的基本流程和方法。在深刻理解PCI 协议的基础上,研究PCI IP Core的各个功能及实现方法,采用状态机技术协调各个功能模块的工作和实现PCI 复杂的时序信号。目标是用VHDL语言完成PCI的部分接口模块设计。
本论文是按照PCI 从接口IP核的设计与实现过程来安排的,论文重点在PCI 从接口IP核的功能模块设计、实现及验证上。
第一章绪论,介绍了课题的背景和PCI发展的历史及现状。
第二章FPGA技术,介绍了FPGA的概念、设计流程。
第三章PCI 技术研究,介绍了计算机 技术的发展和PCI 统结构、PCI 信号、传输特点以及 具体的操作过程等。
第四章是PCI 的接口模块,具体介绍了PCI设备的配置空间和内部寄存器组。
第五章PCI 简化接口设计,主要介绍了设计思路、 的结构划分,详细分析了配置空间模块和状态机模块的具体设计和仿真验证。
第六章为总结。

(2)功能仿真
电路设计完成后,要用专用的仿真工具对设计进行功能仿真,验证电路功能是否符合设计要求。功能仿真有时也被称为前仿真。常用的仿真工具有Model Tech公司的Mode1Sim、Synopsys公司的VCS、Cadence公司的NC-Verilog和NC-VHDL、Aldec公司的Active HDL VHDL/Verilog HDL等。通过仿真能及时发现设计中的错误,加快设计进度,提高设计的可靠性。
(3)综合优化
综合优化(Synthesize)是指将HDL语言、原理图等设计输入翻译成由与、或、非门,RAM,触发器等基本逻辑单元组成的逻辑连接(网表),并根据目标与要求(约束条件)优化所生成的逻辑连接,输出EDF和EDN等标准格式的网表文件,供FPGA/CPLD厂家的布局布线器进行实现。
(4)综合后仿真
综合完成后需要检查综合结果是否与原设计一致,做综合后仿真。在仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响。综合后仿真虽然比功能仿真精确一些,但是只能估计门延时,不能估计线延时,仿真结果与布线后的实际情况还有一定的差距,并不十分准确。这种仿真的主要目的在于检查综合器的综合结果是否与设计输入一致。
(5)实现与布局布线
综合结果的本质是一些由与、或、非门,触发器,RAM等基本逻辑单元组成的逻辑网表,它与芯片实际的配置情况还有较大差距。此时应该使用FPGA/CPLD厂商提供的软件工具,根据所选芯片的型号,将综合输出的逻辑网表适配到具体FPGA/CPLD器件上,这个过程就叫做实现过程[5]。因为只有器件开发商最了解器件的内部结构,所以实现步骤必须选用器件开发商提供的工具。在实现过程中最主要的过程是布局布线。所谓布局(Play)是指将逻辑网表中的硬件原语或者底层单元合理地适配到FPGA内部的固有硬件结构上,布局的优劣对设计的最终实现结果(在速度和面积两个方面)影响很大;所谓布线(Route)是指根据布局的拓扑结构,利用FPGA内部的各种连线资源,合理正确连接各个元件的过程。FPGA的结构相对复杂,为了获得更好的实现结果,特别是能够满足设计的时序条件,一般采用时序驱动的引擎进行布局布线。
(6)时序仿真与验证
将布局布线的时延信息反标注到设计网表中,所进行的仿真就叫时序仿真或布线后仿真,简称后仿真。布局布线之后生成的仿真时延文件包含的时延信全,不仅包含门延时,还包含实际布线延时,所以布线后仿真最准确,能较反映芯片的实际工作情况。一般来说,布线后仿真步骤必须进行,本文转载自http://www.biyezuopin.vip/onews.asp?id=14941通过布局后仿真能检查设计时序与FPGA实际运行情况是否一致,确保设计的可靠性定性。布局布线后仿真的主要目的在于发现时序违规(Timing violation),满足时序约束条件或者器件固有时序规则(建立时间、保持时间等)的情况。
(7)板级仿真与验证
在有些高速设计情况下还需要使用第三方的板级验证工具进行仿真与验证。
(8)调试与加载配置
设计开发的最后步骤就是在线调试或者将生成的配置文件写入芯片中进行测试。示波器和逻辑分析仪(LA,Logic Analyzer)是逻辑设计的主要调试工具。
任何仿真或验证步骤出现问题,都需要根据错误的定位返回到相应的步骤更改或者重新设计。

// --------------------------------------------------------------------
// read_config tasktask read_config;                input   [31:0] address;
input   error_check_en;  // a 1 enables error checking
input   [31:0]  expected_data; // data that should be read back.begin$display($time,"  %m  \t \t  << Reading Config Reg Address = %h >>",address);@(posedge pci_clk);                 // address phaseframe_reg   <= 0;frame_oe    <= 1;irdy_reg    <= 1;irdy_oe     <= 1;pci_add_reg <= address;pci_add_oe  <= 1;pci_cbe_reg <= 4'b1010 ;         // read config commandpci_cbe_oe  <= 1;idsel_reg   <= 1;@(posedge pci_clk);                 // data phase  frame_reg   <= 1;frame_oe    <= 1;irdy_reg    <= 0;irdy_oe     <= 1;pci_cbe_reg <= 4'b0000;          // byte enablespci_cbe_oe  <= 1;idsel_reg   <= 0;pci_add_oe  <= 0;pci_par_oe  <= 1;check_cycle(0, cycle_stat, data_return);      // check cycle terminationif (error_check_en ) begin check_data(expected_data,data_return);endirdy_reg    <= 1;frame_oe    <= 0;irdy_oe     <= 1;pci_add_oe  <= 0;pci_cbe_oe  <= 0;@(posedge pci_clk);                 // end of cycle  check_parity;$display($time,"  %m  \t \t  << Status = %b >>",cycle_stat);frame_oe    <= 0;irdy_oe     <= 0;pci_par_oe  <= 0;kill_time;endendtask // of read_config;// --------------------------------------------------------------------
// write_config tasktask write_config;input [31:0] address;input [31:0] data;begin$display($time,"  %m  \t \t  << Writing Config Reg Address = %h >>",address);@(posedge pci_clk);                 // address phaseframe_reg   <= 0;frame_oe    <= 1;irdy_reg    <= 1;irdy_oe     <= 1;pci_add_reg <= address;pci_add_oe  <= 1;pci_cbe_reg <= 4'b1011;          // write config commandpci_cbe_oe  <= 1; idsel_reg   <= 1;@(posedge pci_clk);                 // data phaseframe_reg   <= 1;frame_oe    <= 1;irdy_reg    <= 0;irdy_oe     <= 1;pci_add_reg <= data;pci_add_oe  <= 1;pci_cbe_reg <= 4'b0000;          // byte enablespci_cbe_oe  <= 1;idsel_reg   <= 0;pci_par_oe  <= 1;check_cycle(1, cycle_stat, data_return);      // check cycle terminationirdy_reg    <= 1;frame_oe    <= 0;irdy_oe     <= 1;pci_add_oe  <= 0;pci_cbe_oe  <= 0;pci_par_oe  <= 1;@(posedge pci_clk);                 // end of cycle    $display($time,"  %m  \t \t  << Status = %b >>",cycle_stat);frame_oe    <= 0;irdy_oe     <= 0;pci_par_oe  <= 0;kill_time;endendtask// --------------------------------------------------------------------
// read_cycle tasktask read_cycle;input [31:0]  address;input   error_check_en;  // a 1 enables error checkinginput wait_en; // a 1 enable wait state insertion of long burstsinput   [31:0]  expected_data; // data that should be read back.input   mode;               // burst/no burstinput [3:0]    brst_size;input [2:0] type_signal; // transactin type io or memoryinteger   i;reg [3:0] type;
begin$display($time,"  %m  \t \t  << Reading Address = %h >>",address);stop_flag = 0;abort_flag = 0;type = type_signal;@(posedge pci_clk);      frame_reg   <= 0;frame_oe    <= 1;irdy_reg    <= 1;irdy_oe     <= 1;pci_add_reg <= address;pci_add_oe  <= 1;pci_cbe_reg <= {type,1'b0};pci_cbe_oe  <= 1;@(posedge pci_clk);if (mode  == `no_brst) frame_reg <= 1;irdy_reg    <= 0;pci_cbe_reg <= 4'b0000;frame_oe    <= 1;irdy_oe     <= 1;pci_add_oe  <= 0;pci_cbe_oe  <= 1;pci_par_oe  <= 1; check_cycle(0, cycle_stat, data_return); if (error_check_en ) begin check_data(expected_data,data_return);endif (mode == `brst && (cycle_stat == `data_tran || cycle_stat == `data_stop))begini = brst_size;while (i)begin if (stop_flag == 1 || abort_flag == 1) begin i = 1;endif (wait_en && i > 5 && i < 7 ) begin $display($time,"  %m  Master initiating a wait state on read cycle..." );irdy_reg = 1;@(posedge pci_clk);irdy_reg <= 0;endif (i == 1)frame_reg <= 1;@(posedge pci_clk);pci_par_oe <= 0;if (error_check_en) begin expected_data = expected_data + 1;endcheck_cycle(0,cycle_stat, data_return);check_parity;if (error_check_en && cycle_stat != `retry_stop) begin check_data(expected_data,data_return);end i = i-1;   endendirdy_reg    <= 1;frame_oe    <= 0;irdy_oe     <= 1;pci_add_oe  <= 0;pci_cbe_oe  <= 0;pci_par_oe  <= 0;@(posedge pci_clk);check_parity;$display($time,"  %m  \t \t  << Status = %b >>",cycle_stat);frame_oe    <= 0;irdy_oe     <= 0;pci_par_oe  <= 0;kill_time;endendtask //of read_cycle;// --------------------------------------------------------------------
// write_cycle tasktask write_cycle;input [31:0]  address; input [31:0]  data;  input wait_en; // a one causes a wait stateinput         mode;  // burst or no burstinput [3:0] brst_size; // size of burstinput [2:0] type; // memory or io tran    integer    i; begin$display($time,"  %m  \t \t  << Writing Address = %h >>",address);stop_flag = 0;abort_flag = 0;@(posedge pci_clk);frame_reg   <= 0;frame_oe    <= 1;irdy_reg    <= 1;irdy_oe     <= 1;pci_add_reg <= address;pci_add_oe  <= 1;pci_cbe_reg <= {type,1'b1};pci_cbe_oe  <= 1;@(posedge pci_clk);if (mode == `no_brst)frame_reg <= 1;irdy_reg    <= 0;pci_add_reg <= data;pci_cbe_reg <= 4'b0000;          frame_oe    <= 1;irdy_oe     <= 1;pci_add_oe  <= 1;pci_cbe_oe  <= 1;pci_par_oe  <= 1;check_cycle(1, cycle_stat, data_return);      if ((mode == `brst)  && (cycle_stat == `data_tran || cycle_stat == `data_stop))begin i = brst_size;while (i) begin pci_add_reg <= pci_add_reg + 1;if (stop_flag == 1 || abort_flag == 1) begin i = 1;endif (wait_en && i > 5 && i < 7 ) begin $display($time,"  %m  Master initiating a wait state on a write cycle..." );irdy_reg = 1;@(posedge pci_clk);irdy_reg <= 0;endif (i == 1) frame_reg <= 1;@(posedge pci_clk);check_cycle(1,cycle_stat, data_return);i = i-1;endendirdy_reg   <= 1;frame_oe   <= 0;irdy_oe    <= 1;pci_add_oe <= 0;pci_cbe_oe <= 0;pci_par_oe <= 1;@(posedge pci_clk);      $display($time,"  %m  \t \t  <<  Status = %b >>",cycle_stat);frame_oe <= 0;irdy_oe <= 0;pci_par_oe <= 0;kill_time;endendtask // of write_cycle;









全套资源下载地址:https://download.csdn.net/download/sheziqiong/86773461
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86773461

基于FPGA的PCI接口电路设计相关推荐

  1. 基于FPGA的PCI接口设计

    1 PCI总线及其接口概述 PCI总线是高速同步总线,具有32bit总线宽度,工作频率是33MHz,最大传输率为132Mbyte/s,远远大于ISA总线5Mbyte/s的速率.PICMG(PCI工业计 ...

  2. 源码系列:基于FPGA的PS2通信电路设计(附源码)

    今天给大侠带来基于FPGA的PS2通信电路设计,附源码,获取源码,请在"FPGA技术江湖"公众号内回复"PS2源码",可获取源码文件.话不多说,上货. 设计背景 ...

  3. 基于FPGA的USB接口控制器设计(VHDL)(中)

    今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第二篇,中篇,USB通信原理.USB 系统开发以及设计实例.话不多说,上货. 之前有关于 Veril ...

  4. 基于FPGA实现SPI接口(配置或通信)

    基于FPGA实现SPI接口(配置或通信总线) 1)总线简介 串行外设接口(SPI)是微控制器(FPGA)和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.主要用于 ...

  5. 基于FPGA实现IIC接口(EEPROM)

    1 IIC应用领域 在嵌入式系统开发过程中,IIC占据非常重要的地位.IIC通讯接口能到搭载较多的从设备,从而实现与多个从设备进行通讯,在板级通讯中是一种比较常用的通讯接口.笔者通过IIC接口实现FP ...

  6. 基于FPGA实现DAC8811接口(正弦波)

    1 应用领域 基于FPGA实现DAC8811接口参考设计较少,网络资源都是基于单片机实现DAC8811接口控制,但是在特殊场合必须要使用FPGA实现:因为FPGA不仅具有容量大,逻辑功能强的特点,而且 ...

  7. 基于FPGA的VGA接口设计(三)

    关于VGA系列文章的所有链接: 基于FPGA的VGA接口设计(一) 基于FPGA的VGA接口设计(二) 基于FPGA的VGA接口设计(三) 结篇   在之前的文章中介绍了有关VGA的扫描方式.行场同步 ...

  8. 基于FPGA的SSI接口协议实现

    基于FPGA的SSI接口协议实现 SSI 是一种主机和从机点对点的通信接口,其中从机可以是具有 SSI 协议的各种传感器,例如磁致伸缩位移传感器.编码器等. SSI协议采用主机主动式读取方式,从机根据 ...

  9. 基于FPGA的USB接口控制器设计(VHDL)(上)

    今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第一篇,上篇,USB 接口简介 以及 USB 体系结构.话不多说,上货. 之前有关于 Verilio ...

最新文章

  1. 2246xt u盘开卡详细教程_U盘制作PE及系统安装详细教程!
  2. 在python中 函数赋值给变量时,需要注意的几个事项
  3. TCP客户端服务端编程模型
  4. mysql chartset utf 8_[数据库]MySQL chartset_星空网
  5. 关于session丢失原因的分析
  6. C语言高级编程:char、signed char 和 unsigned char的使用区别
  7. linux-安装-MySQL
  8. LeetCode-69 x的平方根
  9. angular 居中_Angular Material design设计
  10. linux 复制文件时,报cp: omitting directory `XXX'
  11. websocket 压测工具 有哪些_性能测试总结(概念amp;流程amp;工具)
  12. 微信小程序css方式animation动画弹幕实现
  13. 联想笔记本腾讯会议摄像头灰屏或黑屏问题解决
  14. git 查询提交明细_git log 查看提交记录
  15. 工业相机和普通相机的区别
  16. linux apache找不到woff2,IIS Web部署: svg/woff/woff2字体找不到
  17. 高级计算机网络(习题一加解析)
  18. 小步快跑,快速迭代:安全运营的器术法道
  19. 如何使用阿里云服务器快速搭建个人网站?
  20. 天龙八部本服务器的注册码,天龙八部服务端配置! - 网游单机讨论 - 藏宝湾网游单机站 - Powered by Discuz!...

热门文章

  1. php声明一个抽象类,如何在PHP中的非抽象类中声明抽象方法?
  2. 15个 Cocos Creator 技术解决方案免费开源!更多资源持续更新中…
  3. 买房你不知道的那些 “潜规则”
  4. 常见鸟的种类及特点_鸟的种类及图片(看图识鸟)
  5. Unity3d和3dMax美工部分总结
  6. openGL API glVertexAttribPointer详解
  7. Python用turtle库绘制图形——漂亮的玫瑰
  8. html中的if函数,if什么意思_if函数中的,,是什么意思
  9. 游戏修改器制作教程⑨:修改D3D渲染
  10. 数据采集软件 使用手记