[求助] 愿大神助攻

拨开云雾   2017-5-18 10:25 楼主
我最近在做SD卡音乐播放器,想做一个按键模块,实现播放、暂停,上下曲切换,这个程序好像无法控制,大神帮忙看下程序。
//部分控制程序
reg [10:0]cnt=0;
reg pause=0;
reg back=0;
reg next=0;
reg [32:0]temp=0;

always@(posedge en)
begin
        case (cmd)
                2'b00: begin pause<=0; next<=0;back<=0;end
                2'b01: begin pause<=1; next<=0;back<=0;end
                2'b10: begin back<=1; end
                2'b11: begin next<=1; end
                endcase
end

                       
//SD卡的sec地址处理程序

always @(posedge SD_clk )
begin
        if(counter==10'd1022)  
           read_sec<=SADDR;
        else if(data_come)
        begin
                if(read_sec                 begin
                        if(!pause)
                        begin
                                read_sec<=read_sec+1'b1;       //SD卡sec地址加1
                        end
                       
                        if(back)
                        begin
                                read_sec<=add_pre;
                        end
                       
                        if(next)
                        begin
                                read_sec<=add_nxt;
                        end
                       
                        if(cnt==64)
                        begin
                                add_nxt<={temp[7:0],temp[15:8],temp[23:16],temp[31:24]}+add_now;
                        end
                        else
                        begin
                                cnt<=cnt+1;
                                temp[31:1]<=temp[30:0];
                                temp[0]<=SD_dataout;
                        end
                       
                        if(read_sec==add_nxt)
                        begin
                                cnt<=0;
                                add_pre<=add_now;
                                add_now<=add_nxt;
                        end
                end
                else
                   read_sec<=SADDR;
        end
end

回复评论 (5)

复用按键? 按键次数给cmd?你这个是后面的控制程序了吧,不是按键模块。你把相关模块传上来,如果有的不方便传的,应该注释一下作用,不然别人都不知道有些变量的作用
点赞  2017-5-18 11:14
引用: 低调的路人 发表于 2017-5-18 11:14
复用按键? 按键次数给cmd?你这个是后面的控制程序了吧,不是按键模块。你把相关模块传上来,如果有的不方 ...

好得
点赞  2017-5-18 20:52
这是另外两个模块。
//////////////////////////////////////////////////////////////////////////////////
// Module Name:    key_conmand
//////////////////////////////////////////////////////////////////////////////////
module key_conmand(
               input [3:0]button,
                                   input clk,
                                   output reg [1:0]cmd,
                                   output reg en=0
    );
reg [3:0]signal_temp=0;
wire [3:0]signal;
always@(posedge clk)
begin
        if(signal!=signal_temp)
        begin
                case (signal[3:0])
                        4'b0001: begin cmd[1:0]<=0; end  //四种,暂停播放,上下曲
                        4'b0010: begin cmd[1:0]<=1; end
                        4'b0100: begin cmd[1:0]<=2; end
                        4'b1000: begin cmd[1:0]<=3; end
                        default: begin cmd[1:0]<=0; end
                endcase
                en<=1;
               
        end
        else
        begin
                en<=0;
        end
end
key_check play(
                    .clk(clk),
                        .key(button[0]),
                        .led(signal[0])
                    );
                       
key_check stop(
                    .clk(clk),
                        .key(button[1]),
                        .led(signal[1])
                    );
key_check back(
                    .clk(clk),
                        .key(button[2]),
                        .led(signal[2])
                    );
key_check next(
                    .clk(clk),
                        .key(button[3]),
                        .led(signal[3])
                    );       
endmodule
//////////////////////////////////////////////////////////////////////////////////
// Module Name:    key_check
//////////////////////////////////////////////////////////////////////////////////
module key_check(
                 input clk        ,
                 input rst_n,
                 input key,        
                 output reg led
    );
//-------------------------------------
reg[3:0] keyr;  
always @(posedge clk )
begin
    if (!rst_n) begin keyr <= 4'b1111;end
    else begin keyr <= {keyr[2:0],key};end
end
wire key_pos = keyr[2] & ~keyr[3];
wire key_neg = ~keyr[2] & keyr[3];
//-------------------------------------
reg[19:0]  cnt;       
always @ (posedge clk )
begin
   if (!rst_n) begin cnt <= 20'd0;end       
        else if(key_pos || key_neg) begin cnt <=20'd0;end
        else if(cnt < 20'd999_999) begin cnt <= cnt + 1'b1;end
        else begin cnt <= 20'd0;end
end
reg[1:0] key_value;
always @(posedge clk )
begin
    if (!rst_n) begin key_value[0] <= 1'b1;end
         else if(cnt == 20'd999_999)
      begin         
       key_value[0] <= keyr[3];
      end
end
always @(posedge clk )
begin
    if (!rst_n) begin key_value[1] <= 1'b1;end
         else begin key_value[1] <= key_value[0];end
end         
wire led_ctrl = ~key_value[0] & key_value[1];       
//-------------------------------------
always @ (posedge clk )
begin
    if (!rst_n)  begin led <= 1'b0;end
    else if(led_ctrl) begin led <= ~led;end
end
endmodule

点赞  2017-5-18 20:57
看的我一口老血吐了出来,这样的代码 老板直接炒鱿鱼
按键模块主要用了上升沿检测和下降沿检测,比较常见,没问题。但是整体代码问题很大。

逻辑不够清晰,模块不够分明。
部分模块的端口定义有错误。wire [3:0]signal?这是什么鬼?例化少了rst_n。led?又是什么鬼?
代码风格不统一,我仿佛看见不同的人的程序强行拼在一起。

大兄弟,个人意见,别往心里去哈  ,祝代码早日调试成功
点赞  2017-5-19 14:24
引用: 低调的路人 发表于 2017-5-19 14:24
看的我一口老血吐了出来,这样的代码 老板直接炒鱿鱼
按键模块主要用了上升沿检测和下降沿检测,比较常 ...

确实是两个程序并在一起的,我看不太懂呢,按键的太迷离了
点赞  2017-5-20 21:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复