功能描述 让led每隔0.5s从两边向中间闪烁,然后在从中间向两边闪烁,不断循环
项目实现
开发板 晶振为50M,那么达到0.5s时计数器count1需要达到24_999_999这么多次数
计数器代码为
1 always@(posedge CLK or negedge RSTn) 2 if(!RSTn) 3 Count1<=28'd0; 4 else if(Count1==TIME) 5 Count1<=28'd0; 6 else 7 Count1<=Count1+1'b1;
可以让前5个led进行循环移位法 后五位进行数据拼接法
循环移位法:先让led灯进行循环右移当达到2.5s时让其反向移动,当到达5s时初始化为0 可以设置一个标志位 在0~2.5s时设置FLAG为0,在2.5~5秒时设置FLAG置一
1 always@(posedge CLK or negedge RSTn) 2 if(!RSTn) 3 begin 4 FLAG<=1'b0; 5 TIME_MS<=4'b0;
end
6 else if(Count1==TIME) 8 if(TIIME_MS==4'd10) 9 TIME_MS<=4'd0; 10 else if(TIME_MS>=4'd0&&TIME_MS<4'd5) 11 FLAG<=1'b0; 12 else if(TIME_MS>=4'd5&&TIME_MS<4'd10) 13 FLAG<=1'b1; 14 else 15 TIME_MS<=TIME_MS+1'b1;
功能模块程序为
always@(posedge CLK or negedge RSTn)
if(!RSTn)
rLED_Out<=5'd1;
else if(!FLAG)
rLED_Out<=rLED_Out>>1;
else if(FLAG)
rLED_Out<=rLED_Out<<1;
在数据拼接中同样的是
always@(posedge CLK or negedge RSTn) if(!RSTn) rLED_Out<=5'b10000; else if(Count==TIME) begin if(!FLAG) rLED_Out<={1'b0,[4:1]rLED_Out};//应为rLED_Out[4:1] else if(FLAG) rLED_Out<={[3:0]rLED_Out,1'b0}; end
然后在顶层模块中组合起来
1 module led_top_module 2 ( 3 CLK,RSTn,LED_Out 4 ); 5 input CLK; 6 input RSTn; 7 output [9:0] LED_Out; 8 9 wire [4:0] LED_Out1; 10 module_yiwei_led U1 11 ( 12 .CLK(CLK), 13 .RSTn(RSTn), 14 .LED_Out(LED_Out1) 15 ); 16 17 wire[9:5] LED_Out2; 18 module_xunhuan_led U2 19 ( 20 .CLK(CLK), 21 .RSTn(RSTn), 22 .LED_Out(LED_Out2) 23 ); 24 assign LED_Out={LED_Out1,LED_Out2};
rtl 视图为: