[X]关闭

按钮按下 发送10个脉冲!

文档创建者:bubblegum
浏览次数:6470
最后更新:2016-01-02
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name:    dds_wave
//////////////////////////////////////////////////////////////////////////////////
module dds_wave
    (
  input clk,
  input key1,
  output [7 : 0] dadata,
  output da_clk

    );

reg [15:0] key1_counter;                 //按键检测寄存器
reg [7:0] dadata_o;
reg dds_we=0;
reg [28:0] dds_data;
reg  [1:0] dds_freq=0;
reg dds_we_req;
reg [14:0] timer=13'd0;
reg timer_trig=1'd0;


wire  [7 : 0] sine;

assign sine_reg=sine[6:0];
assign da_clk=clk;
assign dadata=dadata_o;

//有符号数转化为无符号数输出到DA
always @(posedge clk)
begin
      if(sine[7]==1'b1)
         dadata_o<=sine-128;      
                else
         dadata_o<=sine+128;               
end


//控制DDS输出不同的频率
always @(posedge clk)
begin
    //dds_we<=dds_we_req;
    case(dds_freq)

                   2'b11:begin  

                                //timer_trig <= 1'd1;
                               
                                if (timer<11'd2046)
                                begin
                                dds_we<=1'd1;
                                dds_data <= 29'd53687091;                   //5MHz: (dds_data*2^29)/(50*1000000)       
                                timer <= timer +1'd1;
                                end
                                else if (timer == 11'd2046)
                                begin
                                dds_we<=1'd0;
                                timer<=11'd2046;
                               
                                end
                        end
                        default begin
                        //        dds_we<=1'd0;
                        //        timer<=11'd2046;
                        //        dds_we<=dds_we_req;                       
                                end
         endcase;       
                       
               
end

//按钮处理程序, 改变DDS的输出频率       
always @(posedge clk)
begin
           if (key1==1'b1)                                  //如果按钮没有按下,寄存器为0
               key1_counter<=0;
                        // dds_freq<=1'b0;
                //         dds_we_req<=1'b0;
                //         dds_freq<=dds_freq;
           else if ((key1==1'b0)&& (key1_counter<=16'hc350)) //如果按钮按下并按下时间少于1ms,计数      
          key1_counter<=key1_counter+1'b1;
            
      if (key1_counter==16'hc349) begin                //一次按钮有效,改变DDS频率
          dds_freq<=2'b11;
                         //dds_we_req<=1'b1;
                end          
      else begin


          dds_freq<= 2'd0;
                         //dds_we_req<=1'b0;       
      end                         
end       

//DDS IP产生sin/cos波形
sin_cos sin_cos_inst (
  .clk(clk),            // input clk
  .we(dds_we),          // input we
  .data(dds_data),      // input [28 : 0] data
  .cosine(cosine),      // output [7 : 0] cosine
  .sine(sine),          // output [7 : 0] sine
  .phase_out() // output [28 : 0] phase_out
);


endmodule



上面的程序老是有问题!大家可以帮我看看么? 0是按键按下 1是不按

发表评论已发布 3

贾文洋

发表于 2016-1-2 19:30:14 | 显示全部楼层

本帖最后由 贾文洋 于 2016-1-2 19:37 编辑

位数不匹配吧,

bubblegum

发表于 2016-1-2 19:32:52 | 显示全部楼层

本帖最后由 贾文洋 于 2016-1-2 19:37 编辑

有符号数转化为无符号数输出到DA

贾文洋

发表于 2016-1-2 19:34:25 | 显示全部楼层

感觉代码写的有点乱,你改的哪个历程?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则