0

关于投票
用CPLD设计实现串口(UART)

    UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信,UART主要有由波特率发生器、发送部分和接收部分等组成。

    我这里设计的这个串口是很简单的一个,不带数据校验位的,波特率为固定的9600,其实波特率可选可以用按键很方便的实现,我这只是为了实现串口的最小系统。

    UART的接收和发送是按照相同的波特率进行收发的(当然也可以实现成对的不同波特率进行收发)。UART收发的每一个数据宽度都是波特率发生器输出的时钟周期的16倍,即假定当前按照9600bps进行收发,那么波特率发生器输出的时钟频率应为9600×16Hz,当然这也是可以改变的,我只是按照UART的方法进行设计,这样可以准确地接收到数据而不出错。我这里用的晶振是11.059200MHz,可以用计数器的方式生成所需要的各种波特率,这个值的计算原则就是11059200/(16×所期望的波特率),如果希望输出9600Hz的波特率,那么这个值就是11059200/(16×9600)=72,波特率发生模块就是一个分频模块,这里就是对11.059200MHz进行72分频,图如下:

点击看大图

    接收部分的起始位可由发送来的数据由逻辑1变为逻辑0为一个数据帧的开始。接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个clk16x时钟周期,才是正常的起始位,然后在每隔16个clk16x时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。还要输出一个数据接收标志信号标志数据接收完。接收部分仿真波形如下图:

点击看大图

    最后一个模块就是发送部分,当接收器完成一帧数据的接收时,就将接收到的数据送到发送器,再由发送器将这一帧数据从高位到低位一位一位发出 ,这里在发送这帧数据开始前要发送一个起始位(低电平0),然后发送8位数据,最后再发送一位停止位。一帧数据发送完毕后输出标志为以示发送完毕。发送部分仿真波形如下图:

点击看大图

    仿真好后确认无误,最后将这三个模块连在一起,就构成了一个UART,下面是顶层模块连接图:

点击看大图

    最后对这个UART进行仿真,波形如下图:

点击看大图

    完成以上功能仿真后,我把最后的程序下载到了实验板上,用串口调试精灵进行了测试,结果准确无误,这是我今天的劳动成果,如设计由什么错误、不当之处还请广大朋友指出,谢谢。

系统分类: CPLD/FPGA
用户分类: FPGA/CPLD
标签: UART CPLD
来源: 原创
发表评论 阅读全文(1042) | 回复(4)

5

关于投票
基于CPLD的DDS正弦信号发生器的设计

    这几天终于实现了DDS正弦信号的发生,限于CPLD的128宏单元不够用也不知道怎么优化,后来就干脆把按键、频率显示、频率控制字交给单片机控制产生,再由单片机讲频率控制字传送给CPLD,这样就实现了频率的控制。最终产生的正弦信号频率范围为1HZ~30KHZ,频率可步进1HZ也可通过单片机预置,也可以自动扫频信号。起先出来的频最大误差达到2HZ多,觉得不对劲出来的频率应该很精确不会有这么大的误差,后来发现原来是晶振不准有点误差,后来经程序修改使输出最大频率误差在0.1HZ以内,经过这几天的努力总算感到了一点的欣慰,呵呵。

这是VHDL顶层模块:

点击看大图

这是当k=001111111111111时的仿真波形:

点击看大图

    单片机控制6个数码管显示当前的频率,P1口接4个功能按键,分别是+、-、选择和扫频,再用两片574向CPLD输出频率控制字。限于时间暂时做到这么多。

    在说一点吧,由于是用DAC0832转换的(转换时间1us)所以晶振就限制在1M之内了,出来的最大频率,根据奈奎斯特采样定理也就限制在0.5MHZ之内了(不过失真很大的,取小点好了),最后对出来的波形再做滤波就可以了。

系统分类: CPLD/FPGA
用户分类: FPGA/CPLD
标签: DDS CPLD 正弦信号
来源: 原创
发表评论 阅读全文(2128) | 回复(89)

0

关于投票
对CPLD的困惑
    这几天在做基于DDS的信号发生,由于CPLD内部资源不是很多而且我把正弦数据定义成数组形式调用又占用了一大部分资源,在设计时经常宏单元不够用,又不了解其内部宏单元分配,要不然还可以优化下。现在把正弦数据压缩到1/4数据了,出来的正弦波范围1.9XXX HZ~31.250KHZ,步进为1.9XXX HZ。由于DAC用0832,所以最高频率提不上去。。。接下来再好好研究CPLD,或把数据放到ROM再用高速DAC来设计要求的信号。。。加油了。。。
系统分类: CPLD/FPGA
用户分类: FPGA/CPLD
标签: 无标签
来源: 原创
发表评论 阅读全文(607) | 回复(2)

4

关于投票
基于CPLD的交通灯控制系统

    经过了几天的琢磨研究,现在对VHDL语言又有了大概的了解。上学期是上过EDA的课,也做过实验,但是那实验程序全都不用我们自己写的,我们只要理解程序并下载运行成功就OK?所以要写一个VHDL程序还是有点难度的。现在自己又要往这方面发展,只能是从头开始学习。。。不过我相信自己能够学好的icon

    这个交通灯控制程序是今天参考着书本写的,经过这个程序后我个人认为写VHDL程序跟C一样,最好将各个功能模块分开,这样又清楚又不容易出错。刚开始写的时候我把什么可能都放在一起看的自己类,找错更累。。。呵呵。

    这是顶层模块:

点击看大图

    顶层模块中有:分频模块、主控制模块、倒计时分位模块、七段译码模块、显示模块,四位LED数码管是采用动态显示的。

    这是工程文件包,供大家学习研究:rar

系统分类: CPLD/FPGA
用户分类: FPGA/CPLD
标签: CPLD 交通灯
来源: 原创
发表评论 阅读全文(1182) | 回复(5)
总共 , 当前 /