qinqin010 发表于 2010-11-18 19:01:56

求助 verilog 分频程序 ,望高手指点,急急急啊·~~~~谢谢啦

module dddd(clk_in,clr,key,L1,L2);
input clk_in,key,clr;
output L1,L2;
reg L1,L2;
reg q;


reg state;
always @(posedge clk_in )
        if(!clr)
        begin

                q=0;
                L1=1;
                L2=1;
                state=1;
        end
       
        else
        case(state)
        1'b0:
                begin
                        L1=0;
                        L2=1;
                        if(q<8'd40)                       
                        begin
                                if(led_ctrl)
                               state=1'b1;
                                else
                                q=q+1;
                        end

                        else
                        begin
                                q=0;
                                L1=~L1;
                                L2=~L2;
                        end
                       
                end
        1'b1:
                begin
                        L1=1;
                        L2=1;
                        q=0;
                        if(led_ctrl)
                                state=1'b0;
                        else
                                state=1'b1;

                end
        endcase

//------------------------------------------------------
reg cnt;      //计数寄存器
always @ (posedge clk_in)
    if (!clr)         //异步复位
      cnt <= 4'd0;
    else
      cnt <= cnt + 1'b1;
reg   low_sw;
always @(posedge clk_in)
    if (!clr)
      low_sw <= 1'b1;
    else if (cnt == 4'd10)//满20ms,将按键值锁存到寄存器low_sw中
      low_sw <= key;   

// ---------------------------------------------------------------------------
reg   low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中
always @ ( posedge clk_in)
    if (!clr)
      low_sw_r <= 1'b1;
    else
      low_sw_r <= low_sw;
         //当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
wireled_ctrl = low_sw_r & ( ~low_sw);

//---------------------------------------------------------------------       
       
       
endmodule

键盘扫描参照网上的,为了看仿真波形循环写小了点



http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_598913HYWF2N.png
设计要求是这样 (原文件名:QQ截图未命名.png)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_598914YGDTX6.png
我程序得到的波形,跟要求的为什么不一样 (原文件名:QQ截图未命名是.png)

Franks2599 发表于 2010-11-19 18:37:43

问题是 你想问什么??给你改错?

Franks2599 发表于 2010-11-19 18:49:46

……

Franks2599 发表于 2010-11-19 19:31:55

看了半天 觉得很乱
case(state)
1'b0:
begin
L1=0;
L2=1;
if(q<8'd40)   
begin
if(led_ctrl)
state=1'b1;
else
q=q+1;
end

else
begin   
q=0;
L1=~L1;
L2=~L2;
end
这有问题
你把 L1=0;L2=1;放在always 内部state=0时每次都重置,L1 L2刚刚取反还没等q自增至8'd40 又被重置 这就是为什么你的脉宽那么窄的原因 时间只有一个脉冲的间隔!
在led_ctrl置1时对于state=0和stae=1分别对应两种不同结果state=1'b0;和state=1'b0; 什么意思?互换??
我有点糊涂,程序怎么会这么复杂……

Franks2599 发表于 2010-11-19 19:33:54

在led_ctrl置1时对于state=0和stae=1分别对应两种不同结果state=1'b1;和state=1'b0;
页: [1]
查看完整版本: 求助 verilog 分频程序 ,望高手指点,急急急啊·~~~~谢谢啦