急求个FPGA的DAC0832的 D⼀A转换程序

rtDAC0832有D⼀A转换的程序吗? 急。。。。。。。 只能用VHDL编的
2024-11-17 15:58:58
推荐回答(1个)
回答1:

利用FPGA与单片机相结合设计的波形发生器
利用FPGA与单片机相结合的方法,使用单片机控制FPGA产生频率为10Hz~20kHz的正弦波,锯齿波,三角波和四路分别占空比0到100%可调的PWM波形。该波形发生器以单片机(MCS8031)为中心控制单元,由上位机界面,波形发生模块和D/A转换模块组成。采用DDS(直接数字频率合成)技术,通过VHDL语言,单片机C语言,VC++语言实现了对正弦波,锯齿波,三角波频率以及四路PWM波占空比的设置和发生。
1 引言
可编程逻辑器件(PLD)及EDA技术的应用成为电子系统设计的潮流。FPGA是一种新兴的可编程逻辑器件(PLD),与其它PLD相比,具有更高的密度、更快的工作速度和更大的编程灵活性。单片机以其体积小、功能齐全、价格低廉、可靠性高等方面所具有的独特优点,长期以来被广泛的应用在各领域。
基于FPGA的高密度、高速度、现场可编程的能力和单片机强大的数据处理功能,制作了波形发生系统,用于产生频率为10Hz~20kHz的正弦波,锯齿波,三角波和四路分别占空比0~100%可调的PWM波。
2 系统设计
整体设计由四个部分组成:上位机部分,单片机部分,FPGA部分,模拟电路部分。
波形发生器以单片机(MCS8031)为中心控制单元,由上位机控制界面,波形发生模块和D/A转换模块组成,采用DDS(直接数字频率合成)技术,将要求的波形数据存储于FPGA内构建的ROM当中,单片机跟据上位机的命令输出查表地址等信息至FPGA,FPGA产生相应得波形数据经D/A转换器输出。
2.1 单片机部分
在设计中采用MCS8031为处理器,选择P1.0,P1.1作为波形选择信号,P1.2作为FPGA的复位信号,P2.5作为DACO832的片选端,P0口作为低8位地址和数据线。单片机接收来自上位机的命令信息后将相应的波形设置信息输出到FPGA,并控制DAC0832的使能。
2.2 FPGA部分及模拟电路部分
波形发生采用DDS技术可以很方便地产生各种高质量的波形。DDS技术是从相位概念出发之结合成所需要波形的一种频率合成技术。以正弦波为例,首先要按照一定的采样点数将正弦波形一个周期的数据信息存于ROM表中,表中包含着一个周期正弦波的数字幅度信息,每个地址对应正弦波中0到360度范围内的一个相位点的幅度值,查找表时即是把输入的地址相位信息映射成正弦波幅度的数字量信号,以驱动D/A转换电路。DDS方法通过查找表输出信号的频率可由下式给出:
Fout=(x*[Fclk])/Y; Y为2的N次幂;
其中频率控制字与输出信号的频率成正比,因此可以通过改变寻址的步长来改变输出信号的频率,因为在确定了累加器的位宽N和寻址位宽M,以及系统时钟Fclk后,随着步长X的增加,在每次累加器循环的一个周期中,输出的M为查找表的地址个数就会减少,相应输出一个中期波形的时间也就会减少,输出信号的频率相应增加,这就是DDS的方法。
需要注意的是,随着步长和输出频率的增加,输出信号的采样点数会减少,会降低产生波形的精度和平滑度,因此也限制了输出信号的最高频率,而且由采样定理可知,所产生的信号频率不能超过时钟频率的一半,在实际应用中,为了保证信号的输出质量,输出的频率不要高于时钟频率的33%,以避免混叠或谐波落入有用输出频带内。
为了提高所产生的波形频率,采用高频率特性的FPGA(ALTERA EPF10K10LC84-4)。后级电路采用有较高的转换速度的DAC0832作为D/A转换。
在FPGA内实现ROM表的资源是有限的,并且ROM表的大小随着地址位数和数据位数的增加成指数递增关系,因此在满足采样信号性能的前提条件下,如何减少资源的开销就是一个重要的问题。在实际设计时,充分利用了正弦波信号周期内的对称性和算术关系来减少ROM表资源的开销,因此通过一个正弦表的前1/4周期就可以通过相位变换得到其整个波形周期的采样值,这样就节省了将近3/4的资源。
对于PWM波部分,采用分频器,累加器与比较器结合的方式实现,对于各个部分采用模块化设计分别实现,并在顶层文件中连接在一起可以方便进行修改,扩展和移植。
正弦波,三角波,锯齿波的部分VHDL源程序如下:
p_rom:process(clk,reset)
begin
if clk'event and clk='1' then
clk_rom<=clk_rom + frq_data;
case p1 is
when "00"=>rom_address<=clk_rom( 19 downto 13)+"000000000";
when "01"=>rom_address<=clk_rom( 19 downto 13)+"010000000";
when "10"=>rom_address<=clk_rom( 19 downto 13)+"011111111";
when others=>null; end case; end if;
end process p_rom;
2.3 上位机部分
利用Windows系统中提供的串行通讯功能完备的ActiveX控件即MSComm控件实现与单片机的通信。MSComm控件具有编程容易实现,简捷方便等优点,但仅在对话框中使用。根据波形发生器的特点和要求,MSComm控件可以完全实现要求。
像其他控件一样,通信空间也是用一系列的属性和用户接口,控件提供了许多属性,大部分属性仅和Modem有关,下面将常用的属性做一下简要说明:
CommPort:设置并返回通信口号,缺省值为COM1。
Settings:设置并返回波特率、奇偶校验、数据位、停止位的字符串。其中波特率的范围为300b/s到19200b/s。
PortOpcn:设置并返回通信口的状态,同时用来打开和关闭通信口。
InputLen:决定每次Input读入的字符个数,缺省为0,表示读取接收缓冲区的全部内容。
nput:读入并清除接收缓冲区的字符。
InBuferCount:返回接收缓冲区已接收的字符数,通过置0可清除接收缓冲区。
Output:将发送的字符串或数组写到发送缓冲区。
InputMode:定义Inpput属性获得数据的方式。
Rthreshold:设置、返回在通信控件置ComEvRecieve并激发OnComm事件前要接收的字符数。
SThreshold:设置、返回通信控件置ComEvSend并激发OnComm事件前发送缓冲区中的最少字符数。
另外,由于在VC界面中出现的是10到20k的整型数据,因此需要将此频率数据转换成16位的频率控制字送给单片机,转换程序如下:
void CWaveDlg::CalculateFreq(unsigned int unFreq)
double m;
m=unFreq*0.0001024;
m=m*1024;
CommandMCU.uchLowData= (unsigned char) m%256;
CommandMCU.uchHighData=m/256; return;