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. 【HashMap】浅析HashMap的构造方法及put方法(JDK1.7)

    目录 引言 代码讲解 属性 HashMap的空参构造方法 HashMap的put方法 put inflateTable initHashSeedAsNeeded putForNullKey hash ...

  2. 【DIY】【CSAPP-LAB】深入理解计算机系统--datalab笔记

    title: 前言 <深入理解计算机系统>一书是入门计算机系统的极好选择,从其第三版的豆瓣评分9.8分可见一斑.该书的起源是卡耐基梅龙大学 计算机系统入门课(Introduction to ...

  3. sqlserver limit

    select Loaction.Lat,Loaction.Long from Company order by CompanyId OFFSET 4 ROWS FETCH NEXT 2 ROWS ON ...

  4. Three.js 打造缤纷夏日3D梦中情岛 🌊

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 深居内陆的人们,大概每个人都有过大海之梦吧.夏日傍晚在沙滩漫步奔跑:或是在 ...

  5. Vmware虚拟机安装及相关配置流程

    1.Vmware虚拟软件安装 1.1下载地址 vmware 12 pro 的版本稳定性较好,所有我们最好选择该版本 下载地址:https://www.onlinedown.net/soft/10053 ...

  6. 区分 python 爬虫或者是写自动化脚本时遇到的 content与text的作用

    通常在使用过程中或许我们能够轻而易举的会使用requsts模块中的content 与 text ,从print结果来看根本看不出任何区别: 总结精髓,text 返回的是unicode 型的数据,一般是 ...

  7. Java编码安全

    目录 Java编码安全 数据校验 规则1.1:校验跨信任边界传递的不可信数据 规则1.2:禁止直接使用不可信数据来拼接SQL语句 规则1.4:禁止直接使用不可信数据来记录数据 规则1.6:验证路径前将 ...

  8. 【Golang】程序如何优雅的退出?

    1. 背景 项目开发过程中,随着需求的迭代,代码的发布会频繁进行,在发布过程中,如何让程序做到优雅的退出? 为什么需要优雅的退出? 你的 http 服务,监听端口没有关闭,客户的请求发过来了,但处理了 ...

  9. 26.MySQL数据库基础

    MySQL数据库基础 目录 MySQL数据库基础 数据库的概念 数据 表 数据库 数据库的管理系(DBMS) 数据库系统 访问数据库的流程 数据库系统发展史 当今主流数据库介绍 关系数据库 关系数据库 ...

  10. QT字符串高效拼接原理QStringBuilder

    这一篇文章讨论QT框架中QT字符串是如何实现高效拼接的. 1. QStringBuilder实例与原理 QT字符串高效拼接例子 备注: (a)上述代码仅仅在s2 = b1时一次性分配能够容纳所有字符串 ...