《企业学习Ⅲ2研发实习报告》Word文件下载.docx
《《企业学习Ⅲ2研发实习报告》Word文件下载.docx》由会员分享,可在线阅读,更多相关《《企业学习Ⅲ2研发实习报告》Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
本研究的重点就是用VHDL来实现DDS的功能,能够达到高精度的输出,同时标准波形数据生成存放在ROM中,可以简化运算过程,提高运算速度,加快反应时间。
本设计主要通过VHDL语言实现频率控制、波形控制、波形数据的提取、波形的产生工作。
其中,波形数据运用VHDL语言编写,整个试验3种信号的产生都是采用分频原理。
控制部分主要采用产生高低电平的拨码开关控制。
程序下载到FPGA上实现。
并通过Altera公司QuartusII9.0软件进行波形的仿真,从而完成整个设计。
考时钟的作用下,对输入的频率数据进行累加,并且将累加器的输出一部分作为读取波
(1)分频原理
所谓“分频”,就是把输入信号的频率变成成倍数地低于输入频率的输出信号。
文献资料上所谓用计数器的方法做“分频器”的方法,只是众多方法中的一种。
它的原理是:
把输入的信号作为计数脉冲,由于计数器的输出端口是按一定规律输出脉冲的,所以对不同的端口输出的信号脉冲,就可以看作是对输入信号的”分频“。
至于分频频率是怎样的,由选用的计数器所决定。
如果是十进制的计数器那就是十分频,如果是二进制的计数器那就是二分频,还有四进制、八进制、十六进制等等。
本设计的所有方波都是采用二分频,矩形脉冲和伪随机码是用分频的方波频率作为输入时钟脉冲产生。
而分频分为很多种,比如偶数分频,奇数分频,小数分频等等。
这次试验主要运用了偶数分频,偶数倍分频通过计数器计数是很容易实现的。
如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。
以此循环下去。
这种方法可以实现任意的偶数分频。
本次试验的方波频率产生都是用偶数分频原理产生,伪随机码和矩形脉冲也是用分频的方波作为输入时钟周期来产生。
(2)伪随机码原理
伪随机序列又称m序列或伪噪声序列,它是有带线性反馈的移位寄存器产生的周期最长的一种序列。
它是一种可以可以预先确定,并且可以重复产生和复制,又具有随机统计特性的2进制码序列。
伪随机序列所具有的的主要特点有以下4点:
(1)每个周期中,“1”码出现2n次,“0”码出现2n-1次,即0和1出现的概率几乎相等。
(2)m序列中连续出现1的数目是n,连续出现0的数目是n-1。
(3)分布无规律,具有和白噪声相似的伪随机特性。
(4)移位相加特性,即m序列和它自身的移位序列模2相加所得的序列仍是该m序列的某个位移序列。
称f(x)为特征多项式。
(3)矩形脉冲原理
矩形脉冲发生器和方波的区别在于,方波的高电平和低电平所占时间相等(即占空比为50%),而矩形脉冲则不等。
由于对矩形脉冲的速率有要求,所以在程序中用分频计数的方法来实现矩形脉冲。
(4)选择输出实现
Y<
=c1whenDD="
1110"
else
c2whenDD="
1101"
c3whenDD="
1100"
c4whenDD="
1011"
c5whenDD="
1010"
c6whenDD="
1001"
c7whenDD="
1000"
c8whenDD="
0111"
c9whenDD="
0110"
c10whenDD="
0101"
c11whenDD="
0100"
c12whenDD="
0011"
'
Z'
;
输出选择用四位拨码开关。
2.方案比较与选择
图1-2改进的系统框图
在六周实训中,把由FPGA控制LCD实时显示换成了由52单片机来控制显示部分。
由于分频的时候有奇数和偶数分频,所以本来将分频分成了奇数和偶数分频,后来发现在实际实验中,输出的方波脉冲占空比不一定要50%。
在分频时,本来决定把用倍频器来把信号频率慢慢加上去,后来意识到可以直接用分频,就用了分频。
二、理论分析与计算
1.伪随机码的设计计算
任务与要求:
伪随机码:
方案如下:
伪随机序列长度为
,首先要找到长度为255的伪随机序列特征多项式
确定关系式
。
2.方波频率的设计计算
方波频率:
由于FPGA的晶振为50MHz,所以产生的所有频率都可以用50MHz分频而来。
,
所以分频程序可以分别为12,、25、50、1562、3125、6250、25000、50000分频。
3.矩形脉冲的设计计算
(1)F=8KHz
设计VHDL模块,输入模块的时钟信号为50Mhz输出如以下参数的方波信号,频率为8KHZ,周期为125us,占空比为4/5的方波信号。
输入的信号周期T=1/50M=0.02us,要输出125us的信号就需要计数器来实现,并且占空比为4/5,那么
输出信号的低频范围:
T1=125/5*4=100us;
需要计数次数为N1=100/0.02=5000;
输出信号的高频范围:
T2=125/5=25us;
需要计数次数为N2=25/0.02=1250;
因此,当计数在n<
1250时输出高频信号,当1250<
n<
62时输入低频信号,然后计数清零。
(2)F=16KHz
设计VHDL模块,输入模块的时钟信号为50Mhz输出如以下参数的方波信号,频率为16KHZ,周期为62.5us,占空比为4/5的方波信号。
输入的信号周期T=1/50M=0.02us,要输出62.5us的信号就需要计数器来实现,并且占空比为4/5,那么
T1=62.5/5*4=50us;
需要计数次数为N1=50/0.02=2500;
T2=62.5/5=12.5us;
需要计数次数为N2=12.5/0.02=625;
因此,当计数在n<
625时输出高频信号,当625<
3125时输入低频信号,然后计数清零。
三、电路和程序设计
本次设计的系统信号发生器在QuartusⅡ9.0下的RTL图如图3.1所示。
图3-1系统RTL图
1.分频器
主要程序如下:
ifclkin2'
eventandclkin2='
1'
then
if(a=n-1)thena<
="
0000000000"
elsea<
=a+1;
endif;
ifa>
n/2thenclkout2<
='
0'
elseclkout2<
endif;
2.伪随机码
移位寄存器如下图所示:
图3-2移位寄存器
3.矩形脉冲
if(clkin'
eventandclkin='
)then--输入信号发生变化;
if(clkcount<
5000)then--判定计数器的计数;
clkcount<
=clkcount+1;
--计数器自增;
clkout10<
--输出低频信号;
elsif(clkcount<
6250)then
clkcount<
--输出高频信号;
elseclkcount<
0000000000000000"
--计数器清零;
endif;
4.LCD显示
在实验中,我们选择用单片机来控制LCD实时显示输出波形的参数。
用52单片机的P1.0-P1.3口来作为拨码开关的输入端,P0.0-P0.7来作为12864液晶的D0-D7控制它的并行数据传输。
其硬件连线图如图3-3所示。
图3-3LCD连接图
四、测试与结果分析
1.测试条件
仪器:
示波器、数字万用表。
2.测试方案
将FPGA的输出端接到示波器上显示输出波形。
LCD显示部分在LCD上实时显示出来。
3.测试结果与分析
图4-112分频仿真结果
图4-2矩形脉冲8KHz的仿真结果
图4-3伪随机码的仿真结果
图4-432KHz的方波图4-532KHz的方波LCD显示
五、总结与展望
信号发生器是科研及工程实践中最重要的仪器之一,以往多使用硬件组成,随着信息技术高速发展,集成电路的大规模使用,电子系统已经进入了一个高速发展的全新时段。
特别是EDA技术的日趋成熟的今天,通过计算机辅助设计,可以很好地完成电子设计的自动化。
在设计过程中,可根据需要随时改变器件的内部逻辑功能和管脚的信号方式,EDA技术借助于大规模集成的FPGA/CPLD和高效的设计软件,用户不仅可通过直接对芯片结构的设计实行多种数字逻辑系统功能,而且由于管脚定义的灵活性,大大减轻了电路图设计和电路板设计的工作量及难度,同时,这种基于可编程芯片的设计大大减少了系统芯片的数量,缩小了系统的体积,提高了系统的可靠性。
基于FPGA的正弦信号发生器结合了的EDA技术和DDS理论,在EDA技术高速、高效、高可靠性的前提下得到了更优的设计效果。
但是系统的功能还没有得到完全利用,由于DDS技术是利用查表法来产生波形的,则在基于FPGA设计时只要把ROM改成RAM变可实现任意波形的产生。
本次设计在总体上符合设计要求,能较好的实现设计功能。
其中也存在有不足之处。
第一,在累加器设计中,没有采用流水先设计。
因而累加器系统工作频率没能得到提高,性能不够优越。
第二,设计波形ROM是没有很好地利用正弦信号的对称性来设计波形数据,对系统输出信号的精度有一定的影响。
第三,外围电路没有设计键盘输入模块,使得操作不够直观灵活。
以上的几点不足,自己希望在今后的再次设计中都能得到完善的弥补。
在本课题的完成中,我得到了很多人的帮助,在此表示衷心的感谢!
首先感谢我们的导师黄老师以及程老师,任老师,我们的课题是在他们的指导和帮助下完成的,回答了我们很多难以解决的问题,对我们的课题完成起到了至关重要的作用。
同时也要感谢我们组员之间的相互帮助,六个礼拜让我们互相学到了很多知识,感谢给予我理论帮助的各位参考文献的作者。
六、参考资料
[1]马忠梅.单片机的C语言应用程序设计.第五版北京航空航天大学出版社.
[2]樊昌信.通信原理.国防工业出版社
[3]EDA技术与应用
附录
1.12分频程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpin12is
port(clkin2:
instd_logic;
clkout2:
outstd_logic);
endfenpin12;
architectureaoffenpin12is
signalA:
std_logic_vector(9downto0);
begin
process(clkin2,a)
if(a=11)thena<
5thenclkout2<
endprocess;
enda;
2.伪随机码程序
entityweisuijiis
port(clk:
Q:
outstd_logic);
endweisuiji;
architecturebehavofweisuijiis
signalc0,c1,c2,c3,c4,c5,c6,c7:
std_logic;
signalload:
bit;
process(clk,load)
begin
ifclk'
eventandclk='
then
if(load='
)then
c7<
c6<
c5<
c4<
c3<
c2<
c1<
c0<
load<
ELSE
=c1;
=c2;
=c3;
=c4;
=c5;
=c6;
=c7;
=c0xorc4xorc3xorc2;
Q<
=c0;
endprocess;
endbehav;
3.矩形脉冲程序
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
--设计库和程序包调用;
entityzhankongbi8is
port(clkin:
clkout10:
--电路模块端口说明和定义;
Endzhankongbi8;
architecturehxlofzhankongbi8is
signalclkcount:
std_logic_vector(15downto0);
begin--结构体说明部分;
process(clkin)
if(clkin'
clkcount<
clkout10<
elseclkcount<
--结束;
endhxl;
4.十二选一程序
LIBRARYIEEE;
entityMUX121Ais
port(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12:
DD:
instd_logic_vector(3downto0);
Y:
endentityMUX121A;
architectureBHVofMUX121Ais
endarchitectureBHV;
5.LCD显示程序
#ifndef_lcd12864_H_
#define_lcd12864_H_
#include"
define.h"
#defineRECP0
sbitR_S=P2^5;
sbitW_R=P2^6;
sbitEN=P2^7;
voiddelay(unsignedintm)
{
unsignedinti,j;
for(i=0;
i<
m;
i++)
for(j=0;
j<
10;
j++);
}
voidLcd_Write_Data(unsignedcharLcd_Write_Data)//writedata
W_R=0;
R_S=1;
delay
(1);
REC=Lcd_Write_Data;
EN=1;
EN=0;
voidLcd_Write_Com(unsignedcharLcd_Write_Com)//writecommand
R_S=0;
REC=Lcd_Write_Com;
voidLcd_Pos(unsignedintx,unsignedy)//originaldiaplayedposition
unsignedcharLcd_Pos;
switch(x)
{
case1:
Lcd_Pos=0x80+y-1;
break;
case2:
Lcd_Pos=0x90+y-1;
case3:
Lcd_Pos=0x88+y-1;
case4:
Lcd_Pos=0x98+y-1;
default:
break;
}
Lcd_Write_Com(Lcd_Pos);
voidLcd_Init(void)//lcd'
sinitalization
Lcd_Write_Com(0x30);
delay(100);
delay(37);
Lcd_Write_Com(0x08);
Lcd_Write_Com(0x10);
Lcd_Write_Com(0x0C);
Lcd_Write_Com(0x01);
delay(10);
Lcd_Write_Com(0x06);
voidLcd_Usedata(unsignedchar*p)//writediaplayeddata
{
while(*p>
0)
{
Lcd_Write_Data(*p);
p++;
voidLcd_Vardata(longdat)//5位数去零操作
ucharwan,qian,bai,shi,ge;
wan=dat/10000;
qian=dat/1000%10;
bai=dat/100%10;
shi=dat/10%10;
ge=dat%10;
if(wan==0)
Lcd_Usedata("
"
);
Lcd_Write_Data(0x30+wan);
if(!
wan&
&
!
qian)
Lcd_Write_Data(0x30+qian);
qian&
bai)
Lcd_Write_Data(0x30+bai);
bai&
shi)
Lcd_Write_Data(0x30+shi);
Lcd_Write_Data(0x30+ge);
voidLcd_Dotdata(longdat)//小数拆分
ucharQian,Bai,Shi,Ge;
Qian=dat/1000%10;
Bai=dat/100%10;
Shi=dat/10%10;
Ge=dat%10;
Lcd_Write_Data(0x30+Qian);
Lcd_Write_Data(0x30+Bai);
."
Lcd_Write_Data(0x30+Shi);
Lcd_Write_Data(0x30+Ge);
#endif