找回密码
 马上注册

QQ登录

只需一步,快速开始

搜索
查看: 1782|回复: 6

【教程】【粗略】如何使用CPLD搭建一个较简单的数字逻辑电路?

[复制链接]
发表于 2020-2-2 23:47:53 | 显示全部楼层 |阅读模式
本帖最后由 氧化钙 于 2020-2-3 20:06 编辑

先来个modelsim仿真图来镇楼:
modelsim.png
(此教程较适合高中人士学习)
一、数字电路

1、啥是数字电路?
以下内容引自某度百科:

       用数字信号完成对数字量进行算术运算和逻辑运算的电路称为数字电路,或数字系统。逻辑门是数字逻辑电路的基本单元。存储器是用来存储二进制数据的数字电路。从整体上看,数字电路可以分为组合逻辑电路和时序逻辑电路两大类。

2、该如何系统地学习?
(1)详细的学习资料:《数字电子技术基础》(第六版)&视频资料:
https://www.bilibili.com/video/av62580396?from=search&seid=7590503698226064048
第三章可以粗略看,因为我们一般是不用这一章的知识去考虑实际问题的。但是TTL电平和COMS电平、OC门和OD门、三态门等要掌握。
(2)看完你得学会的东西:

1. 二进制、八进制、十进制、十六进制的转换
2. BCD码是什么?8421BCD呢?
3. 字节是什么?比特是什么?1B=?bit,即一字节等于多少比特?字长是什么?
4. 逻辑代数:
(1) 与、或、非运算的定义以及与门、或门、非门的符号(异或门?同或门?)
(2) 逻辑代数是什么?它的基本公式与常用公式?
(3) 逻辑代数的基本定理:代入定理,反演定理,对偶定理
(4) 逻辑函数什么?它的描述方法有哪些?逻辑函数的“与或”式和“与非与非”式是怎样的?他们这么互相转化?
(5) 怎么把与非门当非门用?
(6) 逻辑函数怎么用卡诺图来化简?(注意5变量卡诺图的化简)
5. 门电路
(1) OD门和OC门该怎么用?普通的门电路的输出可以并联吗?
(2) TTL门电路的输入引脚可以悬空吗?如果可以,它的悬空脚默认是高电平还是低电平?
(3) CMOS门电路的输入引脚可以悬空吗?如果可以,它的悬空脚默认是高电平还是低电平?
(4) TTL电路的高低电平分别是多少?CMOS电路的高低电平分别是多少?
(5) 理解门电路的延时特性
6. 了解组合逻辑电路的设计
(1)要求:会把实际问题抽象为逻辑状态,然后写出逻辑表达式,最后化简并会用基本门电路以及一些中规模逻辑电路来组成目标电路。
(2)注意:a.无关项及其卡诺图化简法。
                   b.像那些74HC138的内部电路不需要记,粗略理解工作原理就行。
7. 半导体存储电路
(1) SR锁存器
(2) 触发器
a. 触发方式分:电平触发、脉冲触发、边沿触发
b. 逻辑功能分:什么是SR触发器、D触发器、JK触发器、T触发器(只需大概记得它的特征方程或者时序图)
8.时序电路的分析方法
注意:要大致理解一下74HC161的工作原理
9.注意:脉冲波形的产生和整形之后的基本不用看了,有些东西需要微分方程的

注:学这些东西是为了更好地了解下面的“可综合”等关键词、组合电路的组成等知识的,可以酌情跳过或粗略学习!

二、CPLD的工作原理?
1、工作原理简介
     CPLD即complex programable logic device,中文为“复杂可编程逻辑器件”。
     经过上面的学习,聪明的小伙伴就会发现:对于组合电路,所有的逻辑函数都可以化为“最小与或式”的形式,即我们只需要用足够的与门和或门以及非门,就可以搞定所有逻辑函数所对应的逻辑电路;而对于时序电路,则可以理解为组合电路的基础上加上一些触发器。
     接下来让我们看看CPLD的内部结构:
如下图是CPLD内部的一种基本结构“与或门阵列”
A0、A1是输入信号,F0、F1是输出信号。
20160608223107297.jpg
(图片引自CSDN)
       通过设置“与阵列”和“或阵列”中交叉点的连接、断开,可以得到F(A0,A1)的任意一种组合逻辑表达式。
故,该电路在硬件不更换的条件下,通过改变交叉点状态,对应逻辑功能是可以再次改变的,所以称为可编程逻辑器件(PLD)。这些交叉点的通断控制有很多实现方式,早期使用紫外线或激光对交叉点进行照射使其熔断或熔接。现在一般用存储器的值去控制三极管通断实现交叉点通断。所以,对可编程逻辑器件下载配置,实际上可以理解为给存储器赋值。
       然后,只需要在F0、F1后面加上一些类似于触发器阵列的东西,理论上我们就可以组成任意的数字电路了。通俗点,就像下图一样:
cpld1_1.gif
(图片引自必应)
       而事实上,CPLD的内部结构是比较复杂的,见下图:

cpld.gif
(图片引自必应)
这只是CPLD里面的一部分,一个CPLD包含很多这些单元。前面一大堆纵横交错的东西就是实现与功能的可编程阵列,紧接着这些阵列的就是或门了,然后是可编程的一小部分阵列,再接着的就是触发器了。触发器后面的是一些实现单元与单元互连的功能元件,它们可以把经过某个单元之后的信号继续串到下一个单元或者直接给IO模块(IO即input/output,输入输出)。IO模块可以选择普通推挽输出、三态输出、开漏输出等输出方式。事实上,在实现与功能的可编程阵列之前,是经过了IO模块的(要不怎么叫IO嘛)。


2、CPLD的宏单元个数是啥?
通俗但不严谨的讲,就是这个CPLD到底有多少个触发器可以用。

三、我们用什么给CPLD编程?
答:Verilog HDL语言。而不是C语言。
1、推荐书目:夏宇闻的《Verilog数字系统设计教程》,写的很系统但又不羞涩难懂。
2、推荐视频:某宝上搜索正某原子FPGA开发板,店家给了资料下载地址的。
3、软件下载方法:微信搜索“软件安装管家”,如下图

软件安装管家.jpg
在软件目录里面有的,用的是某度的网盘,如果嫌慢的话建议用某度搜索“速盘”。所需软件:Quartus II 11.0(要用EPM3000/EPM7000系列芯片的话)或Quartus II 11.0以上的版本(不用EPM3000/EPM7000系列芯片)。


4、说点题外话:
某点原子的资料是采用ALTERA公司(Intel的子公司)的FPGA进行讲解的,开发环境是Quartus II.事实上FPGA的开发方法跟CPLD的开发方法是差不多的(毕竟从某种意义上说,FPGA是CPLD的升级版),只是在把程序下载到芯片的步骤有点不同。另外,Altera公司的产品性价比高,这对我们来说是异常友好的,相比之下的Xilinx公司的产品就有点那啥了。

四、硬件部分怎么搞?
1、买就完事了:某宝搜索“EPM240最小系统板”或者”EPM240核心板“,二十几块就有一块了。不过也可以买EPM7032AE等CPLD,EPM240一般是接近十块的(也有某个店只需4块多),有点难以焊接;而EPM7032AE只需2块,而且容易焊接。另外EPM240有240个触发器,EPM570有570个触发器,但EPM7032AE只有32个触发器,不过可以买EPM7064/
EPM7128等
别忘了下载器USB-Blaster哦!买这种就有点慢,不过便宜,十几块包邮:

1580704284.png
题外话:EPM240有多难焊?EPM7032呢?见下图(左EPM7032右EPM240):
epm.jpg

2、自己搭
EPM240的最小系统电路如下:
EPM240.png
EPM7032也差不多:

EPM7032.png
注意:a.把那些IO口全引出来就好
b.晶振要用有源晶振,一般是50MHz的。没有有源晶振的话,可以在写程序的时候写一个这样的电路(主要是写个反相器),反相器的输出端就是震荡输出(那些阻容不能用Verilog写的,要自己外加):
晶振振荡电路.png
未完待续......




 楼主| 发表于 2020-2-5 17:17:37 | 显示全部楼层
本帖最后由 氧化钙 于 2020-2-5 18:22 编辑

继续
五、CPLD的下载
1、首先要安装USB Blaster,详情某度(某点原子的视频资料里面也有),然后连接好硬件。注意最小系统板是要单独供电的,下载器是不会电给板子的。我这里的充电宝就是给板子供电的:
硬件连接.jpg
2、点击编译后,就按这个按钮,就会来到下载界面了:
下载.png
3、选择USB Blaster(安装了USB Blaster的程序以及连接好硬件才会有此选项的)
选择USB Blaster.png
4、添加下载文件(编译后才有这文件哦)
添加下载文件.png
5、记得打勾,下载进FPGA时是没有此步骤的
打勾.png
6、点击Start就行了


六、工程实例
1、目标:
看到国外友人用CPLD做的新型DRSSTC驱动(国内对此驱动方式的命名有争议,就不说出它的名字了,反正不是UD1.3或UD2.x)的搞的TC之后就眼馋了,于是乎就干了起来:
dr.png
图片源自网上,不是我的
2、器件选择:
这个逻辑处理芯片得顶得住5V的反馈信号,输出也得驱动得了TC442X,经对比,发现EPM7032AETC44-10不错,便宜小巧又容易焊:
对于输入输出电压:
EPM7000A.png
而TC442X:
tc4423.png
(其实是我多虑了,EPM7000A还是能完全工作在5V的逻辑系统的)
3、程序编写:
参照UD1.3B的原理,写了几个模块,其中关键的就是边沿检测模块和“计时模块”了,代码如下:
边沿检测:
  1. //Title:positive edge detection
  2. //Project:drsstc series
  3. //File:posedge_cap.v
  4. //Targets:EPM series

  5. module posedge_cap
  6. (
  7.     input clk,rst_n,
  8.     input pulse,
  9.    
  10.     output pos_edge
  11.    
  12. );
  13. reg pulse_r1, pulse_r2, pulse_r3;

  14. always @ (posedge clk,negedge rst_n)
  15. if(!rst_n)
  16.     begin
  17.     pulse_r1 <= 1'b0;
  18.     pulse_r2 <= 1'b0;
  19.     pulse_r3 <= 1'b0;
  20.     end
  21. else
  22.     begin
  23.     pulse_r1 <= pulse;
  24.     pulse_r2 <= pulse_r1;
  25.     pulse_r3 <= pulse_r2;
  26.     end
  27.    
  28. assign pos_edge = (pulse_r2 && ~pulse_r3);

  29. endmodule
复制代码

综合出来大概就是这样的:
边沿检测.jpg
第一个触发器是用来同步clk和信号的,第二个和第三个触发器充当寄存器,当有边沿跳变信号来的时候,它们的Q端电平是不一致的,进而可以使用组合逻辑电路来搞定。pos_edge就是上升沿来的信号输出,是输出持续一个clk周期的高电平的。

计时模块:
  1. //Targets:EPM series

  2. module counter(
  3.         input wire  clk,set,
  4.        
  5.         output reg  out,
  6.     output wire _out
  7.        
  8. );

  9. reg[9:0] counter;//1024 posedges

  10. always@(posedge clk or posedge set)
  11. begin
  12.         if(set)
  13.                 begin
  14.                 counter<=10'd700;
  15.                 out<=1'b0;
  16.                 end
  17.         else
  18.                 if(counter==0)
  19.                         begin
  20.                         out<=1'b1;
  21.                         end
  22.                 else
  23.                         begin
  24.                         counter<=counter-(10'b1);
  25.                         out<=1'b0;
  26.                         end
  27. end
  28. not(_out,out);

  29. endmodule
复制代码



这个就不贴综合之后的电路了,因为得10个触发器。值得注意的是,那句counter<=10'd700是决定定时时间的,我这里是大概28us(25MHz的时钟下),适合20KHz以上的DRSSTC使用。如果你的晶振不是25MHz的话,你得改改,关于怎么改,你自己参透这个驱动后就会改了,这个驱动的原理还是挺难讲明白的。。。

然后大概的逻辑框架,CLK25M就是25MHz的有源晶振的输入:
逻辑框架.png


4、然后是modelsim仿真:
原图.png
说明都在这了:
说明.png
然后逻辑延时只有不到8ns(这是后仿真)
逻辑延时.png
5、然后是板子:
原理图:
1580897753(1).png
6、效果?暂时没有,东西都在学校,没法做
7、源码以及仿真文件,rtl里面是各模块的Verilog HDL,dr.vt是仿真文件,dr.pof是下载文件。管脚分配:
管脚分配.png
drsstc.zip (4.21 KB, 下载次数: 0)
回复 支持 反对

使用道具 举报

发表于 2020-2-7 00:53:34 | 显示全部楼层
看上去可以做一个纯软件方案的充电宝,利用单片机控制升压电路空占比稳压输出,也可以利用单片机加比较器线性充电。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 18:20:45 | 显示全部楼层
whseen 发表于 2020-2-7 00:53
看上去可以做一个纯软件方案的充电宝,利用单片机控制升压电路空占比稳压输出,也可以利用单片机加比较器线 ...

这个想法不错,但是这不是单片机哦。这个看起来在编写程序,但严格来讲其实不是软件范畴,而是硬件范畴。

单片机的电路结构
是固定的
,编写程序只是改变时序电路的输入。即“单片机”这个时序电路已经固定了。另外,单片机是串行运行任务的,虽然某些单片机可以“并行”运行几个任务。
但是CPLD和FPGA的内部电路是可根据编程修改的,电路结构是可以改变的(这就是硬件范畴)。这两个都是可以并行多个任务的。当然,也可以运行串行任务。

或者我理解错你的意思了,见谅见谅。或许你想说的是可以利用这个开发思想或者这个电路结构来实现电源的某些控制?

另外,这里贴一些帖子的资料~(由于论坛的附件传不上来,只能用某度网盘了):

数电基础+夏宇闻Verilog:https://pan.baidu.com/s/1Gri0GxYLvqrVZK0oeWGpoQ
提取码:vb8s

某点原子视频(侵删):
https://pan.baidu.com/s/1Tj5R2Ul2qOpCJ1tXIEyq-w
提取码:iull

再次卖广告:如果嫌慢,请某度搜索“速盘”
回复 支持 反对

使用道具 举报

发表于 2020-2-9 12:06:10 来自手机 | 显示全部楼层
好,很少见fpga/cpld的教程

补充内容 (2020-2-14 13:19):
虽然我也没有fpga
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 20:27:02 | 显示全部楼层
geekgeek 发表于 2020-2-9 12:06
好,很少见fpga/cpld的教程

的确,这方面的教程确实比较少。可能是因为一般的应用都可以使用单片机实现的原因吧,能用到的地方少了,教程可能会跟着少
回复 支持 反对

使用道具 举报

发表于 2020-2-14 18:40:05 | 显示全部楼层
赞一个,虽然初中生看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|极客迷网 ( ICP09011854

44030602000010

© 2009-2016 All Rights Reserved

GMT+8, 2020-8-13 19:58 , Processed in 0.218083 second(s), 34 queries , Gzip On, Memcache On.