首先认识一下分频电路
时钟是
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
奇偶位循环点亮这个没搞清楚
网友评论