从零开始学习vivado——day4 跑马灯(让8个LED灯以每个0.5s的速率循环闪烁)

这篇具有很好参考价值的文章主要介绍了从零开始学习vivado——day4 跑马灯(让8个LED灯以每个0.5s的速率循环闪烁)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

研一从零开始学习verilog!!!此时不学何时学!
第一次写博客,以此激励自己努力学习!
我跟的视频教程是b站的一个up主,小梅哥爱漂流。

一、vivado是什么?

二、跑马灯设计(让8个LED灯以每个0.5s的速率循环闪烁)

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==25000-1)//本来应该是25000000-1的,但是为了更快出图像,此处可调整一下数量级
      counter<=0;
    else
      counter<=counter+1'd1;

其中,一定是<=,如果直接用=,则波形图会出现错误,从00000010到00000100的时间会非常短,导致整个图像看起来就是每次左移两位。

③LED灯循环闪烁

    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
      Led<=0000_0001;
 /*    else  if(counter==25000-1)begin
             if(Led==8'b1000_0000)
                Led<=8'b0000_0001;
              else
                 Led <= Led << 1;//Led左移一位
                 end
*/
        else  if(counter==25000-1)
            Led<={Led[6:0],Led[7]};//向左循环移动一位
           else
                Led<=Led;

两个/之间的内容为注释掉的内容。要实现8个LED循环闪烁,可用<=进行左移,但这样LED不会循环,如果不加限制条件,会一直出现0000——0000的情况;而直接使用位拼接 Led<={Led[6:0],Led[7]},即循环左移一位。最后加一个endmodule即可。

④代码整合

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==25000-1)
      counter<=0;
    else
      counter<=counter+1'd1;//一定是<=,如果直接用=,则波形图会出现错误,从00000010到00000100的时间会非常短,导致整个图像看起来就是每次左移两位
      
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
      Led<=0000_0001;
 /*    else  if(counter==25000-1)begin
             if(Led==8'b1000_0000)
                Led<=8'b0000_0001;
              else
                 Led <= Led << 1;//Led左移一位
                 end
*/
        else  if(counter==25000-1)
            Led<={Led[6:0],Led[7]};//向左循环移动一位
           else
                Led<=Led;
endmodule

2.激励文件

①编写端口代码与例化

module Led_run_tb();
      reg Clk;
      reg Reset_n;
      wire [7:0]Led;
    Led_run Led_run(   
   .Clk(Clk),
   .Reset_n(Reset_n),
   .Led(Led)
);

②编写时钟信号与复位信号

    initial Clk=1;
    always #10 Clk = !Clk;//10ns翻转一次
    initial begin
        Reset_n=0;
        #201;//错开时钟上升沿
        Reset_n=1;
        #400000000;//4s之后灯全部跑完
        $stop;
    end
        

③代码整合

`timescale 1ns/1ns;

module Led_run_tb();
      reg Clk;
      reg Reset_n;
      wire [7:0]Led;
     Led_run Led_run(   
    //Led_run Led_run_38decoder(        //调用3-8译码器的方法
   .Clk(Clk),
   .Reset_n(Reset_n),
   .Led(Led)
);

    initial Clk=1;
    always #10 Clk = !Clk;
    initial begin
        Reset_n=0;
        #201;
        Reset_n=1;
        #4000000000;//4s之后灯全部跑完
        $stop;
    end
        
endmodule

④仿真结果
走马灯vivado,学习,fpga开发,生活
波形变化没问题,但是波形变化的周期出了大问题,LED灯循环居然只花了160ns,这与设计的差太多,无论我计数器那里改成25000000-1还是25000-1,图像居然都一样,与视频不符合,这点很奇怪,难道是我开局没选和他一样的板子吗?这个问题后续再解决。

3.调用3-8译码器实现走马灯

①copy文件到指定目录
走马灯vivado,学习,fpga开发,生活
走马灯vivado,学习,fpga开发,生活

先将3-8译码器的工程文件copy到走马灯的sources文件里面,然后会在Design Sources里面发现他

②例化

    reg [2:0]counter2;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
      counter2<=0;  
/*    else if (counter2==7)
         counter2<=0;   */   //这两行也可以不写,因为counter2位宽为3,最大值为7,当达到7时会自动变为0然后继续计数
     else    
       counter2<=counter2+1;
 //调用3-8译码器的模块
     decoder3_8 decoder3_8(
        .a( counter2[2]),
        .b( counter2[1]),
        .c( counter2[0]),
        .out(Led)
);

由于例化了3-8译码器,所以此时Led只作为接口,out已经在3-8译码器中定义了reg类型,Led就不用定义了
走马灯vivado,学习,fpga开发,生活
③代码整合
3-8译码器代码

module decoder3_8(
    a,b,c,out
);
    input a;
    input b;
    input c;
    output reg [7:0]out;//位宽是8位,类型为reg类型,与always相配
    //以always块描述的信号赋值,被赋值对象必须定义为reg类型
    //b代表二进制;3'b101    8'b0000_1010
    //d代表十进制;3'd5      8'd10  
    //h代表十六进制;         8'ha
   always@(*)//*代表a b c
        case({a,b,c})//{a,b,c}变成了一个三位的信号,这种操作叫做位拼接
            3'b000:out=8'b0000_0001;
            3'b001:out=8'b0000_0010;
            3'b010:out=8'b0000_0100;
            3'b011:out=8'b0000_1000;
            3'b100:out=8'b0001_0000;
            3'b101:out=8'b0010_0000;
            3'b110:out=8'b0100_0000;
            3'b111:out=8'b1000_0000;   
       endcase
endmodule

设计代码

`timescale 1ns/1ns;

module Led_run_tb();
      reg Clk;
      reg Reset_n;
      wire [7:0]Led;
  //Led_run Led_run(   
    Led_run Led_run_38decoder(        //调用3-8译码器的方法
   .Clk(Clk),
   .Reset_n(Reset_n),
   .Led(Led)
);

    initial Clk=1;
    always #10 Clk = !Clk;
    initial begin
        Reset_n=0;
        #201;
        Reset_n=1;
        #4000000000;//4s之后灯全部跑完
        $stop;
    end
        
endmodule

激励文件代码

module Led_run(
   Clk,
   Reset_n,
   Led
);
    input Clk;
    input Reset_n;
    output [7:0]Led;//因为例化了3-8译码器,所以此时Led只作为接口,out已经在3-8译码器中定义了reg类型,Led就不用定义了
    reg [25:0]counter;
    reg [2:0]counter2;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
      counter<=0;
    else  if(counter==25000000-1)
      counter<=0;
    else
      counter<=counter+1;//一定是<=,如果直接用=,则波形图会出现错误,从00000010到00000100的时间会非常短,导致整个图像看起来就是每次左移两位
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
      counter2<=0;  
/*    else if (counter2==7)
         counter2<=0;   */   //这两行也可以不写,因为counter2位宽为3,最大值为7,当达到7时会自动变为0然后继续计数
     else    
       counter2<=counter2+1;
 //调用3-8译码器的模块
     decoder3_8 decoder3_8(
        .a( counter2[2]),
        .b( counter2[1]),
        .c( counter2[0]),
        .out(Led)
);

endmodule

④仿真结果
走马灯vivado,学习,fpga开发,生活
结果与前面一直, 依旧存在周期不对的问题。


总结

今天学习了跑马灯的设计,结合了前面计数器和3-8译码器的知识。
新学的语法有:
①Led <= Led << 1意思为Led左移一位,<<为左移符号;
② Led<={Led[6:0],Led[7]},意思为向左循环移动一位。Led位宽为8,意思就是把第八位移到最后面,其他的依次前推一位,达到左循环移动一位的目的;
③工程文件的例化,需要先将要用的工程文件复制到现有工程的sources文件里面,然后会在Design Sources里面发现他,之后就直接在激励文件里面使用例化就可以。需要注意的是,如果有变量在被例化的文件里面已经定义类型了(如reg或wire),那在激励文件里面就不用再定义。
④在always块里面最好使用<=,不要直接使用=,防止图像发生错误文章来源地址https://www.toymoban.com/news/detail-785349.html

到了这里,关于从零开始学习vivado——day4 跑马灯(让8个LED灯以每个0.5s的速率循环闪烁)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Android --- 跑马灯效果

    跑马灯效果主要使用的控件为TextView,其中涉及的几个标签如下所示: android:ellipsize If set, causes words that are longer than the view is wide to be ellipsized instead of broken in the middle. You will often also want to set scrollHorizontally or singleLine as well so that the text as a whole is also constrained to a single line in

    2023年04月08日
    浏览(67)
  • 跑马灯实验(stm32)

    说明:以下内容参考正点原子的相关资料 这里使用的是位带操作来实现操作某个 IO 口的 1 个位 相应的库函数操作代码。 BSRR:端口位设置/清除寄存器 BRR:端口位清除寄存器 可以看到红绿灯交错闪烁

    2024年02月13日
    浏览(30)
  • Android 实现跑马灯效果

    Android中实现跑马灯效果有多种方式,本篇简单介绍下: 1: TextView属性实现 这里需要注意下: 需要限制textview的宽度,不能设置为wrap_content 启动跑马灯效果需要获取焦点requestFocus(). 2: 代码实现 3: 自定义 view实现 这里可以使用动画的效果实现. 4: 实现竖直效果的跑马灯

    2024年01月18日
    浏览(45)
  • CSS 之 跑马灯边框

    一、简介 ​ 之前有做过渐变色边框的样式,然后某天刷抖🎵,看到某个老师在讲跑马灯的样式效果,于是就自己尝试实现一下跑马灯样式的边框,虽然这种样式并不常见(基本没卵用),其使用场景我至今没想到,但是它足够花里胡哨,玩的就是花活。CSS才是前端最难精通

    2024年01月17日
    浏览(31)
  • CSS按钮-跑马灯边框

    思路很简单,实现方法有很多很多。但是大体思路与实现方法都类似:渐变色 + 动画,主要区别在动画的具体实现

    2024年02月11日
    浏览(38)
  • uni小程序 跑马灯效果

    写在前面 前几天帮一个朋友咋小程序上加一个类似于跑马灯的效果,本自己手写了一个。(代码和截图都在下方) 效果展示 等我截图~~~ 代码展示(布局代码) 主要就是图片css哪里加了一个“ flex-shrink: 0; ”,因为只是本地的一个功能,所以我就图片数据就写死了,需要的自

    2024年02月12日
    浏览(29)
  • 基于Verilog的跑马灯设计

    设计一个能够有多种工作模式控制的8个灯亮灭的电路。 工作模式1:按照从左到右的方向,依次点亮每一盏灯,然后依次熄灭每一盏灯; 工作模式2:分成两组灯,前四个灯为1组,后四个为2组,1组灯按从左到右依次点亮,同时2组灯按从右到左依次点亮,然后两组灯按各自点

    2024年02月08日
    浏览(34)
  • Vue跑马灯简单案列

    套在自己的vue模板里面即可 content是显示的内容,shouldMove是否滚动(如果大于了文本框才滚动,否则禁止不懂),showResult是否显示滚动条 效果

    2024年02月22日
    浏览(31)
  • 应广单片机实现跑马灯

            应广单片机处处体现其mini的特性,非常适合做各种方案开发,特别是点灯,什么跑马灯,氛围灯,遥控灯,感应灯,拍拍灯等,用应广都OK。        跑马灯是基础中的基础,我搭了一个框架,要进行扩展或是修改也很容易。不多说,上代码。 #include    \\\"extern.h\\\"

    2024年02月09日
    浏览(28)
  • JavaFx 实现水平滚动文本(跑马灯效果)

    原文地址: JavaFx 实现水平滚动文本(跑马灯效果) - Stars-One的杂货小窝 本文是以TornadoFx框架进行编写,各位使用JavaFx可以参考 代码已经封装在common-controls库中 实现原理就是利用了JavaFx里的动画效果去修改scrollpane的translateX属性,原本想在text上改造的,发现文字过多就不行了,最终还

    2023年04月27日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包