跟着教程写了几种方法,才发现自己写的虽然能实现,但比较繁琐。教程有三种方法:

1.移位法,每次左移一位,相比我自己写的,优点是不用把每一种情况都写出来。但是需要考虑左移到最后一位时需要自己再写个赋值语句重新回到第一位。

2.位拼接法,循环左移,每一次都把最后一位放到第一位,其他六位左移一位,克服了移位法的问题,简化了代码。

3.调用已有模块法,调用4-16译码器刚好可以实现流水灯,需要额外的counter作为译码器的输入。

  • 移位法
module led_run1(    //移位法
clk,
reset,
led
);
input clk;
input reset;
output reg [7:0]led; reg [5:0]counter1;
always@( posedge clk or negedge reset )begin
if( reset == 1'd0)
counter1 <= 1'd0;
else if(counter1 == 4 )    这两个虽然赋值语句一样,但是不能把判断语句合并。
counter1 <=1'd0;
else
counter1 <= counter1 + 1'd1;
end always@(posedge clk or negedge reset) begin
if( reset == 1'd0)
led <= 8'b0000_0001;
else if(counter1 == 4 )begin
if(led == 8'b1000_0000)
led <= 8'b0000_0001;      //最后一位的处理
else
led <= led << 1'd1 ;     //注意左移几位的语法,应该怎么写
end
end
endmodule
  • 位拼接法
module led_run2(    //位拼接法
clk,
reset,
led
);
input clk;
input reset;
output reg [7:0]led; reg [5:0]counter1;
always@( posedge clk or negedge reset )begin
if( reset == 1'd0)
counter1 <= 1'd0;
else if(counter1 == 4 )
counter1 <=1'd0;
else
counter1 <= counter1 + 1'd1;
end always@(posedge clk or negedge reset) begin
if( reset == 1'd0)
led <= 8'b0000_0001;
else if(counter1 == 4 )begin
led <= {led[6:0],led[7]};    //位拼接的语法,十分注意
end
end
endmodule
  • 调用模块法
module led_run4(    //调用模块4-16译码器法
clk,
reset,
led
);
input clk;
input reset;
output wire [15:0]led; reg [2:0]counter1;
reg [3:0]counter4;    一个用来计数,一个用来译码
always@( posedge clk or negedge reset )begin
if( reset == 1'd0)
counter1 <= 1'd0;
else if(counter1 == 4 )
counter1 <=1'd0;
else
counter1 <= counter1 + 1'd1;
end always@(posedge clk or negedge reset) begin
if( reset == 1'd0)
counter4 <= 8'd1;
else if(counter1 == 4 )begin
counter4 <= counter4 + 1'b1;
end
end decoder_4_16 decoder_4_16_run(        //调用的方法类似于仿真时的例化,存储电路与组合逻辑电路相结合。
.a(counter4[3]),
.b(counter4[2]),
.c(counter4[1]),
.d(counter4[0]),
.out(led)
); endmodule

注意:

1.左移/右移的语法:led=led << n   /   led=led >> n

2.位拼接的语法:led={led[6:0],led[7]} 注意花括号,中括号,数组表达方式。定义时中括号放名字前,引用时放名字后。逗号隔开位。

3.一个testbench可以用来测试验证多个模块,需要修改的是tb里面例化的模块名,激励如果一样可以不修改。(testbench差不多就是个激励产生器用来验证性能)

4.在工程中创建的design sources的源文件的路径为:.srcs->sources->new->xx.v

5.时序电路自少需要一个计数器来控制开发板时钟信号和我们实际需要的周期信号的关系。但是不是说只能有一个,可以根据需求增加。

6.报错:ordered port connections cannot be mixed with named port connections  目标端口连接不能与命名端口连接混合

  

  原因:最后一个变量后面加了逗号,删掉即可。

7.调用子模块的方式:

  7.1把子模块的文件复制到当前工程的design源文件目录下,路径上面有写。

  7.2在vivado中添加该文件进design sources,作为子模块。

  7.3在顶层文件(即要调用该子文件的文件)调用子模块,方式是类似于testbench的例化。注意,在子模块(底层)中定义了输出为reg型,在顶层应该定义输出为wire型。

    效果

   

led跑马灯多种方法(移位法,位拼接法,调用模块法,位移及位拼接语法,testbench的理解,源文件的存储路径,计数器的个数,调用模块的方式)的更多相关文章

  1. 【雕爷学编程】Arduino动手做(56)---8路LED跑马灯模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  2. ARM开发(1) 基于STM32的LED跑马灯

    一 跑马灯原理:  1.1 本实验实现2个led的跑马灯效果,即2个led交替闪烁.  1.2 实验思路:根据电路图原理,给led相关引脚赋予高低电平,实现电路的导通,使led灯发光.  1.3 开发 ...

  3. led跑马灯(模糊时钟ambiguous color,非法字符 non printable character,寄存器初值,计数器计数注意事项)

    1.设计定义 让8个led以100ns的速度循环闪烁. 2.设计输入 循环闪烁,还是周期问题,用时钟驱动,所以需要一个时钟信号clk.再给一个复位输入reset,八个输出led信号. 每100ns只有 ...

  4. 基于am3358的led跑马灯測试

    #include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...

  5. 安卓LED跑马灯 超炫酷的表白神器破解版

    链接:https://pan.baidu.com/s/11Wxll4iLdcEPq0wUBK6Ong 提取码:all4

  6. C# 模拟跑马灯效果(2种)

    #region 跑马灯效果方法 /// <summary> /// 文字进入左侧后从右侧出来 /// </summary> private void LabelRun() { ...

  7. html跑马灯效果

    实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...

  8. html跑马灯/走马灯效果

    实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...

  9. Android 文字自动滚动(跑马灯)效果的两种实现方法[特别好使]

    有时候在xml中写的跑马灯效果不滚动:原因有以下 Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize=”marquee” 2.TextV ...

随机推荐

  1. 1.4 类UNIX系统是什么鬼?

    上节<UNIX和Linux的区别>中讲到了 UNIX 系统的历史,UNIX 是操作系统的开山鼻祖,是操作系统的发源地,后来的 Windows 和 Linux 都参考了 UNIX. 有人说, ...

  2. 关于IPC和PTH用户权限问题,psexec拒绝访问(Access Denied)的原因

    前瞻 关于net use和psexec无法使用本地管理员组用户建立连接的问题 测试环境: win7系统,存在域环境 域名:de1ay 普通域用户: de1ay\de1ay 域管理员用户:de1ay\A ...

  3. QT快速入门

    QT快速入门 本文档将介绍QT工程的创建.UI界面布局,并以计数器为例了解QT中多线程的用法,最终完成一个基础的QT项目. 1 创建QT工程文件 在安装好QT之后,能够在其安装组件中找到Qt Crea ...

  4. 在SpringBoot中使用logback优化异常堆栈的输出

    一.背景 在我们在编写程序的过程中,无法保证自己的代码不抛出异常.当我们抛出异常的时候,通常会将整个异常堆栈的信息使用日志记录下来.通常一整个异常堆栈的信息是比较多的,而且存在一些没用的信息.那么我们 ...

  5. Mqtt入门:在线调试连接阿里云

    近期课设需要做个东西,我想要做个上位机更好的显示. 但是一开始学习一样东西,听没头绪的,不知道从哪里入手,尝试过去B站找视频看,但是感觉视频讲的都是基础的东西,不是说人家up主讲的不好,只是对于入门, ...

  6. MPLS基础与工作原理

    MPLS Fundamental History of WAN Protocol 1970年代之前 第一个 WAN 用于将办公室与终端连接到大型机和小型计算机系统. 它是从办公室到数据中心的点对点连接 ...

  7. linux篇--mysql数据库备份并删除前一分钟的数据

    linux 中mysql数据库定时备份并删除前一分钟的所有数据 #!/bin/bash #mysqldump -uroot -ppassword01! imaginebase > /home/b ...

  8. [C++STL] 队列 queue 的入门

    队列结构 概念: 队列(queue):和栈相似,也是一种特殊的线性表.和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作.一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称 ...

  9. 行列式&矩阵树定理

    行列式: 参考 oi-wiki 定义 对于一个\(n*n\)的矩阵A行列式取值(标量) \(det(A)=|A|=\sum\limits_p(-1)^{\tau(p)}\prod\limits_{i= ...

  10. Docker的网络

    概述 docker使用Linux桥接网卡,在宿主机虚拟一个docker容器网桥(docker0),docker启动一个容器时会根 据docker网桥的网段分配给容器一个IP地址,称为Container ...