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,寄存器初值,计数器计数注意事项)的更多相关文章

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

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

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

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

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

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

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

    跟着教程写了几种方法,才发现自己写的虽然能实现,但比较繁琐.教程有三种方法: 1.移位法,每次左移一位,相比我自己写的,优点是不用把每一种情况都写出来.但是需要考虑左移到最后一位时需要自己再写个赋值语 ...

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

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

  6. STM32F407 跑马灯 寄存器版 个人笔记

    更多原理请参考跑马灯 库函数版 个人笔记 步骤 使能IO口时钟.配置相关寄存器寄存器RCC->AHB1ENR 初始化IO口模式.配置四个配置寄存器 GPIOx_MODER/ GPIOx_OTYP ...

  7. 【STM32H7教程】第18章 STM32H7的GPIO应用之跑马灯

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第18章       STM32H7的GPIO应用之跑马灯 本 ...

  8. 嵌入式02 STM32 实验04跑马灯

    开学STM32 跑马灯的实验主要就是了解GPIO口的配置及使用,我这里是使用库函数进行编程,主要需要设置以下两方面: 1.使能需要使用的IO口的时钟,一共有A.B.C.D.E.F.G七组IO口 2.初 ...

  9. GPIO原理与配置(跑马灯,蜂鸣器,按键)

    一.STM32 GPIO固件库函数配置方法 1. 根据需要在项目中删掉一些不用的固件库文件,保留有用的固件库文件 2. 在stm32f10x_conf.h中注释掉这些不用的头文件 3. STM32的I ...

随机推荐

  1. 红旗 Linux 桌面操作系统11来了:支持国产自主CPU,全新UI风格设计,兼容面广...

    链接:https://reurl.cc/g8ke9X 红旗Linux桌面操作系统11将于1月10日开放预览版的下载,新版本具有良好的硬件兼容,支持多款国产自主CPU品牌,同时还具有丰富的外设支持及海量 ...

  2. 原创工具14Finger-全能web指纹识别与分享平台

    14Finger 功能齐全的Web指纹扫描和分享平台,基于vue3+django前后端分离的web架构,并集成了长亭出品的rad爬虫的功能,内置了一万多条互联网开源的指纹信息. Github:http ...

  3. windows 存储和切换 ip 配置

    我的虚拟机用的是桥接模式,在公司使用时设置的是静态 ip,但网段和家里面的不一样,就导致在公司和家里,我需要频繁修改 ipv4 的配置以适应不同的网络环境 Simple-IP-Config 工具解决了 ...

  4. MQ 简介

    每日一句 You must try things that may not work. And you must not let anyone define your limits because o ...

  5. C# 蓄水池抽样

    蓄水池采样算法解决的是在给定但长度未知的大数据集中,随机等概率抽取一个数据.如果知道数据的长度,可以用随机数rand()%n得到一个确切的随机位置,或者分块取值来构造随机,那么该位置的对象就是所求的对 ...

  6. elemetnUI表格分别给列表每一个按钮加loading

    // 获取列表数据的时候--添加按钮loading this.list = this.list.map((item) => { this.$set(item, "dataLoading ...

  7. 意味着JNPF迈入新时代的3.4版本,与3.3.3版本有着哪些功能区别呢?

    在线开发‍ 3.3.3版本 同一个功能分功能设计和移动设计 功能设计没有更换模式 功能设计没有同步菜单 功能设计和移动设计无表模式 3.4.1版本 同一个功能可以在功能设计里面设计,根据客户需求自己选 ...

  8. MySql实例关于ifnull,count,case when,group by(转力扣简单)

    给定表 customer ,里面保存了所有客户信息和他们的推荐人. id   | name | referee_id|+------+------+-----------+|    1 | Will ...

  9. Docker容器配置远程登录

    Docker容器配置远程登录 前言 docker 的网络模式主要有三种,bridge.host.none: pridge是docker安装后自动创建的虚拟网卡,创建容器时默认使用此模式. host是指 ...

  10. [自制操作系统] 第05回 CPU的三种模式

    目录 一.前景回顾 二.实模式和保护模式 一.前景回顾 在之前我们说到,loader的作用才是读取加载操作系统内核,那么我们的重心就应该是loader.S文件,其实我们接下来也的确是会往loader. ...