【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)

这篇具有很好参考价值的文章主要介绍了【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

verilog基础语法与应用:位操作——流水灯/跑马灯

今天的实验是计数器实验的升级,设计让8个LED灯以每个0.5s的速率循环闪烁

1 移位法实现

1.1 移位方法1

每个LED灯代表一位,共8位,亮为1,灭为0

如何实现这样的逻辑呢?

移位操作即可!

怎么样才能移位呢?

第一个状态需满足最低位为1,然后每次左移1个

  • 源代码
module led_run(
    clk,
    reset_n,
    led
    );
    input clk;
    input reset_n;
    output reg [7:0] led;
    
    reg [24:0] counter;
    
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            counter <= 0;
        else if(counter == 2500_0000-1)
      //  else if(counter == 2500-1) //为了仿真的时候方便观察,把数字改小
            counter <= 0;
        else
            counter <= counter + 1'd1;
            
            
    // 用移位方法实现 8个灯循环闪烁
    //0000_0001    
    //0000_0010    
    //0000_0100    
    //0000_1000    
    //0001_0000    
    //0010_0000    
    //0100_0000 
    //1000_0000    

     always@(posedge clk or negedge reset_n)
        if(!reset_n)
            led <= 8'b0000_0001;
        else if(counter == 2500_0000-1)
      //  else if(counter == 2500-1) //为了仿真的时候方便观察,把数字改小,现在是0.05ms

            begin
                if(led==8'b1000_0000)
                    led <= 8'b0000_0001;
                else
                    led <= led << 1; //  '<<' 是左移
            end
        else
            led <= led; // 还未到时间,led灯状态不变 (这句话不写默认也是这样)
      
endmodule
  • 仿真代码
`timescale 1ns / 1ps

module led_run_tb;

    reg clk;
    reg reset_n;
    wire [7:0] led;
    
    led_run UUT(
        .clk(clk),
        .reset_n(reset_n),
        .led(led)
    );
    
    initial clk = 1;
    always#10 clk =~ clk;

    initial begin
        reset_n = 0;
        #201;
        reset_n = 1;
        #4000000;  //仿真时是小数字,0.05ms闪烁一次
        $stop;
    end

endmodule
  • 功能仿真结果

.clk(clk),,FPGA,fpga开发

  • 管脚分配

.clk(clk),,FPGA,fpga开发

效果

1.2 移位方法2

之前我们直接使用了左移操作符实现移位操作,现在我们改进一下,使用位拼接操作来实现

.clk(clk),,FPGA,fpga开发

我们该如何理解

led <= {led[6:0],led[7]}; //使用位拼接完成移位
                          //每次把led[7]的值放到到上一次的led[0]的位置,led[6]代替led[7]

画一张图帮助理解

.clk(clk),,FPGA,fpga开发

2 利用之前的3-8译码器(学会模块调用模块)

  • 先打开之前的 decoder_3_8的文件
  • 把decoder_3_8.v 的文件复制到这个路径下(E:\vivado_project\led_run\led_run.srcs\sources_1\new)这是我的路径
  • 然后就成了这样
  • 添加到工程中来
  • 然后,工程中就有了3-8译码器的文件

.clk(clk),,FPGA,fpga开发

  • 在led_run2的文件中例化3-8译码器的文件

    • 首先我们需要生成一个新的计数器(代表a、b、c)

    .clk(clk),,FPGA,fpga开发

    • 然后例化(类似仿真的例化)

    .clk(clk),,FPGA,fpga开发

    • 由于之前在decoder_3_8中,out已经定义为了reg型,就不能再把led定义为reg型,所以led的reg需要去掉

.clk(clk),,FPGA,fpga开发

  • 下面我们仿真一下,看看是否成功实现了功能,我们不用再写一个仿真文件,只需要在之前的仿真文件下面改一下即可
  • 分析仿真结果

.clk(clk),,FPGA,fpga开发

从结果我们可以看出,与之前的一样,证明我们成功了

源文件

module led_run2(
    clk,
    reset_n,
    led
    );
    input clk;
    input reset_n;
    output [7:0] led;
    

    reg [24:0] counter;
    
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            counter <= 0;
        else if(counter == 2500_0000-1)
       // else if(counter == 2500-1) //为了仿真的时候方便观察,把数字改小
            counter <= 0;
        else
            counter <= counter + 1'd1;

    reg [2:0] counter2; //引入一个新的3位计数器
    
     always@(posedge clk or negedge reset_n)
        if(!reset_n)
            counter2 <= 0;
//         else if(counter2 == 7) 由于3位2进制数最大就是7,所以这个else if 可省略不写
//            counter2 <= 0;
         else if(counter == 2500_0000-1)
       //else if(counter == 2500-1) //为了仿真的时候方便观察,把数字改小
            counter2 <= counter2 + 1'b1;
            
    decoder_3_8  decoder_3_8(
               .a(counter2[2]),
               .b(counter2[1]),
               .c(counter2[0]),
               .out(led)
           );
    
endmodule

最后附上效果图
.clk(clk),,FPGA,fpga开发文章来源地址https://www.toymoban.com/news/detail-794855.html

到了这里,关于【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA Verilog开发实战指南】初识Verilog HDL-基础语法

    就是用代码来描述硬件结构 语言有VHDL与Verilog HDL Verilog HDL 是从C语言来的,学的快 ###例子 也叫保留字,一般是小写 module 表示模块的开始 endmodule 模块的结束 模块名 一般与.v文件的名字一致 输入信号 input 输出信号 output 既做输入也做输出 inout 需要一些变量和参数对输

    2024年02月21日
    浏览(36)
  • FPGA学习——verilog实现流水灯

    学习芯片: EP4CE6F17C8 verilog代码如下: 配置引脚,查看芯片的指导书: 烧录运行结果如下: 如图我们可以看见开发板上四个led灯同时被电亮。 代码如下: 配置引脚,查看clock和key的引脚: 运行结果如下图: 此时可以看见四个led灯同时闪烁。 流水灯代码实现: 实验效果图如

    2024年02月16日
    浏览(48)
  • FPGA 学习笔记:Verilog 实现LED流水灯控制

    在初步了解 Xilinx Vivado 的使用后,开启了FPGA Hello World 程序:LED 流水灯控制 在嵌入式MCU中,流水灯需要延时来实现,FPGA的延时,使用外部晶振来实现 实现 3个 LED 流水灯控制,也就是循环依次点亮, LED 低电平亮, 高电平灭,FPGA 有一个40MHz的外部晶振,作为系统时钟输入开

    2023年04月08日
    浏览(32)
  • FPGA_学习_04_Verilog基础语法和Modelsem仿真

    前言:对于以前学过C/C++/C#的作者来讲,Verilog的基础语法算是 特别简单 的。本文主要介绍Verilog的基础语法和Modelsem仿真。 FPGA开发是以模块为基础的,每个可 综合 的.v文件都是一个模块,模块由 module 和 endmodule 来声明。在这两个的内部,完成模块功能的实现。 在Vi

    2024年02月05日
    浏览(38)
  • 5.2 FPGA:基于verilog的LED流水灯设计(多种方法)

    目录 设计目标:8个LED灯以每0.5s的速率进行循环闪烁 方法1:移位法实现 设计模块 仿真代码 实验结果  方法2:循环移位方法  设计模块 方法3:使用三八译码器实现流水灯 顶层模块 底层模块 当仿真时时间长,可以减小设计代码的计数次数,对分析移位功能没有影响。 设计

    2024年02月06日
    浏览(37)
  • Verilog基础语法(4)之模块和端口及其例化和处理

    Verilog进行FPGA/IC设计值,通常划分为各个子模块,木模块之间可能相互例化,并在顶层统一例化,并连接成一个顶层模块文件。 基本的模块模板: 如果模块内的变量位宽参数化,则模块模板为: 例化带参数的模块: 端口类型/端口描述 input 设计模块只能使用其input端口从外部

    2024年02月13日
    浏览(30)
  • FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

    VGA显示 目标:实现屏幕红、橙、黄、绿、青、蓝、紫、黑、白、灰条形显示 1. 模块框图与波形图 vga_colorbar是实现目标功能的总体模块框图,为了实现对应的输出,我们使用三个具体功能模块实现功能。 (1) clk_gen——使用pll锁相环实现时钟分频 (2)vga_ctrl——图像控制与输出模

    2024年02月04日
    浏览(35)
  • 【FPGA基础入门实践】Verilog 基本项目操作逐步演示

    0x00 回顾:AND/OR/NOT 逻辑的特性 AND: 与门可以具有两个或更多的输入,并返回一个输出。当所有输入值都为 1 时,输出值为 1。如果输入值中有任何一个为 0,则输出值为 0。 OR: 或门可以具有两个或更多的输入,并返回一个输出。如果输入值中至少有一个为 1,则输出值为

    2024年02月12日
    浏览(32)
  • 【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。

    【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。 模块是FPGA中最基本的构建模块。通常一个模块代表一个电路,包括输入、输出和处理逻辑。模块中包含的处理逻辑被称为时序逻辑。

    2024年02月04日
    浏览(65)
  • notepad++的Verilog语法检查(调用modelsim的语法)

    一、在modelsim中新建一个工程,然后写一个Verilog代码,然后编译,目的是为了得到此工程文件夹下的work文件。打开此工程的文件夹,找到work文件夹,复制到notepad++的安装路径下。   (图1.是我自己在D盘创建的一个文件夹project_mux,用来存放步骤一modelsim生成的文件,图2.可以

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包