用Spartan6的FPGA开发板实现,外接lcd1602液晶显示和TLC5615 dac数模转换模块。仅通过仿真未在实物上调试过。使用matlab生成波形数据的ROM查找表方法设计。
目录
dds_top.v
`timescale 1ns / 1ps
//不带矩阵键盘的顶层
module dds_top(
input clk50m , //系统时钟50MHz
input rstn , //系统复位低有效
input key_rang , //调幅
input key_freq , //调频
input key_phas , //调相
input key_wave , //调波
output lcd_rs , //0:命令,1:数据
output lcd_rw , //0:写,1:读
output lcd_en , //下降沿执行
output [7:0] lcd_data , //8位双向并行数据
output ad_sclk , //dac的spi接口
output ad_sdata , //dac的spi接口
output ad_cs //dac的spi接口
);
wire [2:0] Rang_word ; //幅度控制字,初始值为1
wire [14:0] Freq_word ; //频率控制字,初始值为1
wire [11:0] Phas_word ; //相位控制字,初始值为1
wire [1:0] Wave_word ; //波形控制字,初始值为0
wire fclk; //dds的工作时钟
wire fclk_locked; //fclk稳定标志
wire flag_keypress; //按键按下标志,打一拍
wire [9:0] wave_data; //dds输出波形数据
//==========================fclk_gen======================//
//功能:用来生成dds工作时钟
fclk_gen fclk_gen_inst(
.CLK_IN1 ( clk50m ),
.CLK_OUT1 ( fclk ),
.RESET ( !rstn ),
.LOCKED ( fclk_locked )
);
//=========================button_bind=======================//
//功能:给按键绑定控制字步进
button_bind button_bind_inst(
.clk50m ( clk50m ),
.rstn ( rstn ),
.ikey_rang ( key_rang ),
.ikey_freq ( key_freq ),
.ikey_phas ( key_phas ),
.ikey_wave ( key_wave ),
.oRang_word ( Rang_word ),
.oFreq_word ( Freq_word ),
.oPhas_word ( Phas_word ),
.oWave_word ( Wave_word ),
.oflag_keypress ( flag_keypress )
);
//========================dds_ctrl============================//
//生成波形
dds_ctrl dds_ctrl_inst(
.clk50m ( clk50m ),
.rstn ( rstn ),
.fclk ( fclk ),
.fclk_locked ( fclk_locked ),
.iRang_word ( Rang_word ),
.iFreq_word ( Freq_word ),
.iPhas_word ( Phas_word ),
.iWave_word ( Wave_word ),
.owave_data ( wave_data )
);
//========================lcd1602============================//
//功能:显示当前波形参数
lcd1602 lcd1602_inst(
.clk50m ( clk50m ),
.rstn ( rstn ),
.iflag_keypress ( flag_keypress ),
.iRang_word ( Rang_word ),
.iFreq_word ( Freq_word ),
.iPhas_word ( Phas_word ),
.iWave_word ( Wave_word ),
.lcd_rs ( lcd_rs ),
.lcd_rw ( lcd_rw ),
.lcd_en ( lcd_en ),
.lcd_data ( lcd_data )
);
//=====================dac_module=============================//
//功能:模数转换
dac_module dac_module_inst(
.clk50m ( clk50m ),
.rstn ( rstn ),
.din_in ( wave_data ),
.sclk ( ad_sclk ),
.cs ( ad_cs ),
.din_out ( ad_sdata )
);
endmodule
button_bind.v
`timescale 1ns / 1ps
module button_bind(
input clk50m , //系统时钟50MHz
input rstn , //低有效复位
input ikey_rang , //调幅按键
input ikey_freq , //调频按键
input ikey_phas , //调相按键
input ikey_wave , //调波按键
output reg [2:0] oRang_word , //幅度控制字,初始值为1
output reg [14:0] oFreq_word , //频率控制字,初始值为1
output reg [11