led闪烁(时序输入输出,自定义变量,时钟仿真,执行顺序)
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闪烁(时序输入输出,自定义变量,时钟仿真,执行顺序)的更多相关文章
- C#类、静态类、静态变量,初始化执行顺序
执行顺序: 类的静态变量 ↓ 类的静态构造函数 ↓ 类的普通变量 ↓ 基类的静态变量 ↓ 基类的静态构造函数 ↓ 基类的普通变量 ↓ 基类的构造函数 ↓ 类的构造函数
- java代码块,静态代码块,静态变量,构造方法执行顺序
一个类中执行顺序: 静态变量静态代码块代码块构造方法 子类和父类执行顺序: 父类静态变量父类静态代码块子类静态变量子类静态代码块父类代码块父类构造方法子类代码块子类构造方法 直接看代码,一目了然. p ...
- MySQL 查询排除指定字段、自定义变量、动态执行SQL
今天在项目中,要查询一个表.这个表中有几十个字段.但是要把其中的一个特殊处理. 这个该怎么办呢?查来查去,SQL 中没有排除某一些字段的语句,只能单独写一些语句来处理: 基本思路:对于MySQL数据库 ...
- Linux中环境变量中文件执行顺序
Linux 的变量可分为两类:环境变量和本地变量 环境变量:或者称为全局变量,存在于所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了.Linux 的环境变量具有 ...
- js函数和变量的声明与执行顺序
一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); //alert 2 function ...
- js函数和变量的执行顺序【易错】
js函数和变量的声明与执行顺序 一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); // ...
- 【Java】成员变量赋值执行顺序
程序中成员变量赋值的执行顺序
- STM32入门系列-STM32时钟系统,自定义系统时钟
在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率.在库函数中也有对时钟倍频因子配置的函数,如下: void RCC_PLLConfig(uint32_t R ...
- [stm32][ucos][ucgui] 2、LED闪烁、串口、滑块、文本编辑框简单例程
上一篇:[stm32][ucos] 1.基于ucos操作系统的LED闪烁.串口通信简单例程 * 内容简述: 本例程操作系统采用ucos2.86a版本, 建立了7个任务 任务名 ...
随机推荐
- [题解][P5206][WC2019] 数树 (op = 1)
简要题意 给定 \(n, y\). 一张图有 \(|V| = n\) 个点,现在给出两棵树 \(T_1=G(V, E_1)\) 和 \(T_2=G(V, E_2)\). 定义这两棵树的权值 \(F(E ...
- 【论文笔记】Federated Learning for Wireless Communications: Motivation, Opportunities, and Challenges(综述)
Federated Learning for Wireless Communications: Motivation, Opportunities, and Challenges Authors So ...
- Java中的JVM和Redis,你了解的透彻么?
招聘在前不久已经渐渐拉下帷幕了,看到最近技术群一个问题,引起了我的思考:"今年面试为什么那么难?" 想必大家都知道程序员要涨薪主要靠跳槽来完成!但是无论是考试,还是求职,这个难度, ...
- 【原创】记一次对X呼APP的渗透测试
获取CMS并本地安装 X呼是一款开源的客服CMS系统,访问官网,下载安卓版本的app和源码本地搭建: 发现这cms预留admin表中的用户就不少.... 直接用预留的密码解密,然后就能登录手机APP了 ...
- 简单的 useState 实现
简单的 useState 实现 本文写于 2020 年 10 月 21 日 以下是一段非常简单的 React 代码: const App = () => { const [n, setN] = ...
- Jenkins安装详解
一.Jenkins是什么 Jenkins是一个独立的开源自动化服务器,可用于自动执行与构建,测试,交付或者部署软件相关的各种任务,是跨平台持续集成和持续交付应用程序,提高工作效率.使用Jenkins不 ...
- Windows环境下启动Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。(已解决)
问题描述: 今天在windows环境下启动Redis时启动失败报错: 解决方案: ①运行命令:redis-cli.exe ②退出Redis ③运行命令:redis-server.exe redis.w ...
- Typora详细教程以及下载
发现一篇非常不错的 Typora 教程,分享给大家. 原文链接:https://www.cnblogs.com/hyacinthLJP/p/16123932.html 作者:MElephant T ...
- SpringSecurity的 loginProcessingUrl为什么不能用
前情提要: 我在做一个springsecurity动态鉴权的项目时, 据网上说配置了 loginProcessingUrl("/login1"); 以后 就可以自定义login的请 ...
- 渗透开源工具之sqlmap安装配置环境变量教程
由于计算机安全牵涉到很多方面,建议自己在服务器上搭建自己的靶场,如何搭建靶场请订阅并查看作者上期教程,这里作者先为大家推荐一个免费开源升级靶场:https://hack.zkaq.cn/ 在封神台 ...