FPGA的ROM IP核 + DAC ad9708设计简单的DDS

将正弦信号一个周期的波形数据存入ROM,从ROM读取数据给DAC的输入,DAC的输出为正弦信号。

//=============================================================
// Module				: rd_rom_wave_data.v
// Function 		: 通过ROM和DAC ad9780输出正弦波
// Description	:	WaveToMif软件设置ROM深度为256,倍频系数为1,
//								而输入时钟为50Mhz,那么一个完整的正弦波周期
//								长度为256*20ns = 5120ns,当FREQ_ADJ的值为0时,
//								即正弦波的最快输出频率为:
//								1s/5120ns(1s = 1000000000ns) ≈ 195.3Khz。 
//								如果把FREQ_ADJ的值设置为5时, 一个完整的
//								正弦波周期长度为5120ns*(5+1) = 30720ns,频率约为32.55KHz。 
//								也可以在WaveToMif软件设置中增加倍频系数或者
//								增加AD的驱动时钟来提高正弦波输出频率 
// Author				:	snjshping
// Date					: 20191210
//=============================================================
module rd_rom_wave_data #
	(
	parameter	FREQ_ADJ = 8'd0					// dds频率调节,该值越大频率越低,范围0~255,可以通过改变改参数的位宽改变频率调节范围
	)
	(
	input								Clock					,
	input								Rst_n					,
	
	input 			[7:0]		iRom_rd_data	,		// 输入读取ROM的数据
	
	output reg	[7:0]		oRom_rd_addr	,		// 输出ROM读地址,ROM IP设置的时候为256个字节,故地址范围0~256,需要8bit
	output  		[7:0]		oAd_data_out	,		// 输出给dac ad9708
	output							oAd_clk						// ad9708驱动时钟,最大支持125Mhz
	);

//=============================================================
// reg define
//=============================================================
reg [7:0] 		rFreq_cnt;	// 频率调节计数器

//-------------------------------------------------------------
// 时钟上升沿读取ROM中的数据,那么DA芯片在时钟下降沿锁存数据是
// 稳定的时刻
//-------------------------------------------------------------
assign	oAd_clk = ~Clock;
assign	oAd_data_out[7:0] = iRom_rd_data[7:0]; // 将ROM读取的数据输出给DA的输入


//-------------------------------------------------------------
// 频率调节计数器
//-------------------------------------------------------------
always @ ( posedge Clock or negedge Rst_n )
begin
	if(Rst_n == 1'b0)
	begin
		rFreq_cnt[7:0] <= 8'd0;
	end 
	else
	begin
		rFreq_cnt[7:0] <= (rFreq_cnt[7:0] == FREQ_ADJ) ? 8'd0 : (rFreq_cnt[7:0] + 8'd1);	
	end 
end 


//-------------------------------------------------------------
// 产生读ROM地址
//-------------------------------------------------------------
always @ ( posedge Clock or negedge Rst_n )
begin
	if(Rst_n == 1'b0)
	begin
		oRom_rd_addr[7:0] <= 8'd0;
	end 
	else
	begin
		oRom_rd_addr[7:0] <= (rFreq_cnt[7:0] == FREQ_ADJ) ? (oRom_rd_addr[7:0] + 8'd1) : oRom_rd_addr[7:0] ;	
	end 
end 


endmodule

//=============================================================
// Module				: ad9708_dds_test.v
// Function 		: 通过ROM和DAC ad9780输出正弦波
// Author				:	snjshping
// Date					: 20191210
//=============================================================
module ad9708_dds_test #
	(
	parameter	FREQ_ADJ = 8'd0					// dds频率调节,该值越大频率越低,范围0~255,可以通过改变改参数的位宽改变频率调节范围
	)
	(
	input								Clock					,
	input								Rst_n					,
	
	output  		[7:0]		oAd_data_out	,		// 输出给dac ad9708
	output							oAd_clk						// ad9708驱动时钟,最大支持125Mhz
	);


wire	[7:0]		wRom_rd_data	;						// 输入读取ROM的数据                           
wire 	[7:0]		wRom_rd_addr	;						// 输出ROM读地址,ROM IP设置的时候为256个字节,故地址范围0~256,需要8bit


rd_rom_wave_data #
	(
	.FREQ_ADJ				(FREQ_ADJ				)
	)
u0_rd_rom_wave_data	
	(
	.Clock					( Clock					),
	.Rst_n					( Rst_n					),
	                  
	.iRom_rd_data		( wRom_rd_data	),		// 输入读取ROM的数据
	                  
	.oRom_rd_addr		( wRom_rd_addr	),		// 输出ROM读地址,ROM IP设置的时候为256个字节,故地址范围0~256,需要8bit
	.oAd_data_out		( oAd_data_out	),		// 输出给dac ad9708
	.oAd_clk				( oAd_clk				)			// ad9708驱动时钟,最大支持125Mhz
	);


single_rom256x8bit  u0_single_rom256x8bit
	(
	.address		( wRom_rd_addr	),
	.clock			( Clock					),
	.q					( wRom_rd_data	)
	);
	
	
endmodule
-- 波形转MIF上位机制作软件

WIDTH = 8;
DEPTH = 256;

ADDRESS_RADIX = UNS;
DATA_RADIX = UNS;

CONTENT BEGIN
    0    :  127;
    1    :  130;
    2    :  133;
    3    :  136;
    4    :  139;
    5    :  142;
    6    :  145;
    7    :  148;
    8    :  151;
    9    :  154;
    10   :  157;
    11   :  160;
    12   :  163;
    13   :  166;
    14   :  169;
    15   :  172;
    16   :  175;
    17   :  178;
    18   :  181;
    19   :  184;
    20   :  186;
    21   :  189;
    22   :  192;
    23   :  194;
    24   :  197;
    25   :  200;
    26   :  202;
    27   :  205;
    28   :  207;
    29   :  209;
    30   :  212;
    31   :  214;
    32   :  216;
    33   :  218;
    34   :  221;
    35   :  223;
    36   :  225;
    37   :  227;
    38   :  229;
    39   :  230;
    40   :  232;
    41   :  234;
    42   :  235;
    43   :  237;
    44   :  239;
    45   :  240;
    46   :  241;
    47   :  243;
    48   :  244;
    49   :  245;
    50   :  246;
    51   :  247;
    52   :  248;
    53   :  249;
    54   :  250;
    55   :  250;
    56   :  251;
    57   :  252;
    58   :  252;
    59   :  253;
    60   :  253;
    61   :  253;
    62   :  253;
    63   :  253;
    64   :  254;
    65   :  253;
    66   :  253;
    67   :  253;
    68   :  253;
    69   :  253;
    70   :  252;
    71   :  252;
    72   :  251;
    73   :  250;
    74   :  250;
    75   :  249;
    76   :  248;
    77   :  247;
    78   :  246;
    79   :  245;
    80   :  244;
    81   :  243;
    82   :  241;
    83   :  240;
    84   :  239;
    85   :  237;
    86   :  235;
    87   :  234;
    88   :  232;
    89   :  230;
    90   :  229;
    91   :  227;
    92   :  225;
    93   :  223;
    94   :  221;
    95   :  218;
    96   :  216;
    97   :  214;
    98   :  212;
    99   :  209;
    100  :  207;
    101  :  205;
    102  :  202;
    103  :  200;
    104  :  197;
    105  :  194;
    106  :  192;
    107  :  189;
    108  :  186;
    109  :  184;
    110  :  181;
    111  :  178;
    112  :  175;
    113  :  172;
    114  :  169;
    115  :  166;
    116  :  163;
    117  :  160;
    118  :  157;
    119  :  154;
    120  :  151;
    121  :  148;
    122  :  145;
    123  :  142;
    124  :  139;
    125  :  136;
    126  :  133;
    127  :  130;
    128  :  127;
    129  :  123;
    130  :  120;
    131  :  117;
    132  :  114;
    133  :  111;
    134  :  108;
    135  :  105;
    136  :  102;
    137  :  99;
    138  :  96;
    139  :  93;
    140  :  90;
    141  :  87;
    142  :  84;
    143  :  81;
    144  :  78;
    145  :  75;
    146  :  72;
    147  :  69;
    148  :  67;
    149  :  64;
    150  :  61;
    151  :  59;
    152  :  56;
    153  :  53;
    154  :  51;
    155  :  48;
    156  :  46;
    157  :  44;
    158  :  41;
    159  :  39;
    160  :  37;
    161  :  35;
    162  :  32;
    163  :  30;
    164  :  28;
    165  :  26;
    166  :  24;
    167  :  23;
    168  :  21;
    169  :  19;
    170  :  18;
    171  :  16;
    172  :  14;
    173  :  13;
    174  :  12;
    175  :  10;
    176  :  9;
    177  :  8;
    178  :  7;
    179  :  6;
    180  :  5;
    181  :  4;
    182  :  3;
    183  :  3;
    184  :  2;
    185  :  1;
    186  :  1;
    187  :  0;
    188  :  0;
    189  :  0;
    190  :  0;
    191  :  0;
    192  :  0;
    193  :  0;
    194  :  0;
    195  :  0;
    196  :  0;
    197  :  0;
    198  :  1;
    199  :  1;
    200  :  2;
    201  :  3;
    202  :  3;
    203  :  4;
    204  :  5;
    205  :  6;
    206  :  7;
    207  :  8;
    208  :  9;
    209  :  10;
    210  :  12;
    211  :  13;
    212  :  14;
    213  :  16;
    214  :  18;
    215  :  19;
    216  :  21;
    217  :  23;
    218  :  24;
    219  :  26;
    220  :  28;
    221  :  30;
    222  :  32;
    223  :  35;
    224  :  37;
    225  :  39;
    226  :  41;
    227  :  44;
    228  :  46;
    229  :  48;
    230  :  51;
    231  :  53;
    232  :  56;
    233  :  59;
    234  :  61;
    235  :  64;
    236  :  67;
    237  :  69;
    238  :  72;
    239  :  75;
    240  :  78;
    241  :  81;
    242  :  84;
    243  :  87;
    244  :  90;
    245  :  93;
    246  :  96;
    247  :  99;
    248  :  102;
    249  :  105;
    250  :  108;
    251  :  111;
    252  :  114;
    253  :  117;
    254  :  120;
    255  :  123;
END;

你可能感兴趣的:(FPGA+Verilog)