FPGA学习——verilog实现流水灯

学习芯片: EP4CE6F17C8

一、使用verilog实现电亮fpga板上的四个灯

verilog代码如下:

module led1(

    output wire  [3:0] led_on
);

assign led_on = 4'b1111 ;

endmodule

配置引脚,查看芯片的指导书:
在这里插入图片描述
烧录运行结果如下:
在这里插入图片描述
如图我们可以看见开发板上四个led灯同时被电亮。

二、进阶——使led灯间隔一秒闪烁

代码如下:

module led1(
    input wire clk,//时钟信号,50MHz
    input wire rst_n,//复位信号,下降沿有效
    output wire  [3:0] led_on
);

parameter MAX1S = 26'd50_000_000;
reg [25:0] cnt1s;//计数寄存器器1s
reg [3:0]   led_r;//led信号寄存器

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位,重新计数
       cnt1s<=26'd0;
    end
    else if (cnt1s == MAX1S-1'b1)begin//记到最大数,重新计数
       cnt1s<=26'd0;
    end
    else begin//其他情况+1
      cnt1s <= cnt1s + 1'd1;
    end

   
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位
        led_r = 4'b0000;
    end
    else if (cnt1s == MAX1S-1'b1)begin//记到最大数,翻转
        led_r = ~led_r;
    end
    else begin
        led_r = led_r;
    end
    
end

assign led_on = led_r;

endmodule

配置引脚,查看clock和key的引脚:
在这里插入图片描述
运行结果如下图:
在这里插入图片描述

此时可以看见四个led灯同时闪烁。

三、进阶——流水灯及跑马灯实现

流水灯代码实现:

module led1(
    input wire clk,//时钟信号,50MHz
    input wire rst_n,//复位信号,下降沿有效
    output wire  [3:0] led_on
);

parameter MAXS = 25'd25_000_000;
reg [24:0] cnt1s;//计数寄存器器0.5s
reg [3:0]   led_r;//led信号寄存器

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位,重新计数
       cnt1s<=26'd0;
    end
    else if (cnt1s == MAXS-1'b1)begin//记到最大数,重新计数
       cnt1s<=26'd0;
    end
    else begin//其他情况+1
      cnt1s <= cnt1s + 1'd1;
    end

   
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位
        led_r = 4'b0001;
    end
    else if (cnt1s == MAXS-1'b1)begin//记到最大数,翻转
        led_r = {led_r[2:0],led_r[3]};
    end
    else begin
        led_r = led_r;
    end
    
end

assign led_on = led_r;

endmodule

实验效果图如下:
在这里插入图片描述

此时可以看见led灯依次闪烁。

跑马灯代码:

module led1(
    input wire clk,//时钟信号,50MHz
    input wire rst_n,//复位信号,下降沿有效
    output wire  [3:0] led_on
);

parameter MAXS = 25'd25_000_000;
reg [24:0] cnt1s;//计数寄存器器0.5s
reg [3:0]   led_r;//led信号寄存器

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位,重新计数
       cnt1s<=26'd0;
    end
    else if (cnt1s == MAXS-1'b1)begin//记到最大数,重新计数
       cnt1s<=26'd0;
    end
    else begin//其他情况+1
      cnt1s <= cnt1s + 1'd1;
    end

   
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位
        led_r = 4'b0001;
    end
    else if (cnt1s == MAXS-1'b1)begin//记到最大数,翻转
        led_r = {led_r[2:0],~led_r[3]};
    end
    else begin
        led_r = led_r;
    end
    
end

assign led_on = led_r;

endmodule

实验效果图如下:
在这里插入图片描述

  • 9
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个用51汇编语言设计的定时器中断控制8个LED循环点亮延时1s的代码,供你参考: ``` ORG 0 JMP START ORG 0BH MOV TL0, #0CDH ; 设置定时器计数器初值 MOV TH0, #04H ; 设置计时周期为1s SETB TR0 ; 启动定时器0 RETI ; 返回中断 START: MOV P1, #00H ; 初始化LED状态 MOV R0, #01H ; 初始化流水状态 MOV R1, #80H ; 初始化控制位 SETB EA ; 开启总中断 LOOP: MOV A, R0 MOV P1, A ; 控制LED状态 MOV A, R1 MOV C, ACC.0 RLC A ; 循环左移控制位 MOV R1, A MOV A, R1 MOV C, ACC.0 JNB C, NEXT ; 判断控制位是否为1 MOV A, P1 CPL A ; 取反LED状态 MOV P1, A NEXT: MOV R7, #255 ; 延时操作 DELAY: DJNZ R7, DELAY CJNE R0, #80H, NEXT2 ; 判断是否到达流水最后一个状态 MOV R0, #01H JMP LOOP NEXT2: INC R0 JMP LOOP ``` 这段代码实现了通过定时器0中断控制8个LED的循环点亮,并在每个流水状态之间延时1s。具体实现过程如下: 1. 在程序开始时,初始化LED状态和流水状态,并开启总中断。 2. 进入主循环,先将当前流水状态输出到8个LED上。 3. 然后进行控制位移位操作,控制位初始值为1000 0000B,每次循环左移1位,当控制位最高位为1时,将8个LED状态全部取反。 4. 然后进行延时操作,这里使用了一个简单的循环计数器实现,每次循环减1,一直循环到0时停止。 5. 判断当前流水状态是否到达最后一个状态,如果是,则重置流水状态为第一个状态;如果不是,则将流水状态加1。 6. 回到主循环,重复以上步骤。 当定时器0计时周期结束时,会触发中断,并执行中断处理程序。在这里,我们设置了定时器计数器初值和计时周期,当计数器从初值开始计数到计时周期时,就会触发中断。在中断处理程序中,我们重新设置定时器计数器初值和计时周期,并启动定时器,从而实现了延时1s的效果。 同样需要注意的是,这段代码只是实现了基本功能,具体的实现方式可能因不同的硬件平台和编译器而有所不同。如果你需要在实际项目中使用这段代码,请根据实际情况进行修改和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值