首页 > 代码库 > 循环移位法和数据拼接法基于led

循环移位法和数据拼接法基于led

功能描述 让led每隔0.5s从两边向中间闪烁,然后在从中间向两边闪烁,不断循环

项目实现

开发板 晶振为50M,那么达到0.5s时计数器count1需要达到24_999_999这么多次数

计数器代码为

1 always@(posedge CLK or negedge RSTn)2 if(!RSTn)3     Count1<=28d0;4 else if(Count1==TIME)5     Count1<=28d0;6 else7     Count1<=Count1+1b1;

可以让前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<=1b0; 5         TIME_MS<=4b0;
    end
6 else if(Count1==TIME) 8 if(TIIME_MS==4d10) 9 TIME_MS<=4d0;10 else if(TIME_MS>=4d0&&TIME_MS<4d5)11 FLAG<=1b0;12 else if(TIME_MS>=4d5&&TIME_MS<4d10)13 FLAG<=1b1; 14 else 15 TIME_MS<=TIME_MS+1b1;

功能模块程序为

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<=5b10000;else if(Count==TIME)    begin        if(!FLAG)            rLED_Out<={1b0,[4:1]rLED_Out};//应为rLED_Out[4:1]        else if(FLAG)            rLED_Out<={[3:0]rLED_Out,1b0};    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 U111 (12 .CLK(CLK),13 .RSTn(RSTn),14 .LED_Out(LED_Out1)15 );16 17 wire[9:5] LED_Out2;18 module_xunhuan_led U219 (20 .CLK(CLK),21 .RSTn(RSTn),22 .LED_Out(LED_Out2)    23 );24 assign LED_Out={LED_Out1,LED_Out2};

rtl 视图为:技术分享

 

循环移位法和数据拼接法基于led