led跑马灯多种方法(移位法,位拼接法,调用模块法,位移及位拼接语法,testbench的理解,源文件的存储路径,计数器的个数,调用模块的方式)
跟着教程写了几种方法,才发现自己写的虽然能实现,但比较繁琐。教程有三种方法:
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的理解,源文件的存储路径,计数器的个数,调用模块的方式)的更多相关文章
- 【雕爷学编程】Arduino动手做(56)---8路LED跑马灯模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- ARM开发(1) 基于STM32的LED跑马灯
一 跑马灯原理: 1.1 本实验实现2个led的跑马灯效果,即2个led交替闪烁. 1.2 实验思路:根据电路图原理,给led相关引脚赋予高低电平,实现电路的导通,使led灯发光. 1.3 开发 ...
- led跑马灯(模糊时钟ambiguous color,非法字符 non printable character,寄存器初值,计数器计数注意事项)
1.设计定义 让8个led以100ns的速度循环闪烁. 2.设计输入 循环闪烁,还是周期问题,用时钟驱动,所以需要一个时钟信号clk.再给一个复位输入reset,八个输出led信号. 每100ns只有 ...
- 基于am3358的led跑马灯測试
#include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...
- 安卓LED跑马灯 超炫酷的表白神器破解版
链接:https://pan.baidu.com/s/11Wxll4iLdcEPq0wUBK6Ong 提取码:all4
- C# 模拟跑马灯效果(2种)
#region 跑马灯效果方法 /// <summary> /// 文字进入左侧后从右侧出来 /// </summary> private void LabelRun() { ...
- html跑马灯效果
实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...
- html跑马灯/走马灯效果
实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...
- Android 文字自动滚动(跑马灯)效果的两种实现方法[特别好使]
有时候在xml中写的跑马灯效果不滚动:原因有以下 Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize=”marquee” 2.TextV ...
随机推荐
- 蓝桥杯Web练习题:多个斜线开始的路径重定向问题
多个斜线开始的路径重定向问题 需求说明 在 vue-router v3.5.2 版本代码中存在一个 Bug,一个以多个斜线(///)开始的路径实际上可能会重定向到另一个域.这是因为 cleanPath ...
- Nginx代理websocket为什么要这样做?
Nginx反向代理websocket 示例: http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } s ...
- 强制20天加班开发app后被集体解雇,象寻技术负责人公众号发文怒斥前领导
5月16日下午三点,象寻官方公众号发了一篇<祝象寻早日倒闭的文章>文章,文章配一个竖中指的手势.如此劲爆的文章瞬间引爆了微信朋友圈,大家纷纷分享给好友和微信群,阅读量也达到了十万+. 当时 ...
- [C++STL] set 容器的入门
set 容器的入门 unordered_set:另外头文件,乱序排放,使用哈希表(便于查找) multiset:可以重复存在的集合.用count()读取个数 创建set的几种方式 常规 set< ...
- MySQL中读页缓冲区buffer pool
Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理.我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其缓存起来,所以MyS ...
- Netty是什么,Netty为什么速度这么快,线程模型分析
哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,现在下着大雨看来是去 ...
- 面试突击54:MySQL 常用引擎有哪些?
MySQL 有很多存储引擎(也叫数据引擎),所谓的存储引擎是指用于存储.处理和保护数据的核心服务.也就是存储引擎是数据库的底层软件组织.在 MySQL 中可以使用"show engines& ...
- 使用kubeseal加密和管理k8s集群的secret
使用kubeseal加密和管理k8s集群的secret 在k8s的管理过程中,像secret这种资源并不好维护,kubeseal提供了一种相对简单的方式来对原始secret资源进行加密,并通过控制器进 ...
- VMware Workstation 虚拟机安装教程
一.介绍篇 VMware Workstation 16 Pro是VMware(威睿公司)于2021年最新发布的一代虚拟机软件,软件的中文名是"VMware 工作站 16 专业版". ...
- grafana整合zabbix
1. 安装grafana wget https://dl.grafana.com/oss/release/grafana-7.5.7-1.x86_64.rpm rpm -i --nodeps graf ...