苗木公司网站模板,正规公司简历模板,做网站什么费用,河南发现5名阳性可编程逻辑器件PLD复杂可编程逻辑器件CPLD现场可编程门阵列FPGA
7.1 只读存储器#xff08;ROM#xff09;
7.1.1 ROM的结构
ROM存储器 存储阵列 地址译码器 输出控制电路 存储阵列#xff0c;由许多存储单元#xff08;1bit#xff09;组成。每次读出一组数据…可编程逻辑器件PLD复杂可编程逻辑器件CPLD现场可编程门阵列FPGA
7.1 只读存储器ROM
7.1.1 ROM的结构
ROM存储器 存储阵列 地址译码器 输出控制电路 存储阵列由许多存储单元1bit组成。每次读出一组数据组字。一个字的位数称为字长。地址译码器将地址代码转换成 相应字单元的控制信号。从存储矩阵中选出指定的存储单元。将数据送到输出控制电路。输出控制电路三态缓冲器。与系统数据总线连接。驱动数据总线 或者 保持高阻状态 下图中地址 A 1 A 0 01 A_1A_001 A1A001,地址译码器给出 Y 3 Y 2 Y 1 Y 0 1101 Y_3Y_2Y_1Y_01101 Y3Y2Y1Y01101字线 Y 1 Y_1 Y1是低电平。 Y 1 Y_1 Y1字线与位线交接处有 二极管的二极管都会被导通。位线在二极管导通后会被拉低成0。位线的状态会被传给输出控制电路。最终输出 D 3 D 2 D 1 D 0 1101 D_3D_2D_1D_01101 D3D2D1D01101可以发现读出的数值取决于字线和位线之间是否有二极管连接。 存储器的容量密度 字线数 * 位线数。字数*字长
7.1.2 二维译码
译码电路随着输入地址宽度的增加译码电路的复杂度呈指数级增加。二维译码 行译码列译码 地址为8位宽度时一维译码电路的输出端 需要有 2 8 256 2^8256 28256个输出口。译码电路内部变的非常复杂。地址为8位宽度时二维译码电路行译码变成4位 2 4 16 2^416 2416个译码器输出口列译码变成4位 2 4 16 2^416 2416个数据选择器输入口
7.1.3 可编程ROM 只读存储器ROMRead-Only Memory 固定ROM掩膜ROM。出厂前已经写入存储阵列。可编程ROMPROM (Programmable ROM) 一次可编程ROMPROM。金属熔丝二极管一次性编程。光可擦除可编程存储器EPROM(Erasable PROM)。SIMOS管。透明石英盖板紫外线或X射线照射擦除。不装透明石英盖板不可擦除OTP EPROM。电可擦除可编程存储器EEPROM(Electrical Erasable PROM)。Flotox Mos。闪烁存储器FLASH Memory。快闪叠栅MOS。
7.1.4 集成电路MOS
AT27C010128Kx8OTP EPROM。 C E ‾ \overline{CE} CE片选信号 O E ‾ \overline{OE} OE输出使能信号 P G M ‾ \overline{PGM} PGM编程信号
7.2 随机存取存储器RAM
随机存取存储器RAM (Random Access Memory) 静态随机存取存储器SRAM (Static RAM)触发器存储两个稳态 同步静态随机存取存储器SSRAM 动态随机存取存储器DRAM (Dynamic RAM)电容存储需要定时刷新否则会逐渐消散
7.2.1 静态随机存取存储器
普通 SRAM异步
普通异步SRAM 存储阵列地址译码输入输出控制电路 存储阵列的存储单元是 锁存器。只要不断电SRAM可以永久保存数据。大多数SRAM的读周期和写周期是相同的。10纳秒左右。 FIFO SRAM
FIFO SRAM。数据输入/输出分开无地址输入端改成读地址指针计数器写地址指针计数器。 输出信号空半满满FIFO SRAM 常用作 “数据缓冲器”。适合长时间连续高速数据采集。
同步静态随机存取存储器 SSRAM
SSRAM基于SRAM的高速RAM。 需要时钟脉冲输入在节拍控制下完成读写。 地址寄存器。寄存地址线上的地址。 输入寄存器。寄存数据线上的数据。 读写控制逻辑电路。 丛发burst 快速连续发生控制逻辑电路。减少外部总线的占用时间提高效率。 丛发控制计数器是2位的计数器。叠加在输入的地址之上。地址最低2位 b i t [ 1 : 0 ] bit[1:0] bit[1:0]从00变化到11超过11后会回到00。输入一个地址可自动连线读取/写入以此向后4个地址的数据。不需要外部输入这些连续的地址。 速度快于SRAM。 应用超高速缓冲存储器Cache。
SDR
单倍速率Single Data RateSDR SRAM 就是前文的 SSRAM。只在时钟上升沿 传输数据共用读写数据总线读写不能同时。
DDR
双倍速率Double Data RateDDR SRAM 在SSRAM的基础上在时钟上升沿和下降沿 都进行数据传输。依然共用读写数据总线读写不能同时。后续升级改善有DDR Ⅱ。
QDR
四倍速率Quad Data RateQDR SRAM 在SSRAM的基础上在时钟上升沿和下降沿 都进行数据传输。提供读数据总线和写数据总线读写同时。后续升级改善有QDR Ⅱ。 重要指标容量时钟工作频率。
7.2.3 动态随机存取存储器
DRAM的基本结构
SRAM的存储单元由锁存器或者触发器构成。一个锁存器的结构就很复杂需要多个MOS管。占用较大的体积。SRAM的集成度很难提高。DRAM的存储单元由一个MOS管和一个电容器构成。体积小。 电容存储电荷高电平1低电平0。电容器存在漏电流需要定期补充电荷。称为“刷新”或者再生。 DRAM的集成度很高容量大。需要的地址线也多。DRAM大都采用行地址、列地址分时送入的方法。 1M字大小的空间( 2 20 1048576 字 2^{20}1048576字 2201048576字)需要20根地址线。当采用分时传入行列地址时只需要10根地址线。行地址选通信号 R A S ‾ \overline{RAS} RAS列地址选通信号 C A S ‾ \overline{CAS} CAS
DRAM的操作
DRAM的操作较为复杂 读写操作 1 R A S ‾ \overline{RAS} RAS拉低送入行地址再拉高。2 C A S ‾ \overline{CAS} CAS拉低送入列地址再拉高。3 W E ‾ \overline{WE} WE拉低使能读写。4 O E ‾ \overline{OE} OE拉低读操作时输出使能。 页模式操作 同一行的所有列构成的存储单元。选定行地址之后不用再改变行地址。 R A S ‾ \overline{RAS} RAS始终拉低。 R A S ‾ \overline{RAS} RAS只刷新操作 刷新地址由外部地址计数器提供只刷新 行地址 指定的行的所有存储单元。列地址的 C A S ‾ \overline{CAS} CAS保持高电平不进行读写操作。每行刷新间隔15.6us。刷新操作小于100ns。
同步动态随机存取存储器 SDRAM
SDR
同步DRAMSDRAM
DDR
双倍数据速率DRAM DDR SDRAM目前电脑使用的内存条即使用的这个技术。
QDR
四倍数据传输速率DRAM QDR SDRAM
7.2.4 存储容量的扩展
字长位线数的扩展
地址线宽度不变每个地址对应的数据位宽扩大
字数字线数的扩展
地址线宽度变大增加地址译码器每个地址对应的数据位宽不变
7.3 复杂可编程逻辑器件CPLD
简单PLDPAL、GAL等复杂PLDCPLD 早期使用EPROM编程技术后来使用EEPROM和FLASH编程技术支持“在系统可编程ISP” 在系统可编程ISP : 未编程的ISP器件可以直接焊接在电路中可通过计算机的数据传输端口和专用的编程电缆对ISP器件进行多次编程。编程电路和升压电路已经集成在ISP器件内部。
7.3.1 CPLD的结构 更多的 输入信号 更多的 乘积单元 更多的 宏单元 CPLD中的逻辑块相当于一个GAL器件参考6.7小节。与或阵列OLMC CPLD的结构如下
7.3.2 CPLD的编程简介
CPLD的内部可编程单元用于CPLD的各种逻辑功能的实现CPLD的内部可编程单元大都采用EEPROM或者FLASH编程技术绝大多数CPLD支持ISP。Altera公司的CPLD MAX7000S(5V)MAX7000A(3.3V)MAX7000B(2.5V) Xilinx公司的CPLD XC9500 Lattice公司的CPLD不同公司的ISP接口不完全相同但都支持JTAG标准编程。
7.4 现场可编程门阵列
CPLD使用“与或”阵列实现逻辑函数FPGA使用查找表LUT实现逻辑函数。FPGA中的LUT和触发器的数量非常多能够实现更大规模更复杂的逻辑电路
7.4.1 FPGA的查找表LUT和数据选择器MUX
FPGA中 组合逻辑基本电路是LUT和数据选择器。时序逻辑基本电路是触发器 1LUT查找表LookUpTable本质是一个SRAM。 普通异步SRAM 存储阵列地址译码输入输出控制电路可以理解为根据地址An…A0在SRAM中读出数据Dm…D0大多LUT是 4输入变量1输出结果 2数据选择器参考4.4.3 3扩展LUT逻辑函数的输入变量个数通过数据选择器MUX实现LUT的级联。 数据选择器级联LUT输出接在MUX上因而LUT也实现了级联。 HDL语言描述一个逻辑电路FPGA开发软件算出所有可能结果真值表写入LUTSRAM LUT因而具有逻辑功能 F f ( A , B , C , D ) Ff(A,B,C,D) Ff(A,B,C,D)。 FPGA上电之后从外部PROM中读入编程数据写入各种可编程单元中(包括查找表LUT)。
7.4.2 FPGA的结构
可配置逻辑块CLB
可配置逻辑块CLB内部由多个微片Slice 组成一个微片Slice 由两个逻辑单元LC 组成一个逻辑单元LClogic cell由查找表LUT进位及控制逻辑D触发器构成。
输入输出模块IOB
一个IOB对应一个封装引脚IOB可以配置为引脚输入输出双向。VCCO是输出VCC电压VREF是输入参考电压输出信号O可经过数据选择器再到输出缓冲器。也可以直接到输出缓冲器输入信号I来自输出缓冲器多个IOB组成一个Bank一般有8个bank 可编程布线资源 局部布线资源进出CLB的连线资源 CLB到通用布线矩阵GRMCLB到自己输出到输入高速反馈连接CLB到相邻CLB直接快速连接避免了通过GRM产生的延时。 通用布线资源通用布线矩阵GRM与之连线 是FPGA主要的内部资源GRM是 行线资源 与 列线资源 互联 的 开关矩阵 I/O布线资源CLB与IO块外围之间附加的布线资源“万能环” VersaRing 实现引脚的交换和锁定使引脚的位置变动和内部逻辑无关 专用布线资源 横向片内三态总线纵向进位链 全局布线资源 分配时钟信号其他贯穿整个器件的高扇出信号分为主次两级 主全局布线资源与高扇出时钟信号输入引脚构成4个专用全局时钟网络驱动CLBIOBRAM的时钟引脚。次全局布线资源24根干线12根穿越芯片顶部12根穿越芯片底部不受时钟引脚限制使用灵活
7.4.3 FPGA编程简介
配置数据
配置数据编程数据FPGA的存储单元中的数据用于配置CLBIOB布线资源。不同规模的FPGA配置数据量不同。配置数据由FPGA开发软件生成。
装载配置数据的引脚
专用引脚
引脚描述M0,M1,M2输入用于指定配置模式CCLK输入或者输出配置时钟。1从配置模式时为输入。2主配置模式时为输出。3配置完成后为输入处于无关x状态PROGRAM输入低电平时开始配置过程DONE双向由低到高表示配置装载完成。1输入低电平可以推迟启动工作。2输出为开漏。 V C C I N T V_{CCINT} VCCINT输入内部核心逻辑电源引脚 V C O O V_{COO} VCOO输入IO输出驱动电源引脚
非专用引脚
引脚描述INIT双向开漏1低电平时表示配置存储单元 正在清零。2结束后可作为用户IO。BUSY/DOUT输出1从并模式下busy控制装载速率。2串行模式下多个器件链式配置DOUT作为向下一级传递数据流的出口。3结束后可作为用户IO。D0/DIN,D1,D2,D3,D4,D5,D6,D7输入或者输出1从并模式下配置数据输入。2串行模式下DIN为输入。3结束后可作为用户IO。WRITE输入1从并模式下写使能低电平有效。2结束后可作为用户IO。CS输入1从并模式下片选信号低电平有效。2结束后可作为用户IO。 M 2 M 1 00 M_2M_100 M2M100, 配置模式是“主 串”CCLK输出数据宽1位DOUT串行输出 M 0 1 M_01 M01时相关引脚上拉 M 2 M 1 11 M_2M_111 M2M111, 配置模式是“从 串”CCLK输入数据宽1位DOUT串行输出 M 0 0 M_00 M00时相关引脚上拉 M 2 M 1 01 M_2M_101 M2M101, 配置模式是“从 并”CCLK输入数据宽8位DOUT不输出 M 0 0 M_00 M00时相关引脚上拉 主串模式电路PROGRAM 由外部控制DONE起始低电平用于存储芯片的片选信号FPGA的CCLK输出道存储芯片的CLK。
7.5 EDA技术和可编程器件的例题
例1 定时器
设计一个定时器定时时间为24s递减计时每隔1s定时器减1。2个外部控制开关复位暂停
复位nRst暂停nPAUSE功能0x定时器复位置初值2411定时器开始计时10定时器暂停计时
定时器减到0后定时器保持不变同时发出警报信号。输入时钟脉冲的频率为1Hz输出为8421BCD码。
设计
HDL描述分为3个部分 第一部分定义输入信号复位nRST暂停nPAUSE时钟CP定义输出定时器的十位定时器的个位报警Alarm。第二部分连续复制语句assign定时器减到0时报警Alarm1。第三部分时序逻辑电路过程块always计数器计数处理操作十位和个位按照8421BCD码方式递减计数。 打篮球的规则进攻方只能进攻24秒这和本定时器的功能设计是一致的。本模块的命令是篮球24秒。
module basketball24(TimerH,TimerL,Alarm,nRST,nPAUSE,CP);input nRST,nPAUSE,CP;wire nRST,nPAUSE,CP;output [3:0] TimerH,TimerL;reg [3:0] TimerH,TimerL;output Alarm;//输出报警信号assign Alarm ({TimerH,TimerL}8h00)(nRST 1b1);//计数处理always (posedge CP or negedge nRST or negedge nPAUSE)//异步复位异步暂停beginif(~nRST){TimerH,TimerL} 8h24;//复位初值24else if(~nPAUSE){TimerH,TimerL} {TimerH,TimerL};//暂停else if({TimerH,TimerL} 8h00)//定时时间到保持0不变{TimerH,TimerL} {TimerH,TimerL};else if(TimerL4h0)begin TimerH TimerH - 1b1; TimerL 4h9;endelsebeginTimerH TimerH;TimerL TimerL -1b1;endend
endmodule例2 时分秒电子钟
按照24小时制计时输出时分秒的8421BCD码计时输入脉冲频率为1Hz具有分钟小时的校正功能校正输入脉冲频率为1Hz采用分层设计。 设计 顶层模块top_clock.v 分钟计数分为 十位 和 个位。
module top_clock(Hour,Minute,Second,CP,nCR,EN,Adj_Min,Adj_Hour);input CP,nCR,EN,Adj_Min,Adj_Hour;output [7:0] Hour,Minute,Second;wire [7:0] Hour,Minute,Second;supply1 Vdd;wire MinL_EN,MinH_EN,HOur_EN;//定义中间变量//60秒计数器counter10 U1(Second[3:0],nCR,EN,CP);counter6 U2(Second[7:4],nCR,(Second[3:0] 4h9),CP);//Adj_Min 1时校准分钟立即使能分钟的个位计数下一个时钟分钟个位加一。//Adj_Min 0时当秒数为59时使能分钟的个位计数下一个时钟60s分钟个位加一。assign MinL_EN Adj_Min? Vdd : (Second8h59); //Adj_Min 1 且分钟的个位数为9时立即使能分钟的十位计数下一个时钟分钟十位加一。//或者分钟的个位计数到了9秒数计到了59使能分钟的十位计数下一个时钟分钟十位加一。assign MinH_EN (Adj_Min (Minute[3:0] 4h9)) || (Minute[3:0] 4h9) (Second 8h59);//60分钟计数器counter10 U3(Minute[3:0],nCR,MinL_EN,CP); //分计数器个数counter6 U4(Minute[7:4],nCR,MinH_EN,CP); //分计数器十位//Adj_hour 1时校准小时立即使能小时的个位计数下一个时钟小时个位加一。//Adj_hour 0时当分钟数为59秒数为59时使能小时的个位计数下一个时钟60min小时个位加一。assign Hour_EN Adj_Hour ? Vdd : (Minute 8h59) (Second 8h59);//24小时计数器counter24 U5(Hour[7:4],Hour[3:0],nCR,Hour_EN,CP);//小时计数器 十位 个位
endmodulecounter10.v BCD 0-9
module counter10(Q,nCR,EN,CP);input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always (posedge CP or negedge nCR)beginif(~CR) Q 4b0000; //异步清零else if(~EN) Q Q; //暂停计数else if(Q 4b1001) Q 4b0000;else Q Q 1b1; //计数1end
endmodulecounter6.v BCD 0-5
module counter6(Q,nCR,EN,CP);input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always (posedge CP or negedge nCR)beginif(~CR) Q 4b0000; //异步清零else if(~EN) Q Q; //暂停计数else if(Q 4b0101) Q 4b0000;else Q Q 1b1; //计数1end
endmodulecounter24.v BCD 0-23
module counter23(CntH,CntL,nCR,EN,CP);input CP,nCR,EN;output [3:0] CntH,CntL;reg [3:0] CntH,CntL;reg CO;always (posedge CP or negedge nCR)beginif(~nCR) {CntH,CntL} 8h00;else if(~EN) {CntH,CntL} {CntH,CntL};else if((CntH2) || (CntL9) ||( (CntH 2) (CntL 3)) {CntH,CntL} 8h00;else if((CntH 2) (CntL 3)) begin CntH CntH; CntL CntL 1b1; endelse if(CntL 9) begin CntH CntH1b1; CntL 4b0000; endelse begin CntH CntH; CntL CntL 1b1; endend
endmodule