美文网首页
彩灯显示电路

彩灯显示电路

作者: 萍水间人 | 来源:发表于2019-06-05 19:57 被阅读0次

    首先认识一下分频电路

    时钟是

        always @(posedge clk100khz) //分频1hz
        begin
            if(count == 'd49999)
                begin clk1=~clk1;count<=0;end
            else 
                begin count <= count+1'b1; end
        end
    

    怎么说呢,时钟是100khz,也就是1s之内有100000个波形
    那么上升沿也就是有100000次,count理论上就会加到100000次
    但是如果count加到了49999之后,也就是100000的一半
    clk就取反,是不是就是把49999个波形都抹平了
    那样1s之内是不是就只有1个波形了?

    所以说分频得到了1hz

    同理:

        always @(posedge clk100khz) //分频10hz
        begin
            if(count == 'd4999)
                begin clk2=~clk2;count1<=0;end
            else 
                begin count1 <= count1+1'b1; end
        end
    

    然后再将分频得到的时钟赋过去

        always @(posedge clk100khz)
        begin
            if(b)
                clk <= clk1;
            else 
                clk <= clk2;
        end
    

    之所以有一个b是为了控制时钟用两种节拍交替闪烁
    这种情况下,只是抹平了100000/5000 = 20
    20次有一半的上升和一半的下降,所以最终得到的波形就是10hz

    接下来看
    是怎么实现灯之间的状态转换的
    实现左到右依次点亮

            if(flag == 3'b000)
                begin
                    light <= {1'b1, light[len:1]};
                    if(light[0] == 1)
                        flag<=3'b001;
                end
    

    light循环赋值

    因为light既在左边出现了,又在右边出现了

    然后如果light[1] == 1的时候就跳转到下一个状态,至于为什么是light[1]等于1的时候,我做实验的时候改成了light[0] == 1,这个时候发现灯停顿了一下
    我猜测是非阻塞赋值的缘故
    因为两个状态是同时赋值的,如果改成了阻塞赋值呢?

    实现右到左依次熄灭

            else if(flag == 3'b001)
                begin
                    light <= {light[len-1:0], 1'b0};
                    if(light[6] == 0)
                        flag<=3'b010;       
                end
        
    

    类似的,这里也是循环移位,然后判断了light[6] == 0的时候跳转到下一个状态

    中间到两边亮

            else if(flag == 3'b010)
                begin
                    light[len:4]<={light[len-1:4], 1'b1};
                    light[len-4:0] <= {1'b1, light[len-4:1]};
                    if(light[1] == 1)
                        flag<=3'b011;
                end
        
    

    分成了7:4和3:0
    然后从中间开始往两边亮,代码写得很清楚了

    两边向中间灭

            else if(flag == 3'b011)
                begin
                    light[len:4]<={1'b0, light[len:5]};
                    light[len-4:0] <= {light[len-5:0], 1'b0};
                    if(light[2] == 0)
                        flag<=3'b100;
                end
        
    

    奇偶位循环点亮

            else if(flag == 3'b100)
                begin
                    light[len:4]<={1'b0, light[len:5]};
                    light[len-4:0] <= {1'b1, light[len-4:1]};
                    if(light[1] == 1)
                        flag<=3'b101;
                end
    

    奇偶位循环点亮这个没搞清楚

    相关文章

      网友评论

          本文标题:彩灯显示电路

          本文链接:https://www.haomeiwen.com/subject/wlnsxctx.html