彩灯显示电路

2019-06-05  本文已影响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

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

上一篇 下一篇

猜你喜欢

热点阅读