中级会员
- 积分
- 490
- 金钱
- 490
- 注册时间
- 2019-1-18
- 在线时间
- 101 小时
|
36金钱
程序参考hs_ad_da例程,创建rom核存好正弦波的mif文件。加按键模块控制相位和频率后DA输出端没有波形。
计划用key0控制相位,每按一次相位翻转180。实现原理用key_debounce模块检测key0下降沿,检测成功后将现在读rom的地址+ 8'd127,实现反相。key_debounce模块在da_wave_send模块中例化。实验结果DA输出-72.0mV直流信号。
附上完整工程,望懂得问题出在哪里的大神赐教!!!
//****************************************************************************************//
module da_wave_send(
input clk , //閺冨爼鎸
input rst_n , //婢跺秳缍呮穱鈥冲娇閿涘奔缍嗛悽闈涢挬閺堝鏅
input key0_frq_up,
input key1_frq_down,
input key3_phase,
input [7:0] rd_data , //ROM date
output reg [7:0] rd_addr , //ROM address
//DA閼侯垳澧栭幒銉ュ經
output da_clk , //DA(AD9708)妞瑰崬濮╅弮鍫曟寭,閺堚偓婢堆勬暜閹5Mhz閺冨爼鎸
output [7:0] da_data //鏉堟挸鍤紒姗燗閻ㄥ嫭鏆熼幑
);
//parameter
//妫版垹宸肩拫鍐Ν閹貉冨煑
reg [7:0] FREQ_ADJ = 8'd10; //棰戠巼鎺у埗瀛
//reg define
reg [7:0] freq_cnt ; //棰戠巼璁℃暟
//*****************************************************
//** main code
//*****************************************************
assign da_clk = ~clk;
assign da_data = rd_data;
//frq control
always @(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0)
freq_cnt <= 8'd0;
else if(freq_cnt == FREQ_ADJ)
freq_cnt <= 8'd0;
else
freq_cnt <= freq_cnt + 8'd1;
end
wire key3_phase_en;
key_debouncer key3_debouncer(.clk(clk),.rst_n(rst_n),.key(key3_phase),.key_en(key3_phase_en));
//read ROM
always @(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0)
rd_addr <= 8'd0;
else if (freq_cnt == FREQ_ADJ) begin
rd_addr <= rd_addr + 8'd1;
end
else if(key3_phase_en) begin
rd_addr <= rd_addr + 8'd127;
end
else ;;
end
// frq control
wire key0_frq_up_en;
key_debouncer key0_debouncer(.clk(clk),.rst_n(rst_n),.key(key0_frq_up),.key_en(key0_frq_up_en));
always @(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0)
FREQ_ADJ <= 8'd10;
else if (freq_cnt == key0_frq_up_en)
FREQ_ADJ <= FREQ_ADJ + 8'd1;
else
FREQ_ADJ <= FREQ_ADJ;
end
endmodule
//****************************************************************************************//
//****************************************************************************************//
module key_debouncer(
input clk,
input rst_n,
input key,
output key_en
);
reg key_sync_0,key_sync_1;
assign key_en=(~key_sync_0)&key_sync_1;
always @(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0) begin
key_sync_0<=1'b0;
key_sync_1<=1'b0;
end
else begin
key_sync_0<=key;
key_sync_1<=key_sync_0;
end
end
endmodule
//****************************************************************************************//
module pa_driver(
input sys_clk,
input sys_rst_n,
input key0,
input key1,
input key3_phase,
//DA interface
output da_clk , //DA(AD9708)clk,max 125Mhz
output [7:0] da_data //data yo DA
// input ad_otr , //0:閸︺劑鍣虹粙瀣瘱閸:鐡掑懎鍤柌蹇曗柤
// output ad_clk //AD(AD9280)妞瑰崬濮╅弮鍫曟寭,閺堚偓婢堆勬暜閹Mhz閺冨爼鎸
);
wire [7:0] rd_addr; //ROM address
wire [7:0] rd_data; //ROM data
//*****************************************************
//** main code
//*****************************************************
//DA instantiation
da_wave_send u_da_wave_send(
.clk (sys_clk),
.rst_n (sys_rst_n),
.key3_phase (key3_phase),
.rd_data (rd_data),
.rd_addr (rd_addr),
.da_clk (da_clk),
.da_data (da_data)
);
//ROM instantiation
rom_256x8b u_rom_256x8b(
.address (rd_addr),
.clock (sys_clk),
.q (rd_data)
);
endmodule
//****************************************************************************************//
|
|