首页 > 代码库 > 自己动手写处理器之第二阶段(1)——可编程逻辑器件与PLD电路设计流程

自己动手写处理器之第二阶段(1)——可编程逻辑器件与PLD电路设计流程

将陆续上传本人写的新书《自己动手写处理器》(尚未出版),今天是第五篇,我尽量每周四篇

 

      通过上一章的介绍,读者应该知道CPU内部有一些基本的电路,比如:译码电路、运算电路、控制电路,此外还有一些寄存器等。这些电路怎么实现呢?当然可以通过一大堆分立的元器件实现,实际上在2008年,美国加州的游戏开发人士Steve Chamberlin就自己制造了一款8位CPU,耗时18个月,花费1000美元,总共使用了1253条线缆,如图2-1所示,Steve Chamberlin为它起了一个十分贴切的名字——BMOW(Big Mess of Wires)。

 

 

还有一位叫Bill Buzbee的朋友也用200多块74系列的TTL集成电路纯手工制造了一款CPU。

上述事件只是证明了使用分立元件实现CPU的可行性,但那并不是实现CPU的好方法,本书是通过“代码 + FPGA”的方式实现CPU的,本章将对其原理进行解释,并对使用的编程语言Verilog HDL进行介绍。

2.1可编程逻辑器件概述

      FPGA是可编程逻辑器件(PLD:Programmable Logic Device)的一种。PLD是上世纪70年代发展起来的一种新型器件,它的应用和发展不仅简化了电路设计,降低了开发成本,提高了系统可靠性,而且给数字系统的设计方法带来了革命性的变化。截止到现在,出现了多种工艺、不同原理的PLD,如下。

  •  PLA(Programmable Logic Array)可编程逻辑阵列
  •  PAL(Programmable Array Logic)可编程阵列逻辑
  •  GAL(Generic Array Logic)通用阵列逻辑
  •  PROM(Programmable Read-Only Memory)可编程只读存储器 
  •  EPLD(Erasable Programmable Logic Device)可擦除可编程逻辑器件
  •  CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件
  •  FPGA(Field Programmable Gate Array)现场可编程门阵列

      按照不同的内部结构可以将PLD器件分为如下两类。

      1、基于乘积项(Product-Term)结构的PLD器件

      任何组合逻辑电路函数均可化为“与或”表达式,用“与门-或门”两级电路实现,而任何时序电路又都可以由组合电路加上存储元件(触发器)构成。因此,从原理上说,与或阵列加上触发器的结构就可以实现任意的数字逻辑电路。基于乘积项结构的PLD器件主要结构就是与或阵列,通过灵活配置的互连线,实现任意逻辑功能。其基本结构如图2-2所示。

      基于乘积项结构的PLD器件由输入缓冲电路、与阵列、或阵列和输出缓冲电路四部分组成。“与阵列”和“或阵列”是主体,主要用来实现各种逻辑函数和逻辑功能;输入缓冲电路用于产生输入信号的原变量和反变量,并增强输入信号的驱动能力;输出缓冲电路主要用来对将要输出的信号进行处理,既能输出纯组合逻辑信号,也能输出时序逻辑信号。

      PROM、PLA、PAL、GAL、EPLD和绝大部分CPLD器件都是采用乘积项(Product-Term)结构的PLD,内部基于与或阵列逻辑,这类器件多采用EEPROM或Flash工艺制作,掉电后不会丢失配置数据,器件规模一般小于5000门。

      2、基于查找表(LUT:Look-Up Table)结构的PLD器件

      基于与或阵列的PLD器件的规模不容易做得很大,于是设计人员又开发出另外一种可编程逻辑器件,即查找表结构。其原理类似于ROM,物理结构基于静态存储器(SRAM:Static RAM)和数据选择器(MUX),通过查表方式实现函数功能。函数值放在SRAM中,SRAM的地址线即输入变量,不同的输入通过MUX找到对应的函数值并输出。N个输入项的逻辑函数可以由一个2N位容量的SRAM实现。

      图2-3是用2输入查找表实现2输入或门的示意图。2输入查找表中有4个存储单元,用来存储真值表中的4个值,输入变量A、B作为查找表中3个多路选择器的地址选择端,根据A、B值的组合从4个存储单元中选择一个作为查找表的输出,即实现了2输入或门的逻辑功能。

      查找表结构的功能非常强,N个输入的查找表可以实现任意N个输入变量的组合逻辑函数。从理论上讲,只要能够增加输入信号线和扩大存储器容量,用查找表就可以实现任意输入变量的函数。但在实际应用中,查找表的规模受技术和成本因素的限制。每增加一个输入变量,查找表SRAM的容量就要扩大一倍,SRAM的容量与输入变量数N的关系是2N倍。8输入变量的查找表需要256b容量的SRAM,而16个输入变量的查找表则需要64Kb容量的SRAM,这个规模已无法忍受。实际上,FPGA器件查找表的输入变量一般不超过5个,多于5个输入变量的逻辑函数可由多个查找表通过组合或级联实现。

      绝大多数FPGA器件都是基于SRAM查找表结构实现的。特点是集成度高(可实现百万逻辑门以上设计规模)、逻辑功能强,可实现大规模的数字系统设计和复杂的算法运算,但掉电后会丢失配置数据,需外挂非易失配置器件以存储配置数据,才能构成可独立运行的系统。在FPGA内部一般还会集成更多的逻辑功能块,如存储器块、DSP块、硬件乘法器、数字锁相环等,用以满足数字信号处理、数字通信等应用的需要。

      本书最终实现的实践版OpenMIPS处理器就将下载到FPGA上运行,使用的是Altera公司的EP2C35系列的FPGA,其具有33216个LE(Logic Element),每个LE主要由一个4输入查找表和一个可编程的寄存器构成。

2.2 基于PLD的数字系统设计流程

      PLD不仅是技术的革新,也带来观念的革新、设计流程的革新,基于PLD的数字系统设计流程如图2-4所示。本节将分别介绍流程中的各个阶段。

2.2.1 设计输入

      设计输入是将设计者所设计的电路以开发软件要求的某种形式表达出来,并输入到相应软件中的过程。设计输入有多种方式,最常用的是原理图方式和HDL文本方式两种。

      1、原理图输入

      原理图(Schematic)是图形化的表达方式,使用元件符号和连线来描述设计。原理图输入对用户来说很直观,尤其对于表现层次结构、模块化结构更为方便,适合描述连接关系和接口关系,而描述逻辑功能则比较繁琐。其要求设计工具提供必要的元件库或逻辑宏单元。如果输入的是较为复杂的逻辑或者元件库中不存在的模型,采用原理图输入的方式往往很不方便,此外,原理图方式的设计可重用性、可移植性也差一些。

      图2-5是使用原理图输入的二选一选择器的电路。有三个输入:a0、a1、s,一个输出y,当s为1时,y的值等于a1的值,当s为0时,y的值等于a0的值。

      2、HDL文本输入

      硬件描述语言(HDL:Hardware Description Language)是一种用文本形式来描述和设计电路的语言。设计者可利用HDL语言来描述自己的设计,然后利用相应的工具进行综合,变为某种目标文件,最后下载到PLD器件,实现具体电路。目前常用的HDL有VHDL、Verilog HDL等。

      VHDL和Verilog HDL各有优点,可以进行算法级(Algorithm Levels)、寄存器传输级(RTL)、门级(Gate Levels)等各种层次的逻辑设计,也可以进行仿真验证、时序分析等。由于HDL语言的标准化,易于将设计移植到不同厂家的芯片中,信号参数也容易改变和修改。此外,采用HDL进行设计还具有工艺无关性,使得设计人员在功能设计、逻辑验证阶段可以不必过多考虑门级及工艺实现的具体细节,只需根据系统设计的要求,施加不同的约束条件,即可设计出实际的电路。如下是使用Verilog HDL实现的二选一选择器的代码。

module mux2(a0, a1, s, y);      input  s, a0, a1;      output y;      assign y = s ? a1 : a0;endmodule


 

      本书使用Verilog HDL实现OpenMIPS处理器。

2.2.2 综合

      综合(Synthesis)是将较高级抽象层次的设计描述自动转化为较低层次描述的过程。有以下几种综合形式。

  •   将算法表示、行为描述转换到寄存器传输级(RTL),即从行为描述到结构描述。
  •   将RTL级描述转换到逻辑门级,称为逻辑综合。
  •   将逻辑门表示转换到PLD器件的配置网表表示,有了配置网表就可完成基于PLD器件的系统实现。

      综合器就是能够自动实现上述转换的软件工具,其能够将原理图或HDL语言表达、描述的电路编译成由与或阵列、RAM、触发器、寄存器等逻辑单元组成的电路网表。

2.2.3 布局布线

      布局布线可以理解为将综合生成的电路网表映射到具体的目标PLD器件,并产生最终可下载文件的过程。布局布线将综合后的电路网表针对某一具体的目标PLD器件进行逻辑映射,把整个设计分为多个适合PLD器件内部逻辑资源实现的逻辑小块,并根据用户的设定在速度和面积之间做出选择或折中。其中布局是将已分割的逻辑小块放到PLD器件内部逻辑资源的具体位置,并使它们易于连线;布线则是利用PLD器件的布线资源完成各功能块之间、反馈信号之间的连接。

      布局布线完成后产生如下一些重要的文件。

      1、芯片资源耗用的情况报告。

      2、产生延时网表结构,以便于进行精确的时序仿真,能比较精确的预测未来芯片的实际性能。

      3、器件编程文件,如用于CPLD编程的JEDEC、POF等格式的文件;用于FPGA配置的SOF、JAM、BIT等格式的文件。

2.2.4 下载

      把布局布线过程中产生的器件编程文件放入PLD的过程称为下载。通常将对CPLD器件的下载称为编程,将对FPGA器件的下载称为配置(Configuration)。下载后,PLD内部的与或门(对FPGA而言就是查找表)会按照编程文件的要求变化,从而实现了设计的电路。

2.2.5 仿真

      从图2-4中可发现其中有仿真环节。仿真(Simulation)也称为模拟,是对所设计电路的功能进行检验。用户可以在设计过程中对整个系统和各个模块进行仿真,即在计算机上用软件验证功能是否正确,各部分的时序配合是否准确。如果有问题可以随时进行修改,从而避免了逻辑错误。规模越大的设计,越需要进行仿真。

      仿真包括功能仿真和时序仿真。不考虑信号时延等因素的仿真,称为功能仿真,又叫前仿真;时序仿真又称后仿真,它是在选择具体器件并完成布局布线后进行的包含时延的仿真。由于不同器件的内部时延不一样,不同的布局、布线方案也会影响时延,因此在设计实现中,对网络和逻辑块进行时序仿真,分析定时关系,估计设计性能是非常必要的。

      本书实现的教学版OpenMIPS处理器就主要通过仿真来验证其是否实现正确,只有实践版OpenMIPS才配置到具体的FPGA芯片中。

2.2.6 工具介绍

      在基于PLD的数字系统设计流程的每一个阶段都有相应的工具支持,有些工具是集成的,可以完成整个设计流程的各个阶段,有些工具是专门针对某一设计阶段的。本书在设计实现OpenMIPS处理器时使用的工具如下。

  •   设计输入工具:UltraEdit
  •   仿真工具:ModelSim
  •   集成工具:QuartusII

      因为实践版OpenMIPS是下载到Altera公司的FPGA芯片中,所以集成工具使用的是Altera公司的QuartusII。一般而言,集成工具最好选择目标PLD芯片厂商提供的工具,因为厂商的工具会针对自己器件的工艺特点做优化设计,从而提高资源利用率、降低功耗、改善性能。

 

未完待续!