led跑马灯(模糊时钟ambiguous color,非法字符 non printable character,寄存器初值,计数器计数注意事项)
1.设计定义
让8个led以100ns的速度循环闪烁。
2.设计输入
循环闪烁,还是周期问题,用时钟驱动,所以需要一个时钟信号clk。再给一个复位输入reset,八个输出led信号。
每100ns只有一个led亮,其它灭,顺序循环,所以一个周期有800ns。用条件语句来判断可以实现每次只亮一个且循环。
开发板的时钟脉冲信号周期为20ns,故引入计数变量counter,每计数满5则换状态。根据5的倍数来确定哪个灯亮。
需要注意的是,每一次时钟沿上升沿到来都要保证计数器+1才能正常运行,如果得不到保证,就会困在某个状态里面出不来,如果是复位信号时钟沿到来则无需保证,因为是异步的,异步要第一个执行。
module led_run(
clk,
reset,
led
); input clk;
input reset;
output reg[7:0]led;//8个灯 reg [5:0]counter;//程序员计数器确定宽度 always@(posedge clk or negedge reset)begin
if ( reset == 1'b0 ) begin //复位信号
counter <= 6'd0;
end
else if ( counter == 6'b0 )begin
led <= 8'b0000_0001;
counter <= counter + 1'b1; end
else if ( counter == 6'b00_0101 ) begin
led <= 8'b0000_0010;
counter <= counter + 1'b1; end
else if ( counter == 6'b00_1010 )begin
led <= 8'b0000_0100;
counter <= counter + 1'b1; end
else if ( counter == 6'b00_1111 )begin
led <= 8'b0000_1000;
counter <= counter + 1'b1; end
else if ( counter == 6'b01_0100 )begin
led <= 8'b0001_0000;
counter <= counter + 1'b1; end
else if ( counter == 6'b01_1001 )begin
led <= 8'b0010_0000;
counter <= counter + 1'b1; end
else if ( counter == 6'b01_1110 )begin
led <= 8'b0100_0000;
counter <= counter + 1'b1; end
else if ( counter == 6'b10_0011 )begin
led <= 8'b1000_0000;
counter <= counter + 1'b1; end
else if ( counter == 6'b10_1000 )begin
led <= 8'b0000_0001;
counter <= 6'd1 ; //这里要加1,不然第一个灯就不再是周期100ns,而是120ns end
else
counter <= counter + 1'b1;
end endmodule
下面是分开写的,要十分注意的是,两者的always触发条件最好相同,第一个语句也要是复位信号条件语句。在这如果第二个always删了negedge 和 led=00000000的话,那么上一个always执行复位,下一个always并行执行counter==0,会使灯亮着,不符合要求。应该在复位时让灯全熄灭。如果是上面的合并写法,就不需要额外加led=00000000,因为只进入一个always,只判断一次,下面写法并行进入了两个always,判断两次。
module led_run(
clk,
reset,
led
); input clk;
input reset;
output reg[7:0]led; reg [5:0]counter; always@(posedge clk or negedge reset)begin
if ( reset == 1'b0 ) begin
counter <= 6'd0;
counter <= counter + 1'b1; end
else if ( counter == 6'b0 )begin
counter <= counter + 1'b1; end
else if ( counter == 6'b00_0101 ) begin
counter <= counter + 1'b1; end
else if ( counter == 6'b00_1010 )begin
counter <= counter + 1'b1; end
else if ( counter == 6'b00_1111 )begin
counter <= counter + 1'b1; end
else if ( counter == 6'b01_0100 )begin
counter <= counter + 1'b1; end
else if ( counter == 6'b01_1001 )begin
counter <= counter + 1'b1; end
else if ( counter == 6'b01_1110 )begin
counter <= counter + 1'b1; end
else if ( counter == 6'b10_0011 )begin
counter <= counter + 1'b1; end
else if ( counter == 6'b10_1000 )begin
counter <= 6'd1 ;
end
else
counter <= counter + 1'b1;
end always@(posedge clk or negedge reset )begin
if ( reset == 1'b0 ) begin
led <= 8'b0000_0000; end
else if ( counter == 6'b0 )begin
led <= 8'b0000_0001; end
else if ( counter == 6'b00_0101 ) begin
led <= 8'b0000_0010; end
else if ( counter == 6'b00_1010 )begin
led <= 8'b0000_0100; end
else if ( counter == 6'b00_1111 )begin
led <= 8'b0000_1000; end
else if ( counter == 6'b01_0100 )begin
led <= 8'b0001_0000; end
else if ( counter == 6'b01_1001 )begin
led <= 8'b0010_0000; end
else if ( counter == 6'b01_1110 )begin
led <= 8'b0100_0000; end
else if ( counter == 6'b10_0011 )begin
led <= 8'b1000_0000; end
else if ( counter == 6'b10_1000 )begin
led <= 8'b0000_0001;
end end endmodule
- 遇到的错误
自己不看视频写就容易遇到许多错误。
1.syntax error near non-printable character with the hex value“0xa3“ 出现非法字符
说明符号半角全角,中英文出错了。这种情况可能出现在1.写错。2.从别的网站复制代码过来出错。
这次我把代码从vivoda复制到博客园,再复制回去就出错了,说明不同的地方可能编码不同,容易出错,最好是出错的地方自己先打一遍,看看错误会不会消失,再看其它情况。
2.ambiguous clock in event control 事件控制中的模糊时钟
2.1always中的时钟信号变量没有初始化,没有用上。
在这里不会在编辑器中出现语法报错,但综合时会出错。如图,因为我触发条件写了reset下降沿,但是下文都没提及reset。只要把 negedge reset删了或者把//删了就可以解决。
2.2赋值冲突。多个if满足条件,且他们都对同个变量处理。由于fpga硬件的处理是并行的,电路会不知道应该进行哪个处理,就出现了错误。
3.寄存器初始值问题
寄存器的初始值有多种情况。
3.1不赋初值不复位:初始值为0
3.2不赋初值复位:初始值为复位语句值
3.3赋初值不复位:初始值为初值
3.4赋初值复位:初始值为初值。
总结:有赋初值则为初值,没赋则为复位值,都没有则为0。
注:初始值查看方法:
4.计数器计数注意事项
每一次时钟沿上升沿到来都要保证计数器+1才能正常运行,如果得不到保证,就会困在某个状态里面出不来,如果是复位信号时钟沿到来则无需保证,因为是异步的,异步要第一个执行。
led跑马灯(模糊时钟ambiguous color,非法字符 non printable character,寄存器初值,计数器计数注意事项)的更多相关文章
- ARM开发(1) 基于STM32的LED跑马灯
一 跑马灯原理: 1.1 本实验实现2个led的跑马灯效果,即2个led交替闪烁. 1.2 实验思路:根据电路图原理,给led相关引脚赋予高低电平,实现电路的导通,使led灯发光. 1.3 开发 ...
- 【雕爷学编程】Arduino动手做(56)---8路LED跑马灯模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- 基于am3358的led跑马灯測试
#include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...
- led跑马灯多种方法(移位法,位拼接法,调用模块法,位移及位拼接语法,testbench的理解,源文件的存储路径,计数器的个数,调用模块的方式)
跟着教程写了几种方法,才发现自己写的虽然能实现,但比较繁琐.教程有三种方法: 1.移位法,每次左移一位,相比我自己写的,优点是不用把每一种情况都写出来.但是需要考虑左移到最后一位时需要自己再写个赋值语 ...
- 安卓LED跑马灯 超炫酷的表白神器破解版
链接:https://pan.baidu.com/s/11Wxll4iLdcEPq0wUBK6Ong 提取码:all4
- STM32F407 跑马灯 寄存器版 个人笔记
更多原理请参考跑马灯 库函数版 个人笔记 步骤 使能IO口时钟.配置相关寄存器寄存器RCC->AHB1ENR 初始化IO口模式.配置四个配置寄存器 GPIOx_MODER/ GPIOx_OTYP ...
- 【STM32H7教程】第18章 STM32H7的GPIO应用之跑马灯
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第18章 STM32H7的GPIO应用之跑马灯 本 ...
- 嵌入式02 STM32 实验04跑马灯
开学STM32 跑马灯的实验主要就是了解GPIO口的配置及使用,我这里是使用库函数进行编程,主要需要设置以下两方面: 1.使能需要使用的IO口的时钟,一共有A.B.C.D.E.F.G七组IO口 2.初 ...
- GPIO原理与配置(跑马灯,蜂鸣器,按键)
一.STM32 GPIO固件库函数配置方法 1. 根据需要在项目中删掉一些不用的固件库文件,保留有用的固件库文件 2. 在stm32f10x_conf.h中注释掉这些不用的头文件 3. STM32的I ...
随机推荐
- 红旗 Linux 桌面操作系统11来了:支持国产自主CPU,全新UI风格设计,兼容面广...
链接:https://reurl.cc/g8ke9X 红旗Linux桌面操作系统11将于1月10日开放预览版的下载,新版本具有良好的硬件兼容,支持多款国产自主CPU品牌,同时还具有丰富的外设支持及海量 ...
- 原创工具14Finger-全能web指纹识别与分享平台
14Finger 功能齐全的Web指纹扫描和分享平台,基于vue3+django前后端分离的web架构,并集成了长亭出品的rad爬虫的功能,内置了一万多条互联网开源的指纹信息. Github:http ...
- windows 存储和切换 ip 配置
我的虚拟机用的是桥接模式,在公司使用时设置的是静态 ip,但网段和家里面的不一样,就导致在公司和家里,我需要频繁修改 ipv4 的配置以适应不同的网络环境 Simple-IP-Config 工具解决了 ...
- MQ 简介
每日一句 You must try things that may not work. And you must not let anyone define your limits because o ...
- C# 蓄水池抽样
蓄水池采样算法解决的是在给定但长度未知的大数据集中,随机等概率抽取一个数据.如果知道数据的长度,可以用随机数rand()%n得到一个确切的随机位置,或者分块取值来构造随机,那么该位置的对象就是所求的对 ...
- elemetnUI表格分别给列表每一个按钮加loading
// 获取列表数据的时候--添加按钮loading this.list = this.list.map((item) => { this.$set(item, "dataLoading ...
- 意味着JNPF迈入新时代的3.4版本,与3.3.3版本有着哪些功能区别呢?
在线开发 3.3.3版本 同一个功能分功能设计和移动设计 功能设计没有更换模式 功能设计没有同步菜单 功能设计和移动设计无表模式 3.4.1版本 同一个功能可以在功能设计里面设计,根据客户需求自己选 ...
- MySql实例关于ifnull,count,case when,group by(转力扣简单)
给定表 customer ,里面保存了所有客户信息和他们的推荐人. id | name | referee_id|+------+------+-----------+| 1 | Will ...
- Docker容器配置远程登录
Docker容器配置远程登录 前言 docker 的网络模式主要有三种,bridge.host.none: pridge是docker安装后自动创建的虚拟网卡,创建容器时默认使用此模式. host是指 ...
- [自制操作系统] 第05回 CPU的三种模式
目录 一.前景回顾 二.实模式和保护模式 一.前景回顾 在之前我们说到,loader的作用才是读取加载操作系统内核,那么我们的重心就应该是loader.S文件,其实我们接下来也的确是会往loader. ...