1.设计定义

  设计一个以200ms亮,200ms暗交替闪烁的led灯,并且有一个复位按钮可以停止工作。

2.设计输入

  2.1端口

    以固定周期交替闪烁说明由时钟控制,需要一个时钟控制端口clk,要求复位按钮,则需要一个复位端口reset,输出为led灯,则有一个输出端口led。

  2.2变量

    每个开发板的时钟频率是固定的,本次用的开发板时钟周期为20ns。而led闪烁的周期为400ms,我们需要每200ms让led改变一次状态,这时便需要一个计数的变量counter,当counter达到(200ms/20ns)-1时让led取反便可实现目标。注意,counter不属于端口,故不写在led模块里面。且counter是个比较大的数,应该先计算一下位宽,这里用程序员计算器输入十进制数,便可自动转换为二进制,得到位宽。

 1 module led_flash(    //2输入1输出
2 clk,
3 reset,
4 led
5 );
6 input clk;
7 input reset;
8 output reg led;
9
10 reg [23:0]counter;      //定义计数器,在module内,led外
11
12 always@( posedge clk or negedge reset ) begin //时序仿真,clk上升沿触发,reset下降沿触发。满足任一条件就进入always执行
13 if(reset == 1'd1 )begin            //复位端有效,计数置零
14 counter <= 0;
15 end
16 else if( counter == 9999999 ) begin     //计数到200ms,计数器置零
17 counter <= 0;
18 end
19 else
20 counter <= counter + 1'd1;       //计数
21 end
22
23 always@( posedge clk or negedge reset ) begin
24 if(reset == 1'd1 )begin            //复位端有效,led熄灭
25 led <= 0;
26 end
27 else if( counter == 9999999 ) begin    //led翻转状态
28 led <= !led;
29 end
30 end
31
32
33
34 endmodule

3.综合

4.综合后功能仿真

 1 `timescale 1ns/1ns
2
3 module led_flash_tb();
4
5 reg s_clk;
6 reg s_reset;
7 wire s_led;
8
9 led_flash led_flash_sim(
10 .clk(s_clk),
11 .reset(s_reset),
12 .led(s_led)
13 );
14
15 initial s_clk = 1;         //模拟时钟信号
16 always #10 s_clk = !s_clk;    //每10ns时钟便翻转一次,模拟开发板的时钟
17
18 initial begin
19 s_reset = 1;            //模拟复位端有效,持续101ns
20 #101;
21 s_reset = 0;
22 #400000000;           //复位端无效,持续400ms
23 $stop;
24 end
25
26 endmodule

 5.布局布线

6.时序仿真,性能分析

7.板级调试,设置i/o口,std,pin,下载到板子上。

  • 注意

1.在设计模块中,output reg xx可以,但input reg xx不可以。删了reg,否则报错。

2.一般只有端口放在你定义的模块部件里,其他变量放在模块外,module内。如果变量不是简单的0和1,则要定义它的位宽,用程序员计算器转为2进制即可快速写出。

3.计算中+1最好写出 + 1'd1(或其他进制的1)比较规范。

4.有括号和赋值等语句,加个空格比较美观。

5.时序电路最好用非阻塞赋值 <=。

6.模拟仿真时时钟要翻转很多次,不能再写成之前的:

 s_a=0; s_b=0; s_sel=0;
#100;
s_a=0; s_b=1; s_sel=0;
#100;
s_a=1; s_b=0; s_sel=0;

要写99999次不现实。因为只有两个状态在翻转且周期固定,直接写成:

initial s_clk = 1;         //模拟时钟信号
always #10 s_clk = !s_clk;    //每10ns时钟便翻转一次,模拟开发板的时钟

7.当一个判断条件语句(或其他语句)接着有多个操作时,用begin和end括起来才不会报错。

8.学习复位信号的仿真

initial begin
s_reset = 1;            //模拟复位端有效,持续101ns
#101;
s_reset = 0;
#400000000;           //复位端无效,持续400ms
$stop;

9.由于fpga是并行执行,而非按顺序从上往下执行代码,故可以把多个操作分成几个always进行,这样有利于软件综合成较为简单的电路,也方便我们修改代码。如下:

    always@( posedge clk or negedge reset ) begin
if(reset == 1'd1 )begin
counter <= 0;
end
else if( counter == 9999999 ) begin
counter <= 0;
end
else
counter <= counter + 1'd1;
end always@( posedge clk or negedge reset ) begin
if(reset == 1'd1 )begin
led <= 0;
end
else if( counter == 9999999 ) begin
led <= !led;
end
end
    always@( posedge clk or negedge reset ) begin
if(reset == 1'd1 )begin
counter <= 0;
       led<=0;
end
else if( counter == 9999999 ) begin
counter <= 0;
       led<=!led;
end
else
counter <= counter + 1'd1;
end

两者等价,但第一种更好。

10.看时序仿真的时候可以进行标记,create market,以便观察时间间隔。

led闪烁(时序输入输出,自定义变量,时钟仿真,执行顺序)的更多相关文章

  1. C#类、静态类、静态变量,初始化执行顺序

    执行顺序: 类的静态变量 ↓ 类的静态构造函数 ↓ 类的普通变量 ↓ 基类的静态变量 ↓ 基类的静态构造函数 ↓ 基类的普通变量 ↓ 基类的构造函数 ↓ 类的构造函数

  2. java代码块,静态代码块,静态变量,构造方法执行顺序

    一个类中执行顺序: 静态变量静态代码块代码块构造方法 子类和父类执行顺序: 父类静态变量父类静态代码块子类静态变量子类静态代码块父类代码块父类构造方法子类代码块子类构造方法 直接看代码,一目了然. p ...

  3. MySQL 查询排除指定字段、自定义变量、动态执行SQL

    今天在项目中,要查询一个表.这个表中有几十个字段.但是要把其中的一个特殊处理. 这个该怎么办呢?查来查去,SQL 中没有排除某一些字段的语句,只能单独写一些语句来处理: 基本思路:对于MySQL数据库 ...

  4. Linux中环境变量中文件执行顺序

        Linux 的变量可分为两类:环境变量和本地变量   环境变量:或者称为全局变量,存在于所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了.Linux 的环境变量具有 ...

  5. js函数和变量的声明与执行顺序

    一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); //alert 2 function ...

  6. js函数和变量的执行顺序【易错】

    js函数和变量的声明与执行顺序 一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); // ...

  7. 【Java】成员变量赋值执行顺序

    程序中成员变量赋值的执行顺序

  8. STM32入门系列-STM32时钟系统,自定义系统时钟

    在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率.在库函数中也有对时钟倍频因子配置的函数,如下: void RCC_PLLConfig(uint32_t R ...

  9. [stm32][ucos][ucgui] 2、LED闪烁、串口、滑块、文本编辑框简单例程

    上一篇:[stm32][ucos] 1.基于ucos操作系统的LED闪烁.串口通信简单例程 * 内容简述: 本例程操作系统采用ucos2.86a版本, 建立了7个任务            任务名   ...

随机推荐

  1. 使用allatori混淆代码

    引言 为了保密需要,我们开发出来的程序在实际部署之前,需要先将jar包的代码进行混淆,让用户使用反编译也无法获得源码. allatori就是这样一个混淆java jar包代码的工具. 操作步骤 Ste ...

  2. OpenStack平台调度策略优化

    OpenStack平台报错分析 在OpenStack平台经历大并发的时候,比如同一个平台,大量的用户同时创建云主机(单个用户创建大量云主机不会触发此种现象),会达到云平台的性能瓶颈,导致创建云主机报错 ...

  3. Git 后续——分支与协作

    Git 后续--分支与协作 本文写于 2020 年 9 月 1 日 之前一篇文章写了 Git 的基础用法,但那其实只是「单机模式」,Git 之所以在今天被如此广泛的运用,是脱不开分支系统这一概念的. ...

  4. 每日一题20180401-Linux

    一.题目 1.1 在mysql命令行临时开启自动补全 1.2 通过shell脚本打印乘法口诀表 二.答案 2.1 # auto-rehash:读取表信息和列信息,可以在连上终端后开启tab补齐功能 # ...

  5. 图解Dijkstra算法+代码实现

    简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...

  6. SpringBoot进阶教程(七十四)整合ELK

    在上一篇文章<SpringBoot进阶教程(七十三)整合elasticsearch >,已经详细介绍了关于elasticsearch的安装与使用,现在主要来看看关于ELK的定义.安装及使用 ...

  7. Fail2ban 配置详解 监禁配置(jail.conf)

    ### # 包含配置 ### [INCLUDES] # after = # 在加载本配置文件之后再加载指定的独立配置文件. before = paths-debian.conf # 在加载本配置文件之 ...

  8. HTML5续集

    H5 input新增属性 1.color 拾色器 2.Email 电子邮件 3.tel 电话 4.datetime-local 本地日期和时间 5.range 范围 6.url 路径,地址 7.sea ...

  9. 抽象类与接口——JavaSE基础

    抽象类与接口 抽象类 抽象类既包含规范又包含具体实现 抽象类可以包含实现的方法 和 未实现的用abstract修饰的抽象方法 抽象类不可以有实例化(不能使用new实例化),只能通过子类继承,然后对子类 ...

  10. go-zero微服务实战系列(五、缓存代码怎么写)

    缓存是高并发服务的基础,毫不夸张的说没有缓存高并发服务就无从谈起.本项目缓存使用Redis,Redis是目前主流的缓存数据库,支持丰富的数据类型,其中集合类型的底层主要依赖:整数数组.双向链表.哈希表 ...