如何把以前写好的CPLD中的内容读出

如何把以前写好的CPLD中的内容读出,第1张

这是很简单的问题,一般的CPLD都可以通过通用擦写器进行读取用户写入的数据,(专用的有专门配套的读写器)。

当然如果CPLD是被加过密了,那你是无法从芯片中读取原始数据的!

擦写器是十分常见的一种设备,你可以轻松找到的!

/

本模块的功能是验证实现和PC机进行基本的串口通信的功能。需要在PC机上安装一个串口调试工具来验证程序的功能。

程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控制器,10个bit是1位起始位,8个数据位,1个结束位。

串口的波特律由程序中定义的div_par参数决定,更改该参数可以实现相应的波特率。程序当前设定的div_par 的值

是0x104,对应的波特率是9600。用一个8倍波特率的时钟将发送或接受每一位bit的周期时间划分为8个时隙以使通

信同步

程序的基本工作过程是,按动一个按键SW0,控制器向PC的串口发送“welcome",

PC机接收后显示验证数据是否正确(串口调试工具设成按ASCII码接受方式)

PC可随时向CPLD发送0-F的十六进制数据,CPLD接受后显示在7段数码管上

/

module serial(clk,rst,rxd,txd,en,seg_data,key_input,lowbit);

input clk,rst;

input rxd;//串行数据接收端

input key_input;//按键输入

output [7:0]en;

output[7:0] seg_data;

reg[7:0] seg_data;

output txd;//串行数据发送端

output lowbit;

////////////////////inner reg////////////////////

reg[15:0] div_reg;//分频计数器,分频值由波特率决定。分频后得到频率8倍波特率的时钟

reg[2:0] div8_tras_reg;//该寄存器的计数值对应发送时当前位于的时隙数

reg[2:0] div8_rec_reg;//该寄存器的计数值对应接收时当前位于的时隙数

reg[3:0] state_tras;//发送状态寄存器

reg[3:0] state_rec;//接受状态寄存器

reg clkbaud_tras;//以波特率为频率的发送使能信号

reg clkbaud_rec;//以波特率为频率的接受使能信号

reg clkbaud8x;//以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙

reg recstart;//开始发送标志

reg recstart_tmp;

reg trasstart;//开始接受标志

reg rxd_reg1;//接收寄存器1

reg rxd_reg2;//接收寄存器2,因为接收数据为异步信号,故用两级缓存

reg txd_reg;//发送寄存器

reg[7:0] rxd_buf;//接受数据缓存

reg[7:0] txd_buf;//发送数据缓存

reg[2:0] send_state;//每次按键给PC发送"Welcome"字符串,这是发送状态寄存器

reg[19:0] cnt_delay;//延时去抖计数器

reg start_delaycnt;//开始延时计数标志

reg key_entry1,key_entry2;//确定有键按下标志

////////////////////////////////////////////////

parameter div_par=16'h104;//分频参数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的8

//倍,此处值对应9600的波特率,即分频出的时钟频率是96008

////////////////////////////////////////////////

assign txd=txd_reg;

assign lowbit=0;

assign en=8'b11111110;//7段数码管使能信号赋值

always@(posedge clk )

begin

if(!rst) begin

cnt_delay<=0;

start_delaycnt<=0;

end

else if(start_delaycnt) begin

if(cnt_delay!=20'd800000) begin

cnt_delay<=cnt_delay+1;

end

else begin

cnt_delay<=0;

start_delaycnt<=0;

end

end

else begin

if(!key_input&&cnt_delay==0)

start_delaycnt<=1;

end

end

always@(posedge clk)

begin

if(!rst)

key_entry1<=0;

else begin

if(key_entry2)

key_entry1<=0;

else if(cnt_delay==20'd800000) begin

if(!key_input)

key_entry1<=1;

end

end

end

always@(posedge clk )

begin

if(!rst)

div_reg<=0;

else begin

if(div_reg==div_par-1)

div_reg<=0;

else

div_reg<=div_reg+1;

end

end

always@(posedge clk)//分频得到8倍波特率的时钟

begin

if(!rst)

clkbaud8x<=0;

else if(div_reg==div_par-1)

clkbaud8x<=~clkbaud8x;

end

always@(posedge clkbaud8x or negedge rst)

begin

if(!rst)

div8_rec_reg<=0;

else if(recstart)//接收开始标志

div8_rec_reg<=div8_rec_reg+1;//接收开始后,时隙数在8倍波特率的时钟下加1循环

end

always@(posedge clkbaud8x or negedge rst)

begin

if(!rst)

div8_tras_reg<=0;

else if(trasstart)

div8_tras_reg<=div8_tras_reg+1;//发送开始后,时隙数在8倍波特率的时钟下加1循环

end

always@(div8_rec_reg)

begin

if(div8_rec_reg==7)

clkbaud_rec=1;//在第7个时隙,接收使能信号有效,将数据打入

else

clkbaud_rec=0;

end

always@(div8_tras_reg)

begin

if(div8_tras_reg==7)

clkbaud_tras=1;//在第7个时隙,发送使能信号有效,将数据发出

else

clkbaud_tras=0;

end

always@(posedge clkbaud8x or negedge rst)

begin

if(!rst) begin

txd_reg<=1;

trasstart<=0;

txd_buf<=0;

state_tras<=0;

send_state<=0;

key_entry2<=0;

end

else begin

if(!key_entry2) begin

if(key_entry1) begin

key_entry2<=1;

txd_buf<=8'd119; //"w"

end

end

else begin

case(state_tras)

4'b0000: begin //发送起始位

if(!trasstart&&send_state<7)

trasstart<=1;

else if(send_state<7) begin

if(clkbaud_tras) begin

txd_reg<=0;

state_tras<=state_tras+1;

end

end

else begin

key_entry2<=0;

state_tras<=0;

end

end

4'b0001: begin //发送第1位

if(clkbaud_tras) begin

txd_reg<=txd_buf[0];

txd_buf[6:0]<=txd_buf[7:1];

state_tras<=state_tras+1;

end

end

4'b0010: begin //发送第2位

if(clkbaud_tras) begin

txd_reg<=txd_buf[0];

txd_buf[6:0]<=txd_buf[7:1];

state_tras<=state_tras+1;

end

end

4'b0011: begin //发送第3位

if(clkbaud_tras) begin

txd_reg<=txd_buf[0];

txd_buf[6:0]<=txd_buf[7:1];

state_tras<=state_tras+1;

end

end

4'b0100: begin //发送第4位

if(clkbaud_tras) begin

txd_reg<=txd_buf[0];

txd_buf[6:0]<=txd_buf[7:1];

state_tras<=state_tras+1;

end

end

4'b0101: begin //发送第5位

if(clkbaud_tras) begin

txd_reg<=txd_buf[0];

txd_buf[6:0]<=txd_buf[7:1];

state_tras<=state_tras+1;

end

end

4'b0110: begin //发送第6位

if(clkbaud_tras) begin

txd_reg<=txd_buf[0];

txd_buf[6:0]<=txd_buf[7:1];

state_tras<=state_tras+1;

end

end

4'b0111: begin //发送第7位

if(clkbaud_tras) begin

txd_reg<=txd_buf[0];

txd_buf[6:0]<=txd_buf[7:1];

state_tras<=state_tras+1;

end

end

4'b1000: begin //发送第8位

if(clkbaud_tras) begin

txd_reg<=txd_buf[0];

txd_buf[6:0]<=txd_buf[7:1];

state_tras<=state_tras+1;

end

end

4'b1001: begin //发送停止位

if(clkbaud_tras) begin

txd_reg<=1;

txd_buf<=8'h55;

state_tras<=state_tras+1;

end

end

4'b1111:begin

if(clkbaud_tras) begin

state_tras<=state_tras+1;

send_state<=send_state+1;

trasstart<=0;

case(send_state)

3'b000:

txd_buf<=8'd101;//"e"

3'b001:

txd_buf<=8'd108;//"l"

3'b010:

txd_buf<=8'd99;//"c"

3'b011:

txd_buf<=8'd111;//"o"

3'b100:

txd_buf<=8'd109;//"m"

3'b101:

txd_buf<=8'd101;//"e"

default:

txd_buf<=0;

endcase

end

end

default: begin

if(clkbaud_tras) begin

state_tras<=state_tras+1;

trasstart<=1;

end

end

endcase

end

end

end

always@(posedge clkbaud8x or negedge rst)//接受PC机的数据

begin

if(!rst) begin

rxd_reg1<=0;

rxd_reg2<=0;

rxd_buf<=0;

state_rec<=0;

recstart<=0;

recstart_tmp<=0;

end

else begin

rxd_reg1<=rxd;

rxd_reg2<=rxd_reg1;

if(state_rec==0) begin

if(recstart_tmp==1) begin

recstart<=1;

recstart_tmp<=0;

state_rec<=state_rec+1;

end

else if(!rxd_reg1&&rxd_reg2) //检测到起始位的下降沿,进入接受状态

recstart_tmp<=1;

end

else if(state_rec>=1&&state_rec<=8) begin

if(clkbaud_rec) begin

rxd_buf[7]<=rxd_reg2;

rxd_buf[6:0]<=rxd_buf[7:1];

state_rec<=state_rec+1;

end

end

else if(state_rec==9) begin

if(clkbaud_rec) begin

state_rec<=0;

recstart<=0;

end

end

end

end

always@(rxd_buf) //将接受的数据用数码管显示出来

begin

case (rxd_buf)

8'h30:

seg_data=8'b0000_0011;

8'h31:

seg_data=8'b1001_1111;

8'h32:

seg_data=8'b0010_0101;

8'h33:

seg_data=8'b0000_1101;

8'h34:

seg_data=8'b1001_1001;

8'h35:

seg_data=8'b0100_1001;

8'h36:

seg_data=8'b0100_0001;

8'h37:

seg_data=8'b0001_1111;

8'h38:

seg_data=8'b0000_0001;

8'h39:

seg_data=8'b0001_1001;

8'h41:

seg_data=8'b0001_0001;

8'h42:

seg_data=8'b1100_0001;

8'h43:

seg_data=8'b0110_0011;

8'h44:

seg_data=8'b1000_0101;

8'h45:

seg_data=8'b0110_0001;

8'h46:

seg_data=8'b0111_0001;

default:

seg_data=8'b1111_1111;

endcase

end

endmodule

可编程逻辑器件主要包括FPGA和CPLD FPGA是Field Programmable Gate Array缩写 CPLD是Complex Promrammable Logic Device的缩写

从可编程逻辑器件的发展历史上来讲 CPLD一般是指采用乘积相结构的基于EEPROM的器件 所以具有非挥发的 不需要外部配置ROM 具有保密性和有限次编程次数(根据不同的结构 从 次到 万次不等)等特点 适合用在胶合逻辑(glue logic 如DSP芯片外围的译码逻辑) IO扩展 IO电平转换 FPGA芯片配置等应用场合 如Altera的MAX 和MAX 系列芯片 Xilinx的XC 和CoolRunner/II系列芯片 Lattice的ispMACH /Z系列芯片都是CPLD器件 容量从 宏单元到 宏单元不等

FPGA主要是指采用四输入查找表(LUT )的基于SRAM的器件 因为SRAM是挥发的 掉电丢失数据 所以FPGA需要外部配置ROM 上电的时候 从外部的ROM把FPGA的配置数据导入到FPGA芯片内部后工作 具有SRAM的FPGA采用标准的CMOS制造工艺 可以随着最新的工艺而更新还代 给用户带来了实惠 衡量FPGA容量的一个基本指标是逻辑单元(Logic cell或者Logic element) 由一个可编程得LUT 和一个可编程的DFF组成 LUT 完成组合逻辑功能

而DFF用来实现时序功能 FPGA的容量从几千的逻辑单元到几十万的逻辑单元不等 如Altera的Cyclone/II/III和Stratix/II/III系列芯片 Xilinx Spartan / E/ A/ AN和Virtex / 系列芯片都是FPGA器件

随着芯片技术的发展 CPLD和FPGA的概念已经模糊在一起 如Altera和Lattice公司把小容量(小于 K左右逻辑单元)非挥发的可编程器件归到CPLD里 如Altera的MAXII系列和Lattice的MACH XO系列芯片 把基于SRAM的FPGA和FLASH的储存单元做到一个芯片里面 以及跟传统的CPLD不一样了

总之 我们可以简单的区分FPGA和CPLD CPLD 小容量(< K左右LE)的非挥发的可编程器件 其它的可编程器件都可归到FPGA

系统的比较

尽管FPGA和CPLD都是可编程ASIC器件 有很多共同特点 但由于CPLD和FPGA结构上的差异 具有各自的特点:

①CPLD更适合完成各种算法和组合逻辑 FP GA更适合于完成时序逻辑 换句话说 FPGA更适合于触发器丰富的结构 而CPLD更适合于触发器有限而乘积项丰富的结构

②CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的 而FPGA的分段式布线结构决定了其延迟的不可预测性

③在编程上FPGA比CPLD具有更大的灵活性 CPLD通过修改具有固定内连电路的逻辑功能来编程 FPGA主要通过改变内部连线的布线来编程 FP GA可在逻辑门下编程 而CPLD是在逻辑块下编程

④FPGA的集成度比CPLD高 具有更复杂的布线结构和逻辑实现

⑤CPLD比FPGA使用起来更方便 CPLD的编程采用E PROM或FASTFLASH技术 无需外部存储器芯片 使用简单 而FPGA的编程信息需存放在外部存储器上 使用方法复杂

⑥CPLD的速度比FPGA快 并且具有较大的时间可预测性 这是由于FPGA是门级编程 并且CLB之间采用分布式互联 而CPLD是逻辑块级编程 并且其逻辑块之间的互联是集总式的

⑦在编程方式上 CPLD主要是基于E PROM或FLASH存储器编程 编程次数可达 万次 优点是系统断电时编程信息也不丢失 CPLD又可分为在编程器上编程和在系统编程两类 FPGA大部分是基于SRAM编程 编程信息在系统断电时丢失 每次上电时 需从器件外部将编程数据重新写入SRAM中 其优点是可以编程任意次 可在工作中快速编程 从而实现板级和系统级的动态配置

⑧CPLD保密性好 FPGA保密性差

⑨一般情况下 CPLD的功耗要比FPGA大 且集成度越高越明显

随着复杂可编程逻辑器件(CPLD)密度的提高 数字器件设计人员在进行大型设计时 既灵活又容易 而且产品可以很快进入市场 许多设计人员已经感受到CPLD容易使用 时序可预测和速度高等优点 然而 在过去由于受到CPLD密度的限制 他们只好转向FPGA和ASIC 现在 设计人员可以体会到密度高达数十万门的CPLD所带来的好处

CPLD结构在一个逻辑路径上采用 至 个乘积项 因而大型复杂设计的运行速度可以预测 因此 原有设计的运行可以预测 也很可靠 而且修改设计也很容易 CPLD在本质上很灵活 时序简单 路由性能极好 用户可以改变他们的设计同时保持引脚输出不变 与FPGA相比 CPLD的I/O更多 尺寸更小

如今 通信系统使用很多标准 必须根据客户的需要配置设备以支持不同的标准 CPLD可让设备做出相应的调整以支持多种协议 并随着标准和协议的演变而改变功能 这为系统设计人员带来很大的方便 因为在标准尚未完全成熟之前他们就可以着手进行硬件设计 然后再修改代码以满足最终标准的要求 CPLD的速度和延迟特性比纯软件方案更好 它的NRE费用低于ASIC 更灵活 产品也可以更快入市 CPLD可编程方案的优点如下

●逻辑和存储器资源丰富(Cypress Delta K 的RAM超过 Kb)

●带冗余路由资源的灵活时序模型|

●改变引脚输出很灵活

●可以装在系统上后重新编程

●I/O数目多

●具有可保证性能的集成存储器控制逻辑

●提供单片CPLD和可编程PHY方案

由于有这些优点 设计建模成本低 可在设计过程的任一阶段添加设计或改变引脚输出 可以很快上市

CPLD的结构

CPLD是属于粗粒结构的可编程逻辑器件 它具有丰富的逻辑资源(即逻辑门与寄存器的比例高)和高度灵活的路由资源 CPLD的路由是连接在一起的 而FPGA的路由是分割开的 FPGA可能更灵活 但包括很多跳线 因此速度较CPLD慢

CPLD以群阵列(array of clusters)的形式排列 由水平和垂直路由通道连接起来 这些路由通道把信号送到器件的引脚上或者传进来 并且把CPLD内部的逻辑群连接起来

CPLD之所以称作粗粒 是因为 与路由数量相比 逻辑群要大得到 CPLD的逻辑群比FPGA的基本单元大得多 因此FPGA是细粒的

CPLD的功能块

CPLD最基本的单元是宏单元 一个宏单元包含一个寄存器(使用多达 个乘积项作为其输入)及其它有用特性

因为每个宏单元用了 个乘积项 因此设计人员可部署大量的组合逻辑而不用增加额外的路径 这就是为何CPLD被认为是 逻辑丰富 型的宏单元以逻辑模块的形式排列(LB) 每个逻辑模块由 个宏单元组成 宏单元执行一个AND *** 作 然后一个OR *** 作以实现组合逻辑

每个逻辑群有 个逻辑模块 所有逻辑群都连接到同一个可编程互联矩阵

每个群还包含两个单端口逻辑群存储器模块和一个多端口通道存储器模块 前者每模块有 b存储器 后者包含 b专用通信存储器且可配置为单端口 多端口或带专用控制逻辑的FIFO

CPLD有什么好处?

I/O数量多

CPLD的好处之一是在给定的器件密度上可提供更多的I/O数 有时甚至高达 %

时序模型简单

CPLD优于其它可编程结构之处在于它具有简单且可预测的时序模型 这种简单的时序模型主要应归功于CPLD的粗粒度特性

CPLD可在给定的时间内提供较宽的相等状态 而与路由无关 这一能力是设计成功的关键 不但可加速初始设计工作 而且可加快设计调试过程

粗粒CPLD结构的优点

CPLD是粗粒结构 这意味着进出器件的路径经过较少的开关 相应地延迟也小 因此 与等效的FPGA相比 CPLD可工作在更高的频率 具有更好的性能

CPLD的另一个好处是其软件编译快 因为其易于路由的结构使得布放设计任务更加容易执行

细粒FPGA结构的优点

FPGA是细粒结构 这意味着每个单元间存在细粒延迟 如果将少量的逻辑紧密排列在一起 FPGA的速度相当快 然而 随着设计密度的增加 信号不得不通过许多开关 路由延迟也快速增加 从而削弱了整体性能 CPLD的粗粒结构却能很好地适应这一设计布局的改变

灵活的输出引脚

CPLD的粗粒结构和时序特性可预测 因此设计人员在设计流程的后期仍可以改变输出引脚 而时序仍保持不变

为什么CPLD和FPGA需要不同的逻辑设计技巧?

FPGA是细粒器件 其基本单元和路由结构都比CPLD的小 FPGA是 寄存器丰富 型的(即其寄存器与逻辑门的比例高) 而CPLD正好相反 它是 逻辑丰富 型的

很多设计人员偏爱CPLD是因为它简单易用和高速的优点 CPLD更适合逻辑密集型应用 如状态机和地址解码器逻辑等 而FPGA则更适用于CPU和DSP等寄存器密集型设计

新的CPLD封装

CPLD有多种密度和封装类型 包括单芯片自引导方案 自引导方案在单个封装内集成了FLASH存储器和CPLD 无须外部引导单元 从而可降低设计复杂性并节省板空间 在给定的封装尺寸内 有更高的器件密度共享引脚输出 这就为设计人员提供了 放大 设计的便利 而无须更改板上的引脚输出

CPLD的功耗

与同样密度的FPGA相比 CPLD的待机功耗更低

CPLD FPGA (待机电流(在Vcc 为 V时))

K μA mA

K μA mA

K mA mA

CPLD特别适合那些要求低功耗和低温度的电池供电应用 像手持设备

许多设计人员都熟悉传统的PLD 并喜欢这种结构所固有的灵活性和易用性 CPLD为ASIC和FPGA设计人员提供了一种很好的替代方案 可让他们以更简单 方便易用的结构实现其设计 CPLD现已达到数十万门的密度 并可提供当今通信设计所需的高性能 大于 万门的设计仍需ASIC和FPGA 但对于小型设计 CPLD不失为一个高性价比的替代方案

FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念 内部包括可配置逻辑模块CLB(Configurable Logic Block) 输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分 FPGA的基本特点主要有

)采用FPGA设计ASIC电路 用户不需要投片生产 就能得到合用的芯片 )FPGA可做其它全定制或半定制ASIC电路的中试样片

)FPGA内部有丰富的触发器和I/O引脚

)FPGA是ASIC电路中设计周期最短 开发费用最低 风险最小的器件之一

)FPGA采用高速CHMOS工艺 功耗低 可以与CMOS TTL电平兼容

可以说 FPGA芯片是小批量系统提高系统集成度 可靠性的最佳选择之一

目前FPGA的品种很多 有XILINX的XC系列 TI公司的TPC系列 ALTERA公司的FIEX系列等 FPGA是由存放在片内RAM中的程序来设置其工作状态的 因此 工作时需要对片内的RAM进行编程 用户可以根据不同的配置模式 采用不同的编程方式

加电时 FPGA芯片将EPROM中数据读入片内编程RAM中 配置完成后 FPGA进入工作状态 掉电后 FPGA恢复成白片 内部逻辑关系消失 因此 FPGA能够反复使用 FPGA的编程无须专用的FPGA编程器 只须用通用的EPROM PROM编程器即可 当需要修改FPGA功能时 只需换一片EPROM即可 这样 同一片FPGA 不同的编程数据 可以产生不同的电路功能 因此 FPGA的使用非常灵活

lishixinzhi/Article/program/qrs/201311/11075

简单说,宏单元就是一些触发器的组合,根据不同的厂商或不同的类型,组合方式不一样。你甚至可以把它们简单的理解为与非门这样的东西,就是fpga的基本资源。记得在Xilinx里,好像是叫CLB吧,一个CLB里可能包含几个slice/LUT,里面又有多少个D触发器的。

在绝大多数应用下,你是不需要考虑宏单元的结构的,综合工具会将你的程序编译成为最适合该类型fpga/cpld应用的。除非你的程序设计过于复杂,芯片资源占有情况很严重,综合工具已经不能很好的实现,这时需要你将程序模块设计为匹配该类型的宏单元,这样可能会在时序上获得一些提升。当然,这是相当的高手才会去做的事情。

我做过FPGA的相关verilog编写;这种情况下一般是用寄存器打拍,例如:

always@(clk)

begin

reg1<= input;

reg0<=reg1;

end

input经过两次clk打拍后,reg0就是与clk同步的信号

这是我的理解,希望能帮到你,有错误也请指正

补充:开发板的核心板焊有针排,针排插底板的排母上,核心板可以拔下来,你在你自己做的板上作上与开发板底板一样的排母,就可以把开发板的核心板插到你的板上,因为排针、排母都是直插的封装,焊接比较方便。还有前面的网友提到的数字地与射频电路地的处理问题提得较好,做电路时也要注意。

FPGA中无FLASH,CPLD中有FLASH,就选CPLD吧;建议你还是买一个CPLD芯片焊到你的板上,因为核心板比芯片贵得多,例如一个焊有100元CPLD芯片的核心板可能会卖到200~300;CPLD只要有电源就可以工作,不需要其他附加电路,只需在你的射频板上加一个JTAG插座下载CPLD程序即可。

一、实验目的

1 熟悉CPLD的开发软件的基本使用。

2 掌握CPLD逻辑电路设计方法。

3 会用逻辑分析仪进行数字电路的测试分析。

二、实验任务和内容

1 在CPLD中设计一个多位计数器电路,设计要求为:

(1)6位十进制加法/减法计数器,运行过程中可改变加法或减法;

(2)输入计数信号频率最高1MHz,信号电平为0~5V的脉冲信号。

(3)6位数码管动态扫描显示,显示亮度均匀,不闪烁。

(4)有手动清零按键。

2.对设计的电路进行软件仿真

3.计数器电路的CPLD下载、实验调试。

4.使用虚拟逻辑分析仪进行调试和测试

三、实验器材

1 1SJ-8002B电子测量实验箱 1台

2.计算机(具有运行windows2000和图形化控件的能力 1台

3.函数发生器 1台

4 SJ-7002 CPLD实验板 1块

5 短接线若干

四、实验原理

41 CPLD介绍

可编程逻辑器(PLD)是70年代发展起来的一种划时代的新型逻辑器件,一般来说,PLD器件是由用户配置以完成某种逻辑功能的电路。80年代末,美国ALTERA和XILINX公司采用E2CMOS工艺,分别推出大规模和超大规模的复杂可编程逻辑器件(CPLD)和现场可编程逻辑门阵列器件(FPGA),这种芯片在达到高度集成度的同时,所具有的应用灵活性和多组态功能是以往的LSI/VLSI电路无法比拟的。到90年代,CPLD/FPGA发展更为迅速,不仅具有电擦除特性,而且出现了边缘扫描及在线编程等高级特性。另外,外围I/O模块扩大了在系统中的应用范围和扩展性。较常用的有XILIN X公司的EPLD和ALTERA及LATTICE公司的CPLD。

CPLD/FPGA的设计开发采用功能强大的EDA工具,通过符合国际标准的硬件描述语言(如VHDL或VERILOG-HDL)来进行电子系统设计和产品开发,开发工具的通用性,设计语言的标准化以及设计过程几乎与所用的CPLD/FPGA器件的硬件结构没有关系,所以设计成功的逻辑功能软件有很好的兼容性和可移植性,开发周期短;易学易用,开发便捷。

尽管CPLD、FPGA以及其它类型的PLD器件的结构各有其特点和长处,但是概括起来它们都是由三大部分组成的:(1)一个二维的逻辑块阵列,构成器件的逻辑组成核心;(2)输入/输出块(3)连接逻辑块的互联资源,连线资源由各种长度的线段组成,也包括用于连接逻辑块之间,逻辑块与输入输出部分的可编程连接开关。

本CPLD实验电路板选用ALTERA公司的EPM7128SLC84器件,EPM7128SLC84的特点为:84引脚Pin,内部有128个宏单元、2500个等效逻辑门、15ns的速度、PLCC84封装形式。除电源引脚、地线引脚、全局控制引脚和JTAG引脚外,共提供了64个可用I/O脚,这些引脚可以任意配置为输入、输出和双向方式。

图1 CPLD芯片EPM7128SLC84外形图

42 CPLD(FPGA)器件的设计和验证步骤

一般可分为设计输入、编译、功能仿真和时延仿真、器件下载(编程)、硬件电路三个设计步骤以及相应的功能仿真、时序仿真和器件测试三个设计验证过程。

(1).设计输入:设计输入有多种方式,目前最常用的有电路图和硬件描述语言两种,对于简单的设计,可采用原理图的方式设计,对于复杂的设计可使用原理图或硬件描述语言(Verilog、AHDL、VHDL语言),或者两者混用,采用层次化设计方法,分模块层次地进行描述。原理图设计方法主要是按照数字系统的功能采用具体的逻辑器件组合来实现的,把这些由具体器件实现逻辑功能的电路图输入到软件当中。这种设计方法比较直观。硬件描述语言设计方法主要把数字系统的逻辑功能用硬件语言来描述

(2)编译:编译前先选择器件的系列、型号,分配输入/输出管脚进行管脚,然后开始编译编译是指从设计输入文件到熔丝图文件(CPLD)或位流文件(FPGA)的编译过程。在该过程中,编译软件自动地对设计文件进行综合、优化,并针对所选中的器件进行映射、布局、布线、产生相应的熔丝图或位流数据文件。

(3)仿真:分为功能仿真(Functional)和时延(Timing)仿真:编译成功的设计并不一定完全正确,可通过仿真来验证电路是否达到设计要求,基本思路是首先用波形编辑器编辑仿真文件,给输入加载不同的激励信号,然后运行仿真器,产生对应的输出,根据输入和输出的关系,以此判别设计的正确性。

(4)器件编程:器件编程就是将熔丝图文件或位流数据文件下载到相应的CPLD或FPGA器件中。

(5)系统硬件电路测试

图2 CPLD设计流程

43 设计软件的使用

对CPLD的设计可使用ALTERA公司的MAX-PLUSⅡ或Quartus Ⅱ,设计的主要步骤为:

(1)创建或打开一个工程。

(2)原理图输入方式:新建一个图形文件,输入符号(代表子模块或元件、输入输出引脚),连线,存盘。如图4所示为采用两片74190级联的两位十进制计数器电路,文件名为Z74190gdf。

(3)文本输入方式:新建一个文本文件,输入HDL语言编写的电路,存盘。

(4)选择芯片为CPLD实验电路板选用的EPM7128SLC84器件,分配引脚。

(5)波形仿真,首先新建空白的波形文件,导入本设计电路的输入输出节点,给输入节点按照需要指定时钟信号和高低电平,开始仿真,得到结果,再分析结果。如图5为Z74190gdf的仿真文件波形。

(6)CPLD程序的下载:我们采用的是并口下载电缆ByteBlaster,它可以对MAX7000S系列进行在线编程。该下载电缆具有以下几个部分:与PC机并行口相连的25针插座头、与PCB板插座相连的10针插头。其示意图如3所示。

图 3 并行电缆下载示意图

设计举例:图 4和图 5分别是用原理图方式设计的2位十进制计数器的原理图和软件仿真波形图。

图4两位十进制计数器电路图 图11-5 两位十进制计数器电路仿真波形图

44 CPLD实验电路板原理和虚拟逻辑分析仪使用

实验电路板的组成和虚拟逻辑分析仪的使用在本实验指导书的“实验四 逻辑分析仪的原理和应用”中已作了说明,请读者参考。图6 为CPLD板的详细电路图。CPLD与62芯插座定义表见表1和CPLD可供用户自定义的引脚见表2。

使用CPLD板的1000MHz的晶振时钟,需放置CPLD板上S1短路块位置在右面。

表1 CPLD和62芯插座连线引脚定义

引脚名称 CPLD

芯片引脚

62芯插座引脚

说明

引脚名称

CPLD对应脚

62芯插座引脚

说明

DO0

P40

16

连接逻辑分析仪的24个输入通道

DO24

P63

28

系统保留

DO1

P36

48

DO25

P76

60

DO2

P41

17

DO26

P64

29

DO3

P44

49

DO27

P75

61

DO4

P45

18

DO28

P68

30

DO5

P46

50

VCC

P3,P13,

P26,P3

P43,P5,

P66,P78

31,62

+5V电源

DO6

P48

19

DO7

P49

51

DO8

P50

20

DO9

P51

52

GND

P1,P7,

P19,P32,

P42,P47,

P59,P72,

P82,P84

13,44

电源地

DO10

P55

21

DO11

P52

53

DO12

P54

22

DO13

P65

54

DO14

P57

23

CPLD时钟源

sourceCLK

P83

45

由S1短路

选择接

CPLD-CLK1

DO15

P67

55

DO16

P56

24

DO17

P69

56

DO18

P58

25

outsideclk

P39

15

选择接(P83)

DO19

P70

57

allCLR

P35

47

系统总清零

DO20

P61

26

outside_tri

P37

14

外部触发

DO21

P73

58

DO22

P60

27

DO23

P74

59

表2 用户可用的CPLD自定义I/O引脚

P4 P5

P6

P8

P9

P10

P11

P15

P16

P17

P18

P20

P21

P22

P24

P25

P27

P28

P29

P30

P31

P77

P79

P80

P81

图6 CPLD实验板电路原理图

五、设计指导:

设计和调试的过程是:①任务分析,层次分解,得到顶层设计框图,大致确定每个子模快(子电路)的功能、输入和输出;②子模快电路设计和软件仿真;③完成顶层电路设计,顶层仿真;④分配引脚,下载,连线和调试。

软件仿真注意尽量给定符合实际电路工作的输入电平、时钟,仿真最小间隔不小于20ns,仿真时间长短适中。

51 设计任务分析

根据设计任务,可分为两大部分:多位计数器电路和计数结果动态显示电路。根据CPLD电路的层次化设计功能,设计出如图7所示的顶层设计框图。

6位十进制的计数器对输入的脉冲计数,有加减计数控制和清零计数值控制,输出6位十进制计数值,每位都用4位BCD码表示,共有24根线。

根据动态扫描显示的需要,必须设计一个6位BCD选1的多路数据选择器,输出的一位BCD码(4根线)送给BCD-七段译码器译成段信号,从CPLD输出给数码管的7段。同时多路数据选择器的控制选通信号需要3根,必须与6位数码管的位选信号同步。

位选信号来自电路板的时钟(1MHz)分频,在用译码器译码(每次只能选中一个数码管)。要保证多位显示均匀和不闪烁,请计算和设计分频的频

电路的设计均有原理图设计和HDL语言文本设计两种方法,根据电路的特点和各人的情况,自己选用。

对每个子模快进行软件仿真,先创建波形文件,设定时间间隔和解释时间,编辑输入波形,运行仿真,分析结果是否正确。若不正确,则修改设计,重新编译后,再仿真,直到正确为止。

(1)6位十进制的计数器子模块设计:

没有现成电路可用,所以必须自己设计。

为什么不选用二进制计数器?(从显示要求、二进制转换为BCD电路的难易等考虑)

设计方法一:选用6个1位的可逆带清零十进制计数器级联得到。注意进位/借位信号的时序。

设计方法二:使用HDL语言编程,注意同时满足十进制、加、减的进位和借位。

(2)6位BCD选1的多路数据选择器设计:

没有现成电路可用,所以必须自己设计。

可选用多个数据选择器来组合。要求控制选通信号需要3根,按000-001-010-011-100-101变化,只有6个状态。

(3)BCD-七段译码器设计:

有现成电路选用,注意共阴和共阳数码管的区别。

位选信号产生

①位选译码:每次选中一个,可选用什么译码器?注意位选电平是高电平有效还是低电平有效。

②位选控制:要求为6个状态,设计电路可采用状态机的方法,但仔细分析6个状态之间的关系后,可得出符合_________的计数器。

设计方法:语言和图形均可。

分频电路:位选信号来自电路板的时钟(1MHz)分频,要保证多位显示均匀和不闪烁,先计算分频电路要求的输出频率,在设计分频电路。可使用计数器分频。

53分配引脚和编译、下载

引脚分配要满足CPLD电路板上已有的连线情况,把主要的输入信号和重要的中间结果同时分配给逻辑分析仪的输入通道A0~A23,可以利用逻辑分析仪进行测试,观察到电路实际的内部工作时序。每次分配引脚后,需重新编译后,再下载。

六、调试和测试结果

61实验硬件连接

根据各人设计的计数器电路和分配的引脚连线,计数器输入控制信号连接开关和按键,计数脉冲信号连接到函数发生器的TTL(CMOS)输出端。计数器的输出位选分别连接6个数码管的为选端L1~L6注意,左边的数码管为低位,7段信号分别连接。

62调试和测试

按照以下顺序对计数器电路进行测试,如不正确,请按下面步骤检查:连线——引脚分配——CPLD电路设计。改正错误,再测试,若是CPLD电路错误,需重新编译和重新下载。

①检查动态扫描电路

数码管7段信号全部直接接地,位选分别连接CPLD输出位信号,这时,6个数码管应该稳定显示“888888”。

②检查加法计数器是否正确

连接数码管7段信号到CPLD指定输出引脚,位选分别连接CPLD输出位信号,选计数器输入连接函数发生器的TTL电平信号输出端,设置函数发生器为方波,频率为1~2Hz,加/减控制信号输入“加”有效,观察数码管的显示,应是加1计数,更新频率即为输入信号频率。提高输入信号频率,使计数更新快,检查计数器进位和高位计数是否正确。

③检查减法计数器是否正确

加/减控制信号输入“减”有效,测试方法同上。

④检查“清零”控制是否正确。

1,有可能是只读寄存器

2,有可能是地址被映射过,你写些错拉地址

3,还有可能是寄存器是动态的,只要一读有些位就被还原了或者你的其他 *** 作让它还原拉

4,还有就是你的寄存器坏拉不能工作拉

以上就是关于如何把以前写好的CPLD中的内容读出全部的内容,包括:如何把以前写好的CPLD中的内容读出、verilog 串口通信问题!紧急,救命! 谢谢! 我就是想用CPLD实现串口通信。、CPLD和FPGA区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10209025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存