zxs1065264872 发表于 2014-4-26 19:39:47

求帮助

我正在学按键去抖,下面这个程序是按键按下时led亮,放手后,再次按下,led灭,我想要按键按下时led亮,放手时led灭,应该怎么做呢??程序是这个:                     module sw_debounce(
                    clk,rst_n,
                        sw1_n,sw2_n,sw3_n,
                           led_d1,led_d2,led_d3
                    );

input   clk;        //主时钟信号,50MHz
input   rst_n;        //复位信号,低有效
input   sw1_n,sw2_n,sw3_n;         //三个独立按键,低表示按下
outputled_d1,led_d2,led_d3;        //发光二极管,分别由按键控制

//---------------------------------------------------------------------------
reg key_rst;

always @(posedge clkor negedge rst_n)
    if (!rst_n) key_rst <= 3'b111;
    else key_rst <= {sw3_n,sw2_n,sw1_n};

reg key_rst_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clkor negedge rst_n )
    if (!rst_n) key_rst_r <= 3'b111;
    else key_rst_r <= key_rst;
   
//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期
wire key_an = key_rst_r & (~key_rst);
//---------------------------------------------------------------------------
regcnt;        //计数寄存器

always @ (posedge clkor negedge rst_n)
    if (!rst_n) cnt <= 20'd0;        //异步复位
        else if(key_an) cnt <=20'd0;
    else cnt <= cnt + 1'b1;

reg low_sw;

always @(posedge clkor negedge rst_n)
    if (!rst_n) low_sw <= 3'b111;
    else if (cnt == 20'hfffff)         //满20ms,将按键值锁存到寄存器low_sw中       cnt == 20'hfffff
      low_sw <= {sw3_n,sw2_n,sw1_n};
      
//---------------------------------------------------------------------------
reg low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clkor negedge rst_n )
    if (!rst_n) low_sw_r <= 3'b111;
    else low_sw_r <= low_sw;
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
wire led_ctrl = low_sw_r & ( ~low_sw);

reg d1;
reg d2;
reg d3;

always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin
      d1 <= 1'b0;
      d2 <= 1'b0;
      d3 <= 1'b0;
      end
    else begin                //某个按键值变化时,LED将做亮灭翻转
      if ( led_ctrl ) d1 <= ~d1;       
      if ( led_ctrl ) d2 <= ~d2;
      if ( led_ctrl ) d3 <= ~d3;
      end

assign led_d3 = d1 ? 1'b1 : 1'b0;                //LED翻转输出
assign led_d2 = d2 ? 1'b1 : 1'b0;
assign led_d1 = d3 ? 1'b1 : 1'b0;

endmodule

zxs1065264872 发表于 2014-4-27 00:04:43

非常感谢!我自己才开始自学了一段时间,没有开发板,只能用上课的一点点时间用实验室的板子,我以后有问题可以向你请教吗??

zxs1065264872 发表于 2014-5-9 20:32:05

你好,我在看一个乘法器的例子,有点不明白,这个是程序,module mux16(
                        clk,rst_n,
                        start,ain,bin,yout,done
                );
               
input clk;                //芯片的时钟信号。
input rst_n;        //低电平复位、清零信号。定义为0表示芯片复位;定义为1表示复位信号无效。
input start;         //芯片使能信号。定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。
input ain;        //输入a(被乘数),其数据位宽为16bit.
input bin;        //输入b(乘数),其数据位宽为16bit.
output yout;        //乘积输出,其数据位宽为32bit.
output done;                //芯片输出标志信号。定义为1表示乘法运算完成.

reg areg;        //乘数a寄存器
reg breg;        //乘数b寄存器
reg yout_r;        //乘积寄存器
reg done_r;
reg i;                //移位次数寄存器


//------------------------------------------------
//数据位控制
always @(posedge clk or negedge rst_n)
        if(!rst_n) i <= 5'd0;
        else if(start && i < 5'd17) i <= i+1'b1;
        else if(!start) i <= 5'd0;

//------------------------------------------------
//乘法运算完成标志信号产生
always @(posedge clk or negedge rst_n)
        if(!rst_n) done_r <= 1'b0;
        else if(i == 5'd16) done_r <= 1'b1;                //乘法运算完成标志
        else if(i == 5'd17) done_r <= 1'b0;                //标志位撤销

assign done = done_r;

//------------------------------------------------
//专用寄存器进行移位累加运算
always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
                        areg <= 16'h0000;
                        breg <= 16'h0000;
                        yout_r <= 32'h00000000;
                end
        else if(start) begin                //启动运算
                        if(i == 5'd0) begin        //锁存乘数、被乘数
                                        areg <= ain;
                                        breg <= bin;
                                end
                        else if(i > 5'd0 && i < 5'd16) begin//i:1--16
                                        if(areg) yout_r = {1'b0,yout+breg,yout_r};        //累加并移位
                                        else yout_r <= yout_r>>1;        //移位不累加
                                end
                        else if(i == 5'd16 && areg) yout_r <= yout_r+breg;        //累加不移位
                end
end

assign yout = yout_r;

endmodule      ,对这个if(areg) yout_r = {1'b0,yout+breg,yout_r};        //累加并移位    累加并移位的这一段不是很清楚,帮我一下,谢谢
页: [1]
查看完整版本: 求帮助