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. nacos 详细介绍(二)

    五.nacos的namespace和group namespace:相当于环境,开发环境 测试环境 生产环境 ,每个空间里面的配置是独立的默认的namespace是public, namespace可 ...

  2. R可视化:plot函数基础操作,小白教程

    最近迷恋上了画图,一方面是觉得挺有意思的,另一方面是觉得自己确实画图方面比较弱,所以决定比较系统地回顾反思一下,同时顺带记录下来分享给大家.也确实是好久好久没更新文章了,真的是杂事太多太忙太牵扯精力没 ...

  3. python PDF转图片,World转PDF

    软件不用续费了... PDF转World暂时没需求,有需求了再搞 Python3.9 ---------------pip3 install  PyMuPdf ---------------pip3 ...

  4. MYSQL如何比对版本号字符串

    MYSQL如何比对版本号字符串 mysql 数据库中存储了一个形如"2.7.6.526" 的版本号,现在要获取出小于某个版本号的数据,怎么做?这个就是昨天遇到的一个问题,记录下查到 ...

  5. MySQL数据库和Oracle数据库的区别

    Mysql数据库 由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司.是一种中小型的关系型数据库. MySQL 数据库体积小.速度快.总体拥有成本低.开放源代码,其有着广泛的应用,一般中 ...

  6. 每天一个 HTTP 状态码 201

    201 Created 201 Created 表示客户端的请求已经成功完成,结果是创建了一个新资源,通常用于响应「增删改查」里的「增」.如果是严格按照 RESEful style 的 API,那么当 ...

  7. JVM的类加载过程

    每日一句 人到情多情转薄,而今真个不多情. 每日一句 The frog in the well knows nothing of the great ocean. 井底之蛙,不知大海. JVM 的类加 ...

  8. springboot如何使用自定义配置文件

      从前边<springboot竟然有5种默认的加载路径,你未必都知道>我们知道,springboot会默认加载application.properties/application.yml ...

  9. 高通(QCOM)sensor bring up

    高通7150平台 1.添加驱动文件 2.添加编译 3.配置json文件 4.高通默认配置 5.部分sensor外挂电源 6.遇到的问题 1.添加驱动文件 路径:adsp_proc/ssc/sensor ...

  10. Spring IOC 常用注解与使用

    @Component 注解@component代表spring ioc 会把这个类扫描生成Bean实例 @Component public class Role{ @Value("1&quo ...