他会知道出来一个正弦波表文件,你在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)
然后就是周期了,只要改变你送数据的间隔就可以得到不同的频率了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)