FPGA设计——正弦信号发生器
admin
2023-08-03 22:00:14
0
  1. 概述

    FPGA具有高度实时的特性。这里讨论基于FPGA设计一款简单的正弦信号发生器。


  2. DDS原理

    Direct Digital frequency Synthesis如下图所示:

    FPGA设计——正弦信号发生器


3. DAC原理

这里DAC采用TLC5620,下面分别给出DAC的原理图和时序图。

FPGA设计——正弦信号发生器

FPGA设计——正弦信号发生器


4. ROM文件的生成

ROM波形可以通过MIF或HEX文件保存在FPGA的ram或rom模块中,也可以自己编写HDL文件存储。这里我们采用后者。

利用win-tcmatlab生产所需格式的函数数据,参考C代码如下:

#include "stdio.h"
#include "math.h"
#definePi 3.1416
#defineDEPTH 256
#defineLENTH DEPTH/2
intmain()
{
    FILE*fp;
    int j;
    unsigned char i= 0;
    unsigned char x= 0;
    if((fp=fopen("d:\\sin.txt","w"))==NULL)
    {
        printf("can't open this file..\n");
        exit(0);
    }
    for(j=0;j


5. DAC控制逻辑设计

module dac_ctrl(
		input clk,
		input rst_n,
		
		output reg dac_clk,
		output reg dac_load,
		output reg dac_ldac,
		output reg dac_dat,
		
		input [7:0] rom_dat,
		output reg [7:0] rom_addr,
		
		input [7:0] freq_ctrl
);

//=====================================
//The frequency of clk is divided by N
parameter bitsize = 4;
parameter N = 20;

reg [bitsize:0] cnt0;

always @(posedge clk or negedge rst_n)
begin 
	if(!rst_n)
	begin
		cnt0 <= 0;
		dac_clk <= 0;
	end
	else
	begin
		if(cnt0 < (N/2-1)) 
			cnt0 <= cnt0 + 1'b1;
		else
			cnt0 <= 0;
		if(cnt0==0 && cnt1 >=1 && cnt1 <= 4'hb) 
			dac_clk <= ~ dac_clk;
		else
			dac_clk <= dac_clk;
	end
end

wire clk_1M;

assign clk_1M = (cnt0 == 0)?1'b1:1'b0;

//======================================

reg [3:0] cnt1;

always @(posedge clk or negedge rst_n)
begin 
	if(!rst_n)
		cnt1 <= 0;
	else
		if(clk_1M)
			cnt1 <= cnt1 + 1'b1;
		else
			cnt1 <= cnt1;
end

reg [7:0] cnt2;

always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		cnt2 <= 0;
	else
		if(cnt1 == 4'hf)
			if(cnt2 != freq_ctrl)
				cnt2 <= cnt2 + 1'b1;
			else
				cnt2 <= 0;
		else
			cnt2 <= cnt2;
end
		
always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		rom_addr <= 0;
	else
		if(clk_1M && cnt1==4'hf && cnt2 == freq_ctrl)
			rom_addr <= rom_addr + 1'b1;
		else
			rom_addr <= rom_addr;
end

always @(cnt1)
begin
	case(cnt1)
	4'h2: begin
				dac_dat <= 1'b0;
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end
	4'h3: begin
				dac_dat <= 1'b0;
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end
	4'h4: begin
				dac_dat <= 1'b1;
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end
	4'h5: begin
				dac_dat <= rom_dat[7];
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end
	4'h6: begin
				dac_dat <= rom_dat[6];
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end
	4'h7: begin
				dac_dat <= rom_dat[5];
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end			
	4'h7: begin
				dac_dat <= rom_dat[4];
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end			
	4'h8: begin
				dac_dat <= rom_dat[3];
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end			
	4'h9: begin
				dac_dat <= rom_dat[2];
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end			
	4'ha: begin
				dac_dat <= rom_dat[1];
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end			
	4'hb: begin
				dac_dat <= rom_dat[0];
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end	
	4'hc: begin
				dac_dat <= 1'b0;
				dac_load <= 1'b0;
				dac_ldac <= 1'b1;
			end	
	4'hd: begin
				dac_dat <= 1'bx;
				dac_load <= 1'b1;
				dac_ldac <= 1'b0;
			end	
	default: 
			begin
				dac_dat <= 1'bx;
				dac_load <= 1'b1;
				dac_ldac <= 1'b1;
			end
	endcase
end
			
endmodule


6. 测试结果

FPGA设计——正弦信号发生器


相关内容

热门资讯

德国miji电饭煲触摸开关没反... 由于两种原因造成,第一是这种电饭锅都为微电脑电饭锅,如果在启动过程之中出现错误,有可能导致接触开关没...
华帝热水器触摸屏失灵修复小技巧 需要更换控制面板。找到一样的配件,拆下四周的固定螺丝然后打开前面板,拆下控制面板模块,把新的插上去,...
第七期苏州大讲堂举行 7月11日,第七期苏州大讲堂举行。英国皇家工程院院士、香港理工大学讲席教授林建国,围绕“前沿新材料赋...
谁知道红日燃气灶好不好 最佳回答 你好,很高兴为您解答!我可以很明确的告诉您红日燃气灶的质量非常好,只要你买到的是正宗的红日...
红日燃气灶怎么样大佬告诉一下 最佳回答 你好,这位网友,红日燃气灶不是一线大品牌哦,但是它的价格还是蛮便宜的,性价比也是比较高的,...
红日红外线燃气灶好不好 最佳回答 你好,很高兴为您解答!就我个人觉得,中式厨具不适宜用红外线灶具,红外线灶具的核心是红外线炉...
美军第四轮空袭打击范围发生变化... 美军一周内密集发动四轮打击,多轮打击的范围及目标区域有何异同之处?美方接下来可能还会有哪些进一步的军...
原创 彻... #小米回应网传澎程价格 #,近期全网刷屏的小米澎程 N90 低价预言彻底翻车,无数米粉期待的 20 ...
每经热评丨当“韦神”不再靠馒头... 每经评论员 付克友 7月8日,2025年度国家科学技术奖揭晓。北京大学数学科学学院教授章志飞与长聘副...
中国电信试验AI传输卫星视频新... IT之家 7 月 13 日消息,中国电信研究院今日宣布,中国电信(研究院、上海公司和中电信应急公司)...