这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 头文字D的CPLD_DIY进程帖

共13条 1/2 1 2 跳转至

头文字D的CPLD_DIY进程帖

助工
2013-06-14 22:35:00     打赏
此帖是头文字D在本次CPLD DIY活动的进程帖。

6月14号拿到PCB板和套件,并已经全部焊接完成。各功能模块的软件编写、调试及相关问题也就会在本帖持续更新,望广大网友及版主多提宝贵建议及意见。
    技术分享:
    焊接篇……..........................................................6楼

    焊接测试篇 …………………………………............……..7楼

    Quartus II 使用篇...............................................8楼

    LED流水灯篇.....................................................9楼

    数码管篇..........................................................10楼

    串口篇.............................................................11楼

    LM75使用篇.....................................................12楼

    1602显示篇.....................................................13楼

    LM75+1602.....................................................14楼

    。。。。。。未完待续




关键词: CPLD     进程    

助工
2013-06-16 21:40:19     打赏
2楼
嘿嘿,学生一枚,自由时间比较多呀

助工
2013-06-16 21:40:45     打赏
3楼
嗯,谢谢

助工
2013-06-16 21:57:28     打赏
4楼

焊接篇

今天下午终于等到了快递小哥的短信,拿到了梦寐以求的DIY套件,上图先

话说,黑色的板子的确是挺好看的,就是看不清上面的走线,都不好测一下板子,不过应该没多大问题。下面就要开始焊接啦,其实应该先焊电源的,不然电源弄错了,后面焊好的芯片全白搭了,不过,看着100脚的CPLD挺有挑战性的,还是忍不住先焊CPLD了

花了一个晚上的时间终于都焊完了,期间还把LM75和那个时钟芯片给丢了,最后还是在51FPGA同学提醒下把书桌给找了个遍。焊CPLD的时候用松香吸焊锡时,我发现用那种里面包了很多铜线的那种线沾上松香,那它来吸焊锡,感觉挺好使的,嘿嘿。焊接的时候要注意以下一些问题:

1. 电阻值要注意分别,有些麻烦;

2. 发光二级管中有绿点的那一边是负极,钽电容有深色横杠的是正极;

3. 有源晶振判断1脚:字正对着自己,左下角为一脚,而且1脚上有一个小实心点,比较好分辨;

4. 芯片1脚判断:一般来说字正对着自己,左下角为1脚,然后逆时针转一圈分别为2,3,4.......脚;

5. “α1”字样的是自恢复保险丝,焊接时不分正负哦;

6. 稳压二极管是有“SS34”字样的,有深色横杠的是阴极,要焊在电源正极上哦,因为它是反向稳压用的哦,从PCB也可以看出来,D1的封装是不是倒了个个呀;

7. 无源蜂鸣器有正负哦,上面有标记哦,注意看就行啦;

其他的就比较好焊了啦,明天在拿测试程序测一下,希望没问题吧,焊接结束,睡觉咯。


助工
2013-06-16 22:12:50     打赏
5楼

焊接测试篇:

最近老师项目催的紧,今天才把板子测了一下,先上图

1.这是流水灯的程序,之前焊LED的时候焊反了,幸好提前发现了改了过来,这个LED是有绿点的一边是负极哦,正极连正极,负极连限流电阻。


 

2.这是动态数码管的显示,焊接的时候也有一些波澜,一个三极管的脚虚焊,导致“1”没显示出来

 


 

3.这是LCD1602的测试效果,大伙儿千万别插反了呀,是朝着外面的插的呀,我也是确认了好久才插上去的,不知道是

   不是因为朝里面插不好布线还是有那个串口插座挡着不好插才这样处理。还有就是1602要调对比度只能换那个1K的电阻

  那个蓝色的电位器是给12864调对比度的哦,嘿嘿。


 

都演示完毕啦,接下来就要开始真正的编程啦,嘿嘿,最近有考试,可能要过段时间更新咯,嘿嘿,很期待哦

 


助工
2013-06-16 22:14:20     打赏
6楼

Quartus II使用篇

 昨天考完试,今天就马不停蹄的更新进程贴啦。

 所谓工欲善其事必先利其器,之前一直使用的是Xilinx的ISE,这次用的Altera的CPLD,当然还是要熟悉QuartusII的编译环境啦,大家一定会问到底是装QuartusII9.0还是11或12,我认为够用就好,而且9.0还自带仿真哦,更高的版本就不带了呢,自带的仿真对我们初学者来说就已经足够的啦,我使用的主要还是逻辑仿真,时序仿真没有涉及过。所以我选择安装了9.0。安装和破解的步骤就不重复啦,我把从新建工程到烧录程序的过程写出来,还有期中遇到的问题也一并写出来,嘿嘿。

步骤1:新建工程:菜单栏中 File-New Project Wizard,然后出现以下的界面,注意:实体名要和工程名一致,不然编译不通过的哦。


步骤2:出现下面这个界面,选择我们使用的CPLD芯片EPM240T100C5,这里应该没什么问题


步骤3:点 File-New,选择Verilog HDL File 或者VHDL File,看个人习惯吧,我使用的Verilog


步骤4:开始敲代码咯。敲完代码,保存。然后 Compile,完成后,进行管脚分配,点击Assignment-Pins,出现下面界面,根绝原理图选择好管脚,关闭此界面,回到主界面后再编译一次。


步骤5:下程序:Tools-Programmer,然后点击左上角的Hardware Setup,出现如下界面,连上开发板和下载线,选择 USB Blaster




步骤6:开发板上电,保证与下载线相连,并与电脑相连,单击左侧的Auto Detect,然后双击编辑区的File,选择下载文件,是.pof文件哦,然后勾选Program和Verify,如图所示,最后点击左侧的Start,就开始下载啦,进度条到100%就好啦。


有一个问题值得我们注意,这是流水灯的实验,但结果中数码管全亮,这是没有配置未使用的管脚状态。

在Assignment-Device,出现如下界面,单击Device and Pin Options


选择Unused Pins,电机如下图的选项,再编译试试,数码管是不是不亮了呀。




助工
2013-06-16 22:14:43     打赏
7楼


LED流水灯篇

首先先上图看一下效果


流水灯实验属于最简单的时序控制程序。

控制流水灯的间隔时间:晶振50MHz,那么时钟的周期就是1/50000000s, 例如间隔为1s,那么我们需要计数计到1/(1/5000000)然后点亮LED就好啦。

注意:这里点亮LED是让引脚为低电平。




助工
2013-06-16 22:15:23     打赏
8楼

数码管篇

  在本篇中,利用按键和数码管完成了计数器的暂停与继续的功能:按下S1时,计数暂停,按下S2时,计数继续。

  这里主要是数码管如何动态扫描,我觉得CPLD/FPGA在动态数码管的编程要比单片机方便的多,因为它是并行处理的,即使CPLD /FPGA在执行其他语句时,数码管仍然不受打扰的在动态扫面,而单片机由于是顺序执行语句,必须得执行其他语句后再动态扫描数码管,这样使得执行比较大的程序时数码管会一闪一闪的,这就是扫描速度不够,超出我们眼睛的视觉暂留时间咯,,所以以前编单片机的时候宁可用1602也不想用数码管。好啦,言归正传。

  这里写了一个计数器,计数值用count表示,判断count某一位或某两位的值,分别对应的送段选值和位选值。比如:显示2位数码管A,B,那么判断count[11],是1:位选选择数码管A,同时段选送数码管A要显示的值;是0:位选选择数码管B,段选送数码管B要显示的值,这样,扫描周期为0.04ms,远远小于人眼的视觉暂留时间的啦。

  暂停和继续功能:判断按键值后,只要将count值停止或开始计数就行啦。

  将0-9的段选值写成parameter型的常数,方便以后直接使用,如“0”是11000000,从高到低是dp,G,F,E,D,C,B,A,这个顺序与你管脚分配时的管脚要对应。

  最后一定要把未使用的引脚设成“弱上拉”,不然数码管啥也看不清哦。

  视频:






视频地址:http://union.bokecc.com/flash/single/290666218ACBA694_D026AABAD72DEC0B9C33DC5901307461_false_EEA982EE6B20F4D1_1/player.swf


助工
2013-06-16 22:17:08     打赏
9楼

串口篇

      串口在单片机调试中也算是调试代码的利器,可是以前单片机基本上都有串口,我们所要做的无非就是把要发送的数据写给某一寄存器,然后等他发完就OK啦,接收也是同样的道理,那时候的我虽然经常在用串口,但是对串口还是没有真正的理解,波特率?起始停止位?奇偶校验位?统统只要配置寄存器。学到FPGA就不一样啦,啥也没有,我想这也正体现了FPGA的灵活性嘛。现在我们要开始模拟串口时序啦。

      我将工程分为四个模块:波特率发生器,串口接收,串口发送。

      模块1(波特率发生器):什么是波特率呢?波特率就是每秒发送/接收位(bit)的个数,比如1s发2个字节,1个字节8bit,那么波特率就是16,一般串口都用9600,115200啥的,说到这里,大家都应该知道了,这个模块其实就是一个分频器罢了,如果要9600的波特率,那么只要将频率为50M的时钟分成频率为9600*8Hz就好啦,大家会说,乘以8做啥呀,一会儿后面说。

      模块2(串口接收):首先判断第一位是不是“0”(不要问我为什么,这是串口协议规定,起始位为0),若为0,则开始判断接下来8位的值,这8位才是真正的数据,8位数据判断完了,再判断奇偶校验位(如果发送方有的话),最后“判断”停止位,说是判断,其实谁关心停止位是啥呀,你说是吧,说白了就是给它面子,让时间流过停止位而已。但是呢,你要按我说的做呢,十有八九在串口调试助手里是木有结果的,为什么呢?这里要说说模块1中的“乘以8”,其实在判断每一位时,我们都要判断8次,取值呢就取8次判断中出现次数超过半数的1”或“0”,这样能更好的抗干扰能力,嘿嘿,这样就算成功了一大半啦。

      模块3(串口发送):发送要比接收简单多了,毕竟主动权在自己手中呀,同样的,也要发送“起始位+数据位+奇偶校验位(有的话)+停止位”,这里每一位要保持8个周期哦,因为波特率是9600*8呀。

      整个工程的功能呢就是将串口接收的数据再发回串口调试助手。

     视频观看:


视频地址:http://union.bokecc.com/flash/single/290666218ACBA694_F130E91EDB6302FF9C33DC5901307461_false_EEA982EE6B20F4D1_1/player.swf


助工
2013-06-16 22:17:43     打赏
10楼

LM75使用

     看见群里一直有人问这个芯片肿么焊,我是这样焊的,板子正对着自己,芯片倒着放,芯片上的字是反着的。这样焊,芯片工作正常,读出的数据也很完美,你值得一试。

     这款芯片怎么说呢,知名度没有DS18b20高,谁让别人是单总线这么个新鲜玩意呢。理论上说一条IIC总线上可挂接8个LM75,这样的规定地址和24C0X系列一样,言归正传,看看FPGA是怎么样模拟IIC总线的呢。

     首先咱们打开LM75数据手册LM75.pdf,看到SCL的周期最小到2.5us,也就是说,IIC的操作频率不能高于400KHz,这速度可比串口快多了哈,我这里用的是100KHz,同理,写了一个分频器。然后我将一个周期分成4个部分,分别是“上升沿”、“高电平中心”、“下降沿”、“低电平中心”(这里参考了网上默默奉献的大牛们的思路,在此表示非常的感谢,是你们带领我们这些菜鸟进步),“上升沿”对应的计数值到来时,SCL=1,“下降沿”对应的计数值到来时,SCL=0,这样SCL就一直在工作了,不仅如此,众所周知,sda在SCL上升沿时锁存信号,这时,我们可以每次在SCL在“低电平中心”时送sda数据,这样的话,SCL上升沿的时候,sda数据必定是稳定的,至于为什么要在低电平中心呢?我想可能中心点的SCL有比较稳定的电平(相比在上升沿会有上升时间或波动啥的),这里希望大牛们能给我们指点一些迷津。

     底层工作做好啦,下面就是搭建上层建筑,包括起始时序、写时序、(从机、主机)应答时序、停止时序、读时序,这些可以从24C02的数据手册里看到24c02串行储存器中文官方资料手册.pdf

     知道了以上这些时序呢,最后就是先发啥指令,再发啥指令。。。。。。我是这样的:

     1. 写指令:0x90,这是写器件地址,意思就是我选你了。

     2. 写温度寄存器地址:0x00,这是存温度值的寄存器,即写入要读的寄存器的地址。

     3. 结束一个写周期

     4. 重新开始,写指令:0x91,这是读器件地址。

     5. 读16位温度值(其实就前8位是有效的),记住:每读8位温度值,主机要给LM75一个应答,最后一个字节读完,主机来一个非应答(用完了就不管别人死活)然后停止。

     注意:每次应答的时候我都是象征性的跳过一个SCL周期,以前死磕着判断sda是否为低,最后程序就一直循环着死磕,可能从机都应答完了,你没采到值罢了;sda未使用或者作为input使用时最好将其设置为高阻态。

     特别注意:由于读出的温度值要分离出十位和个位,我们自然而然的想到用“/”和“%”,之前一直使用的ISE,FPGA不支持除法,ISE也不支持,得自己添加核。早就听闻Quartus比较人性化,编译的时候自动添加除法和取模的核,我自然而然的跃跃欲试,综合一下,果然自动添加核,令我兴奋不已,可是却显示使用了300多个逻辑门,而这款CPLD却只有240(单位不知道是什么呀),一看两个核用了100多逻辑门,心里顿时拔凉拔凉的,无奈,还是用了老办法:case语句罗列出所有可能性,大神们有什么更可行的方案不?咱们可以交流交流。

     还有,IIC时序控制我全部使用的是状态机来控制的,使得程序十分累赘,但自己读起来比较好理解,想请教一下大神们有什么好办法不?

     视频观看:


视频地址:http://union.bokecc.com/flash/single/290666218ACBA694_9A8226AA2B78F0C39C33DC5901307461_false_EEA982EE6B20F4D1_1/player.swf


共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]