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. 阿里CBU技术面试小结

    一个执着于技术的公众号 前言 今天给大家分享一篇胡文兴同学阿里CBU技术面试的自我总结,希望通过本篇文章也让正在准备求职面试的你有所帮助. 本篇文章已经征得原作者同意转载至本公众号,并且征得他的同意标 ...

  2. java高级用法之:JNA中的Memory和Pointer

    目录 简介 Pointer 特殊的Pointer:Opaque Memory 总结 简介 我们知道在native的代码中有很多指针,这些指针在JNA中被映射成为Pointer.除了Pointer之外, ...

  3. Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)

    1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...

  4. .Net Core 依赖注入(IOC) 一些简单的使用技巧

    原文链接:https://www.cnblogs.com/ysmc/p/16240534.html .Net Core 在使用IOC后,我们不必再浪费精力在管理实例的生命周期上,交给IOC代替我们管理 ...

  5. AM57x 多核SoC开发板——GPMC的多通道AD采集综合案例手册(上)

    目 录 1 ----案例功能 2 ----操作说明 2.1 ----硬件连接 2.2 ----案例测试 2.3 ----使用CCS查看信号波形 2.3.1 ----加载Symbols信息表 2.3.2 ...

  6. Springmvc基础及应用

    SpringMVC简介和环境搭建 SpringMVC简介 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一.在Spring3.0 后全面超越 S ...

  7. 每天一个 HTTP 状态码 101

    101 Switching Protocols 当客户端的请求具有 Upgrade HTTP 首部,表示要求服务器切换到指定协议:此时服务器端就可以向客户端响应 101 Switching Proto ...

  8. CF1682C. LIS or Reverse LIS?

    题意:给\(n\)个数,问你能构出严格上升子序列长度和下降子序列长度最小值的最大值. 思路: 如果一个数出现至少两次,ans++. 统计出现一次的个数,因为再最长上升子序列中,只能有一个值能贡献到下降 ...

  9. 【freertos】011-信号量、互斥量及优先级继承机制源码分析

    目录 前言 11.1 任务同步 11.2 信号量概念 11.3 二值信号量 11.3.1 二值信号量概念 11.3.2 优先级翻转 11.3.3 二值信号量运作机制 11.4 计数信号量 11.4.1 ...

  10. 对TCP粘包拆包的理解

    TCP的粘包与拆包 TCP是一种字节流(byte-stream)协议,所谓流,就是没有界限的一串数据. 一个完整的包会被TCP拆为多个包进行发送,也有可能把多个小包封装成一个大的数据包发送,这就是所谓 ...