4355|2

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助解惑,急急急 [复制链接]

我从网上找到了一个音量调节的程序,改了一下好适合我的板子,程序调对了但不可实现功能,求大神们帮我看一下,很急,拜托了,我的开发板是AX545
//wm8731中寄存器的配置程序
module reg_config(clock_50m,
                  i2c_sclk,
                  i2c_sdat,
                  reset_n,
               ack,tr_end,start,config_step,reg_index,key,i2c_data,reg2_data,clock_20k);
     input clock_50m;
     input reset_n;
          input [3:0]key;
     output i2c_sclk,ack,tr_end,start,clock_20k;
     output[1:0] config_step;
     output[3:0] reg_index;
     output[23:0]i2c_data;
     output[15:0] reg2_data;   //输出声道

     inout i2c_sdat;

     reg clock_20k;
     reg [15:0]clock_20k_cnt;
     reg [1:0]config_step;
     reg [3:0]reg_index;
     reg [23:0]i2c_data;
     reg [15:0]reg_data;
     reg start,bz,bx;

     reg[15:0] reg2_data;
     wire ack;
     wire tr_end;

     i2c u1(.clock_i2c(clock_20k),
               .reset_n(reset_n),
               .ack(ack),
               .i2c_data(i2c_data),
               .start(start),
               .tr_end(tr_end),
               .i2c_sclk(i2c_sclk),
               .i2c_sdat(i2c_sdat));
     assign {xs1,xs2}=reg2_data[6:0];
     always@(posedge clock_50m or negedge reset_n)   //产生i2c控制时钟-20khz
     begin
        if(!reset_n)
        begin
           clock_20k<=0;
           clock_20k_cnt<=0;
        end
        else if(clock_20k_cnt<2499)
           clock_20k_cnt<=clock_20k_cnt+1;
        else
        begin
           clock_20k<=!clock_20k;
           clock_20k_cnt<=0;
        end
      end

      always@(posedge clock_20k or negedge reset_n)    //配置过程控制

        if(!reset_n)
            begin
            config_step<=0;
            start<=0;
            reg_index<=0;
            reg2_data<=16'h054d;
            bz<=1'b0;
            bx<=1'b1;
            end
        else if(!key[0])
         begin
           if(bx==1)
            begin
              bx<=0;
              config_step<=0;
              start<=0;
              reg_index<=0;
              begin
              if(bz==0)
                begin
                 if(reg2_data[6:0]==7'b1111111)
                   bz<=1'b1;
                 else
                   reg2_data[6:0]<=reg2_data[6:0]+5;
                end
              else if(bz==1)
                begin
                 if(reg2_data[6:0]<=7'b0101111)
                   bz<=1'b0;
                 else
                   reg2_data[6:0]<=reg2_data[6:0]-5;
                end
              end
            end
          end


        else if(clock_20k)
          begin
            if(key[0]==1)
             bx<=1'b1;
            if(reg_index<10)
             begin
             case(config_step)
             0:begin
               i2c_data<={8'h34,reg_data};
               start<=1;
               config_step<=1;
               end
             1:
               if(tr_end)
               begin
                 if(!ack)
                 begin
                 config_step<=2;
                 start<=0;
                 end
                 else
                 begin
                 config_step<=0;
                 start<=0;

                 end
               end

             2:begin
                 reg_index<=reg_index+1;
                 config_step<=0;

                end
             endcase
             end
            end



     always@(reg_index)   
begin
        case(reg_index)
        0:reg_data<=16'h0010;       //Reg0(Left Line In) = 0x10
        1:reg_data<=16'h0210;       //Reg1(Right Line In) = 0x10
        2:reg_data<=16'h047f;       //Reg2(Left Headphone out) = 0x7f
        3:reg_data<=16'h067f;       //Reg3(right Headphone out) = 0x7f
        4:reg_data<=16'h08f8;       //Reg4(analogue audio path control) = 0xf8
        5:reg_data<=16'h0a06;       //Reg5(digital Audio path control) = 0x00
        6:reg_data<=16'h0c00;       //Reg6(Power down control) = 0x00
        7:reg_data<=16'h0e40;       //Reg7(Digital Audio interface format) = 0x40
        8:reg_data<=16'h1000;       //Reg8(Sampling control) = 0x00  
        9:reg_data<=16'h1201;       //Reg9(Active control) = 0x00  
      default:reg_data<=16'h001a;
      endcase
      end
               
               
                endmodule

  //sclk,sdin数据传输时序代码(i2c写控制代码)
module i2c(clock_i2c,          //wm8731控制接口传输所需时钟,0-400khz,此处为20khz
               reset_n,     
               ack,              //应答信号
               i2c_data,          //sdin接口传输的24位数据
               start,             //开始传输标志
               tr_end,           //传输结束标志
               cyc_count,   
               i2c_sclk,          //FPGA与wm8731时钟接口
               i2c_sdat);         //FPGA与wm8731数据接口
    input [23:0]i2c_data;
    input reset_n;
    input clock_i2c;
    output [5:0]cyc_count;
    output ack;
    input start;
    output tr_end;
    output i2c_sclk;
    inout i2c_sdat;
    reg [5:0] cyc_count;
    reg reg_sdat;
    reg sclk;
    reg ack1,ack2,ack3;
    reg tr_end;


    wire i2c_sclk;
    wire i2c_sdat;
    wire ack;

    assign ack=ack1|ack2|ack3;
    assign i2c_sclk=sclk|(((cyc_count>=4)&(cyc_count<=30))?~clock_i2c:0);
    assign i2c_sdat=reg_sdat?1'bz:0;


    always@(posedge clock_i2c or  negedge reset_n)
    begin
       if(!reset_n)
       cyc_count<=6'b111111;
       else begin
       if(start==0)
       cyc_count<=0;
       else if(cyc_count<6'b111111)
       cyc_count<=cyc_count+1;
       end
    end
    always@(posedge clock_i2c or negedge reset_n)
    begin
       if(!reset_n)
       begin
          tr_end<=0;
          ack1<=1;
          ack2<=1;
          ack3<=1;
          sclk<=1;
          reg_sdat<=1;
       end
       else
          case(cyc_count)
        0:begin ack1<=1;ack2<=1;ack3<=1;tr_end<=0;sclk<=1;reg_sdat<=1;end
        1:reg_sdat<=0;            //开始传输
        2:sclk<=0;
        3:reg_sdat<=i2c_data[23];
        4:reg_sdat<=i2c_data[22];
        5:reg_sdat<=i2c_data[21];
        6:reg_sdat<=i2c_data[20];
        7:reg_sdat<=i2c_data[19];
        8:reg_sdat<=i2c_data[18];
        9:reg_sdat<=i2c_data[17];
        10:reg_sdat<=i2c_data[16];
        11:reg_sdat<=1;                //应答信号

        12:begin reg_sdat<=i2c_data[15];ack1<=i2c_sdat;end
        13:reg_sdat<=i2c_data[14];
        14:reg_sdat<=i2c_data[13];
        15:reg_sdat<=i2c_data[12];
        16:reg_sdat<=i2c_data[11];
        17:reg_sdat<=i2c_data[10];
        18:reg_sdat<=i2c_data[9];
        19:reg_sdat<=i2c_data[8];
        20:reg_sdat<=1;              //应答信号

        21:begin reg_sdat<=i2c_data[7];ack2<=i2c_sdat;end
        22:reg_sdat<=i2c_data[6];
        23:reg_sdat<=i2c_data[5];
        24:reg_sdat<=i2c_data[4];
        25:reg_sdat<=i2c_data[3];
        26:reg_sdat<=i2c_data[2];
        27:reg_sdat<=i2c_data[1];
        28:reg_sdat<=i2c_data[0];
        29:reg_sdat<=1;            //应答信号

        30:begin ack3<=i2c_sdat;sclk<=0;reg_sdat<=0;end
        31:sclk<=1;
        32:begin reg_sdat<=1;tr_end<=1;end
        endcase

end
endmodule

最新回复

这不是应该直接找黑金的技术支持吗  详情 回复 发表于 2017-6-3 14:45
点赞 关注

回复
举报

5979

帖子

8

TA的资源

版主

沙发
 
这不是应该直接找黑金的技术支持吗
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
chenzhufly 发表于 2017-6-3 14:45
这不是应该直接找黑金的技术支持吗

黑金的技术支持?是问客服吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表