这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » LED闪烁实验

共4条 1/1 1 跳转至

LED闪烁实验

高工
2012-11-27 09:16:54     打赏
这是参照手把手教你学习FPGA—LED篇 进行的实验
依然是一个模拟实验,led输出反转表示led闪烁
代码基本没动,只是仿真时候如果分频太高的话不容易看出来led端的波形,将分频比降低到了32分频。

仿真时,将sys_clk设置为时钟。先将sys_rstn强制设置为0,运行一下停止后再将其设置为1.即先复位一下,才能是led开始工作
设置时钟:


设置复位信号:



仿真时实验结果如图:



程序代码如下,要注意两个啊always模块是并行执行的与c语言有区别:
   
module LED_Flicker(sys_clk,sys_rstn,led);
//变量定义
input                sys_clk;
input                sys_rstn;
output        [7:0]    led;


//定义寄存器
reg        [7:0]        led;
reg        [5:0]    delay_cnt;

//两个always模块并行执行
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
        begin
            delay_cnt <= 5'd0;
        end
        else
        begin
            if(delay_cnt == 5'd16)
                delay_cnt <= 5'd0;
            else
                delay_cnt <= delay_cnt+1'b1;
        end
    end
   
    always@(posedge sys_clk or negedge sys_rstn)
        begin
            if(!sys_rstn)
                led <= 8'b11111111;
            else
                if(delay_cnt == 5'd16)
                    led <=~led;
                else
                    led <= led;
        end

endmodule




关键词: 闪烁     实验    

高工
2012-11-27 10:16:20     打赏
2楼
参照版主的流水灯实验。这个实验基本就是分频和移位操作。
理解了闪烁灯之后,这个实验就很容易做了。

仿真波形如下,LED输出用的8位2进制显示,可以清楚看到哪一个灯亮哪一个等灭:


代码如下:
   
module LED_watter(sys_clk,sys_rstn,led);
//变量定义
input                sys_clk;
input                sys_rstn;
output        [7:0]    led;


//定义寄存器
reg        [7:0]        led;
reg        [5:0]    delay_cnt;

//两个always模块并行执行
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
        begin
            delay_cnt <= 5'd0;
        end
        else
        begin
            if(delay_cnt == 5'd16)
                delay_cnt <= 5'd0;
            else
                delay_cnt <= delay_cnt+1'b1;
        end
    end
   
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
            led <= 8'b11111111;
        else
        begin
            if(delay_cnt == 5'd16)
            begin
                led <= led<<1;
                if(led == 8'b00000000)
                    led <= 8'b11111111;
            end
        end
    end

endmodule

院士
2012-11-27 10:47:37     打赏
3楼
对verilog语言是并行处理的。而C语言是顺序执行。

强悍的楼主,打不倒的楼主……

高工
2012-11-27 16:14:21     打赏
4楼
咱就是只打死的小强。led试验到此为止,以后试验会继续用led做输出。

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]