`
steeven
  • 浏览: 313812 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

复杂一点的灯光控制verilog fsm

阅读更多
`define N_LED 4
`define LEDS_OFF {`N_LED{1'b1}}
`define LEDS_ON {`N_LED{1'b0}}
`define RIGHT_ON {{`N_LED-1{1'b1}}, 1'b0}
`define LEFT_ON { 1'b0, {`N_LED-1{1'b1}}}
module LedFsm (
    input clk, input rst_n, 
    output [`N_LED-1:0] leds); //0:on, 1:off
    parameter N_MODE = 4;
    parameter N_TICK = 50_000_0; //50Mhz, tick on 100ms 
        
    // led change:
    // all on, off
    // left to right
    // right to left
    // arrive from both side

    /* Tick counter*/    
    reg[15:0] cnt;
    wire tick; 
    assign tick = cnt == N_TICK ? 1: 0;
    always @(posedge clk or negedge rst_n) begin //tick counter
        cnt <= !rst_n || tick ? 0 : cnt + 1;
    end
    
    /* Mode fsm */
    reg [7:0] mode_fsm; //sequence fsm
    wire [2:0] mode_enable; //0: flash 1: walk 2: backward walk
    wire [2:0] step_last;  //last step of each mode 
    always @(posedge tick, negedge rst_n) //1, shift left, 0(stop)
            mode_fsm <= !rst_n ? 1: //reset
            !mode_enable && step_last ? 0 : // end if hit 0
            step_last ? mode_fsm + 1 : mode_fsm; 

    /* Program your mode sequence here */
    assign mode_enable = !rst_n ? 0 :  
        mode_fsm == 1 ? 'b001 : //flash
        mode_fsm == 2 ? 'b010 : //walk
        mode_fsm == 3 ? 'b100 : //walk back
        mode_fsm == 4 ? 'b110 : //walk bi-direction
        mode_fsm == 5 ? 'b001 : //flash
        0; //end

    wire [`N_LED-1:0] flash_leds;
    FlashLeds flash(tick, rst_n, mode_enable[0], step_last[0], flash_leds);
    
    wire [`N_LED-1:0] walk_leds;
    WalkLeds #(1) walk(tick, rst_n, mode_enable[1], step_last[1], walk_leds);
    
    wire [`N_LED-1:0] walk_back_leds;
    WalkLeds #(0) walk_back(tick, rst_n, mode_enable[2], step_last[2], walk_back_leds);

    assign leds = flash_leds & walk_leds & walk_back_leds;
endmodule

/* Flash Mode*/
module FlashLeds(
    input tick, rst_n, enable, 
    output last, output [`N_LED-1:0] leds);
    reg[0:0] fsm; //0:on, 1:0ff, 2: end
    always @(posedge tick, negedge rst_n)
        fsm <= !rst_n || !enable ? 0 : //reset, default to on
            fsm == 0 ? 1 : 0; //toggle
    assign last = !rst_n || !enable ? 0 : fsm == 1; //last step
    assign leds = !rst_n || !enable ? `LEDS_OFF : //default off
        fsm[0] ? `LEDS_OFF : `LEDS_ON;
endmodule

/* Walk */
module WalkLeds(
    input tick, rst_n, enable, 
    output last, output [`N_LED-1:0] leds);
    parameter R_TO_L = 1; //walk from right to left
    localparam INIT_LEDS = R_TO_L ? `RIGHT_ON : `LEFT_ON ;
    localparam LAST_LEDS = R_TO_L ? `LEFT_ON : `RIGHT_ON ;
    reg[`N_LED-1:0] fsm;  //n bits, shift left or right
    always @(posedge tick, negedge rst_n)
        fsm <= (!rst_n || !enable) ? INIT_LEDS : //reset
            last ? INIT_LEDS : //end? 
            R_TO_L ? ~(~fsm << 1) : ~(~fsm >> 1); //walk
    assign last = !rst_n || !enable ? 0 : fsm == LAST_LEDS; //last step
    assign leds = !rst_n || !enable ? `LEDS_OFF : fsm;
endmodule

module TestLedFsm;
    reg clk, rst_n;
    wire [3:0] leds;
    initial clk = 0;
    initial rst_n = 0;
    always #10 clk = ~clk;
    initial #25 rst_n = 1;
    
    LedFsm #(.N_MODE(4), .N_TICK(4)) fsm(clk, rst_n, leds);
    initial $display("\t\t\t\ttime, leds, fsm.mode_fsm");
    initial $monitor("%d\t%b\t%b", 
                       $time, leds,  fsm.mode_fsm);
    
endmodule
0
0
分享到:
评论

相关推荐

    汽车尾灯控制电路的verilog程序,DE0可以

    4. **状态机**:复杂的控制逻辑,如尾灯的各种模式,可能需要使用状态机(Finite State Machine, FSM)。状态机由一组预定义的状态和状态之间的转换规则组成。例如,可以定义一个FSM来管理刹车灯、转向灯和示宽灯的...

    用verilog语言编写的交通灯(FSM)

    在这个"用Verilog语言编写的交通灯(FSM)"项目中,我们关注的是如何使用Verilog来实现一个状态机(FSM),模拟实际生活中交通灯的运行规律。 交通灯的控制逻辑可以通过有限状态机来实现,这是一种非常常见且实用的...

    用verilog语言编写的交通灯控制器实现.rar

    在这个名为"用verilog语言编写的交通灯控制器实现.rar"的压缩包中,我们找到了一个交通灯控制器的设计实例,这对于我们理解Verilog在实际应用中的工作原理非常有帮助。 首先,交通灯控制器的设计要求及其思路.doc...

    FPGA Verilog开发实战指南-15_fsm.zip

    Verilog的关键概念包括模块、实例化、并行执行、时序控制等,使得它能够描述复杂的数字系统。 3. **状态机(FSM)设计** 在15_fsm部分,我们将学习如何使用Verilog设计有限状态机(Finite State Machine)。FSM是...

    verilog 编写的流水灯程序

    在Verilog中,我们可以用状态机(Finite State Machine, FSM)的概念来控制LED的亮灭顺序。 1. **状态机设计**:状态机是Verilog设计的核心部分,它决定了系统的运行流程。在流水灯程序中,可能有多个状态,如"灯1...

    FPGA-8位流水灯(基于FSM)

    本篇将深入探讨如何使用FPGA实现一个8位流水灯的设计,该设计是通过有限状态机(Finite State Machine, FSM)来控制的。 **一、FPGA基础** FPGA是一种集成电路,其内部包含大量的可编程逻辑单元,如查找表(LUT)...

    信号灯_verilog_有限状态机_

    在这个“信号灯_verilog_有限状态机”项目中,我们聚焦于使用 Verilog 实现一个定时跳转状态的信号灯控制系统。这个系统能够通过控制信号来灵活调整信号灯的状态,适应不同的交通流需求。 有限状态机(Finite State...

    基于fpga汽车尾灯控制电路代码

    综上所述,基于FPGA的汽车尾灯控制电路设计不仅涉及硬件设计的基本原理,还涉及到复杂的逻辑控制和状态管理。通过合理利用FPGA强大的可编程特性,可以实现灵活多变的尾灯控制方案,进一步提升行车安全性和用户体验。

    流水灯verilog代码

    2. **状态机(Finite State Machine, FSM)**:流水灯的设计通常涉及到一种特殊类型的控制逻辑,即状态机。状态机将根据时间顺序控制LED的亮灭,从一个状态转换到另一个状态,形成“流水”效果。在这个设计中,状态...

    verilog 流水灯/跑马灯

    在这个项目中,我们使用Verilog来实现一个流水灯或跑马灯的设计,这是一种常见的数字电路实验,通常用于教学目的以展示基本的定时和控制概念。 跑马灯是一种LED灯按照特定顺序闪烁的效果,仿佛灯光在环形排列的LED...

    Verilog HDL交通灯控制器工程实现

    1. **状态机(Finite State Machine, FSM)**:交通灯控制器的核心是一个状态机,它按照预设的顺序控制不同灯组(红绿黄)的亮灭。状态机有若干个状态,每个状态代表一种交通灯组合,通过状态转换条件进行切换。 2....

    基于fpga的交通灯(verilog)

    8. **实验板与接口**:实际应用中,交通灯Verilog设计需要连接到FPGA开发板的GPIO引脚,通过这些引脚控制外部LED灯来模拟交通灯。开发板可能需要额外的电源和控制信号,这在设计中也需要考虑。 综上所述,基于FPGA...

    verilog 交通灯

    在这个“verilog 交通灯”项目中,作者使用了Verilog HDL(硬件描述语言)来设计了一个交通灯控制系统的模型。Verilog是一种强大的语言,用于描述数字系统的结构和行为,适用于模拟硬件行为和实现数字逻辑。 交通灯...

    verilog设计交通灯系统(包括无状态机和有状态机情况)

    - **有状态机(FSM)**:有状态机更适用于复杂逻辑,例如多个阶段的交通灯控制。每个状态对应于交通灯的不同颜色(红、黄、绿),并且状态之间的转换取决于当前状态和某些条件。Verilog中的状态机可以使用case语句...

    11【Verilog实战】交通信号灯RTL&TB.zip,博文【Verilog实战】栏目,项目11的完整RTL和TB

    【Verilog实战】交通信号灯RTL&TB.zip 文件包含了用于实现交通信号灯控制逻辑的Verilog代码,这是数字电路设计中的一个典型应用。Verilog是一种硬件描述语言(HDL),常用于描述数字系统的结构和行为,包括微处理器...

    电梯控制电路.rar_verilog 电梯_verilog电梯控制_单片机_电梯 verilog_电梯 控制

    总的来说,使用Verilog设计电梯控制电路是一项涉及硬件描述语言、数字逻辑设计和嵌入式系统综合的复杂任务,需要对相关领域有扎实的理论基础和实践经验。这样的系统不仅能够提高电梯的运行效率,也为现代建筑的自动...

Global site tag (gtag.js) - Google Analytics