eda设计(vhdl) 正弦波发生器

eda设计(vhdl) 正弦波发生器,第1张

是要一个正弦波表,你在FPGA里面生成一个正弦波表,有工具的,输入DA转换器位宽

他会知道出来一个正弦波表文件,你在quartus的rom生成包含这个文件,好像是mif文件。

那后就是读这个ROM,读出来的数据送到DA转换器上。DA转换首档答蠢贺器输出端并联个小电容。要不然是示波器放大看的不死纯粹的正弦波,而是阶梯的正弦波了

控制FPGA/CPLD

读完这个ROM表的数据,就是输出一个正弦波周期了。

读出的速度快慢就是周期了。,比如你5s读完这个ROM表

,正弦波周期就是5s,频率就是0.2HZ了

,1秒读完就是1Hz了。0.01秒读完,就是100Hz了。。。

比如你的正弦波表里面是有4096个数据的,你0.01秒读完这4096个数据,算算这个读表的频率是多少

,每个数据是0.00000244140625秒,折合频率是409600

就是409.6K的频率去者慧读这个ROM表。其他的一样。

你明白了吧?

一般是用DDS做的,频率可以连续可调的。

FPGA一般是分频时钟的,多是整数分频的,

连续新不好。

比如用40.96M的时钟不分读ROM表,输出频率是10K

2分频输出当然是5K

楼上说得对,主要是num没有初值,所以仿真器不知道如何计算num。至于clr是0有效还是1有效,完全看你自己的定义。一般来说,我们习惯把低电平有效的信号定义成后缀为_n的,比如reset_n。

再说你这段程序,如果只是做一个正弦波的,也就算了。但是如果要做不同的周期信号,显然每次改起来就麻烦了。可以试试这种方法,把64点数据存成一个数组,然后循环从数组取数据。

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_arith.all

use ieee.std_logic_unsigned.all

entity wav is

port (

clk, rst : in std_logic

wav_data : out std_logic_vector(7 downto 0)

)

end wav

architecture wav_arch of wav is

type data_array is array (natural range<>) of std_logic_vector(7 downto 0)

constant sin_data : data_array := (

x"FF", x"FE", x"FC", x"F9", x"F5", x"EF", x"E9", x"E1",

x"D9", x"CF", x"C5", x"BA", x"AE", x"A2", x"96", x"89",

x"7C", x"70", x"63", x"57", x"4B", x"40", x"35", x"2B",

x"22", x"1A", x"13", x"0D", x"08", x"04", x"01", x"00",

x"00", x"01", x"04", x"08", x"0D", x"13", x"1A", x"22",

x"2B", x"35", x"40", x"4B", x"57", x"63", x"70", x"7C",

x"89", x"96", x"A2", x"AE", x"BA", x"C5", x"CF", x"D9",

x"E1", x"E9", x"EF", x"F5"游大, x"F9", x"FC", x"FE", x"FF"

)

constant POINTS : integer := 64

signal cnt : integer range 0 to POINTS-1

begin

process(rst, clk)

begin

if rst = '1' then

cnt <= 0

wav_data <= x"00"

elsif rising_edge(clk) then

if cnt >= POINTS-1 then

cnt <= 0

else

cnt <= cnt + 1

end if

wav_data <= sin_data(cnt)

end if

end process

end wav_arch

然后在仿真器答渗里让它显示模拟信号,就能看到正弦波了。以上程序在modelsim里运行成功。

这样,只要修改数组的内容,你就能得到不同的波型。如果你设定几组数组,然后用一个信号来选择输出哪种波型,也只需要修改一神举竖点点语句。

首先,你的板子上有个D/A转换器,要先把这部分驱动写好,目的在于每隔固定的时间向外送一个数据。

简单来说,如果你做个了驱动,每1us向外送1个橡氏橡数,如果你送五个0xFF,再送五个0x00,然后如此循环发送的话,你的D/A输出将是一个方波。5us高,5us低,也就是说周期10us,100K的方波。

换个角度,你核信有一个数组,里面有10个数,前5个是0xFF,后5个是0x00。如果你把这个数组的数循环往外送,将得到跟上面一样的方波。

现在可以看出来了,只要你把形成一个周期的波型数据存在一个数组里,循环定时往D/A送就行了。

具体实现的时候,要看你所需要的精度了。一般我们开个256点梁旁的数组就可以了,怎么计算这256个数,不用我说了吧。算了,还是提一下吧。

三角的:前半个周期i=0~127,data=0xFF * (i)/128;后半周期i=128~255,data=0xFF * (256-i)/128。

正弦的:data=0xFF * sin(i/256*360)

然后就是周期了,只要改变你送数据的间隔就可以得到不同的频率了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12454369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存