FPGA流水灯

简介: FPGA流水灯
FPGA流水灯Demo
说明

8个led灯依次点亮,形成流水效果

分析
框图

状态机FSM

Verilog代码
`timescale 1ns / 1ps
//
// Create Date: 2022/11/20 20:41:08
// Design Name: wkk
// Module Name: water_led
// Description:  running 8 water leds 
// Revision 0.01 - File Created
// Additional Comments:
//
module water_led(
    input    sys_clk,                    // 50M
    input    sys_rst_n,
    output   reg [7:0] led_out
);
parameter  SYS_CLK          = 50_000_000;
parameter  TIME_MAX_COUNT   = 500_000;
localparam  S0               = 8'b0000_0001;
localparam  S1               = 8'b0000_0010;
localparam  S2               = 8'b0000_0100;
localparam  S3               = 8'b0000_1000;
localparam  S4               = 8'b0001_0000;
localparam  S5               = 8'b0010_0000;
localparam  S6               = 8'b0100_0000;
localparam  S7               = 8'b1000_0000;
wire   time_en;
reg    [19:0]   time_count;
reg [7:0] curr_state;
reg [7:0] next_state;
assign time_en = (time_count == TIME_MAX_COUNT -1) ? (1'b1) :(1'b0);
// clock division
// create time_en signal
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        time_count <= 20'b0;
    else if(time_count == TIME_MAX_COUNT-1)
        time_count <= 20'b0;
    else
        time_count <= time_count +1'b1;
end
// update current state from next state
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        curr_state <= 8'b0;
    else
        curr_state <= next_state;
end
// update fsm next state
always @(*) begin
    if(!sys_rst_n)
        next_state <= 8'b0;
    else if(time_en)
        case(curr_state) 
        S0:      next_state <= S1;
        S1:      next_state <= S2;
        S2:      next_state <= S3;
        S3:      next_state <= S4;
        S4:      next_state <= S5;
        S5:      next_state <= S6;
        S6:      next_state <= S7;
        S7:      next_state <= S0;
        default: next_state <= S0;
        endcase
    else ;
end
// create output signal
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        led_out <= 8'b0;
    else
        led_out <= curr_state;
end
    
endmodule
testbench
`timescale 1ns / 1ns
// Create Date: 2022/11/20 21:15:13
// Design Name: wkk
// Module Name: water_led_tb
// Description: water_led testbench
// Revision 0.01 - File Created
// Additional Comments:
//
module water_led_tb;
reg                sys_clk;
reg                sys_rst_n;
wire       [7:0]   led_out;
water_led  #(
    .TIME_MAX_COUNT (2)
)u_water_led(
    .sys_clk     (sys_clk),
    .sys_rst_n   (sys_rst_n),
    .led_out     (led_out)
);
initial begin
    sys_clk   = 0;
    sys_rst_n = 0;
    #20 sys_rst_n = 1;
end
always begin 
    #5 sys_clk = !sys_clk;
end
initial begin
    # 2000;
    $stop;
end
endmodule

仿真结果

通用代码

// author : wkk
module WaterLed#(
    parameter   INPUT_CLK    =     27_000_000       ,   // input clk frequency
    parameter   LED_NUM      =     6                ,   // led quantity
    parameter   COUNT_WIDTH  =     36               ,   // time counter bit quantity
    parameter   COUNT_MAX    =     27_000_000       ,   // max count value
    // LED MODE 1 ? 0 -> on       
    parameter   LED_MODE     =     0                    // led control mode: if 1 --> led on  or  0 --> led on                     
)(
    input                                       clk                     ,
    input                                       rst_n                   ,
    output      [LED_NUM-1:0]                   led                     
);
reg     [LED_NUM-1: 0]     curr_state                   ;
reg     [LED_NUM-1: 0]     next_state                   ;
reg     [LED_NUM-1:0]      led_out                      ;
reg                        time_en                      ;
reg     [COUNT_WIDTH-1:0]  time_count                   ;
always  @(posedge   clk or negedge rst_n) begin 
    if( !rst_n ) begin
        time_count <= {COUNT_WIDTH{1'b0}};
        time_en    <=  1'b0;
    end
    else begin
        if( time_count == COUNT_MAX-1) begin
            time_count <= {COUNT_WIDTH{1'b0}};
            time_en    <= 1'b1;
        end 
        else begin
            time_en    <= 1'b0;
            time_count <= time_count + 1'b1;
        end
    end
end
always @(posedge clk or negedge rst_n) begin
    if( !rst_n ) 
          curr_state <=  {{(LED_NUM-1){1'b0}},1'b1};
    else
          curr_state <= next_state;
end
always @(*) begin
    if(!rst_n )
        next_state = {{(LED_NUM-1){1'b0}},1'b1};
    else begin
        if( time_en )  
            next_state = {curr_state[LED_NUM-2:0],curr_state[LED_NUM-1]};
        else
            next_state = curr_state;
    end
end
always @(posedge clk or negedge rst_n) begin
    if(!rst_n ) 
        led_out <= {LED_NUM{1'b0}};
    else begin
        if( LED_MODE == 1) 
               led_out <= curr_state;
        else
               led_out <= ~curr_state;
    end
end
assign led = led_out;
endmodule
相关文章
|
异构计算
FPGA新起点V1开发板(九)——流水灯
FPGA新起点V1开发板(九)——流水灯
290 2
|
异构计算 内存技术
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
567 0
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
|
异构计算
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
433 0
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
|
异构计算
FPGA学习之流水灯的简单设计
流水灯的简单设计 设计要求:低位点亮一个led,下一个周期,点亮两个led,逐次增加led的个数,全部点亮后的下一个周期,又点亮一个led 该实验需要两个模块,计数器模块和led控制模块 计数器模块:就是一个分频器,频率为2hz,系统时钟为50mhz,50_000_000/2=25_000_000,需要25位计数器。 Led控制模块:控制移位,到达全0时,led
1815 0
|
C语言 异构计算
【黑金原创教程】【FPGA那些事儿-驱动篇I 】【实验一】流水灯模块
实验一:流水灯模块 对于发展商而言,动土仪式无疑是最重要的任务。为此,流水灯实验作为低级建模II的动土仪式再适合不过了。废话少说,我们还是开始实验吧。 图1.1 实验一建模图。 如图1.1 所示,实验一有名为 led_funcmod的功能模块。
1160 0
|
8月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于FPGA的SNN脉冲神经网络之LIF神经元verilog实现,包含testbench
本项目展示了 LIF(Leaky Integrate-and-Fire)神经元算法的实现与应用,含无水印运行效果预览。基于 Vivado2019.2 开发,完整代码配有中文注释及操作视频。LIF 模型模拟生物神经元特性,通过积分输入信号并判断膜电位是否达阈值产生脉冲,相较于 Hodgkin-Huxley 模型更简化,适合大规模神经网络模拟。核心程序片段示例,助您快速上手。
|
11月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的变步长LMS自适应滤波器verilog实现,包括testbench
### 自适应滤波器仿真与实现简介 本项目基于Vivado2022a实现了变步长LMS自适应滤波器的FPGA设计。通过动态调整步长因子,该滤波器在收敛速度和稳态误差之间取得良好平衡,适用于信道均衡、噪声消除等信号处理应用。Verilog代码展示了关键模块如延迟单元和LMS更新逻辑。仿真结果验证了算法的有效性,具体操作可参考配套视频。
396 74
|
9月前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
|
9月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
本内容展示了基于Vivado2019.2的算法仿真效果,包括设置不同信噪比(SNR=8db和20db)下的结果及整体波形。同时,详细介绍了2ASK调制解调技术的原理与实现,即通过改变载波振幅传输二进制信号,并提供数学公式支持。此外,还涉及帧同步理论,用于确定数据帧起始位置。最后,给出了Verilog核心程序代码,实现了2ASK解调与帧同步功能,结合DDS模块生成载波信号,完成信号处理流程。
177 0
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现了16QAM基带通信系统,包括调制、信道仿真、解调及误码率统计模块。通过Vivado2019.2仿真,设置不同SNR(如8dB、12dB),验证了软解调相较于传统16QAM系统的优越性,误码率显著降低。系统采用Verilog语言编写,详细介绍了16QAM软解调的原理及实现步骤,适用于高性能数据传输场景。
520 69

热门文章

最新文章