本文转载在网上,后面有原文地址

1. 信号的产生及always块使用注意事项

1.1 不要在不同的always块内为同一个变量赋值。即某个信号出现在<=或=左边时,只能在一个always块内。(详细解释见 Verilog HDL与数字电路设计 P38)

所以注意,在产生一个信号时,所有产生该信号的条件都应放在一个always块内考虑。

1.2 不要在同一个always块内同时使用阻塞赋值(=)和非阻塞赋值(<=)。

1.3 使用always块描述组合逻辑时使用阻塞赋值(=),在使用always块描述时序逻辑时使用非阻塞赋值(<=)。简单理解可以是,在电平敏感的always块内使用阻塞赋值,在边沿敏感的always块内使用非阻塞赋值。

1.4 任何在always块内被赋值的变量都必须是寄存器型(reg)。即<=或=左边的信号,必须是reg型,<=或=右边的信号可以是reg型也可以是wire型。

另,端口声明中被声明为input或inout型的端口,只能被定义为线网型(wire);被声明为output型的端口,则可以被定义为线网型(wire)或者寄存器型(reg)。如果不定义,则默认为线网型(wire)。

1.5 always的敏感列表中可以同时包括多个电平敏感事件,也可以同时包括多个边沿敏感事件,但不能同时有电平和边沿敏感事件。另外,敏感列表中,同时包括一个信号的上升沿敏感事件和下降沿敏感事件也是不允许的,因为这两个事件可以合并为一个电平事件。

2. 总clk的使用

always敏感列表里的边沿触发事件,就是一个clk信号,所以在制定ucf时,边沿触发事件信号都要被定义在clk IO端口上,有时随意分配的clk IO端口在Implement时也会出错。需要到ucf中用

NET "polin" CLOCK_DEDICATED_ROUTE = FALSE;      //polin为边沿触发事件信号

语句来规避错误。

所以在一个程序中,要尽量使用主clk作为always块的边沿触发信号。如果有些变量要通过某个信号的边沿触发来产生,那尽量将这个边沿触发信号做成一个判断条件,然后在产生变量时仍用主clk触发。

例程:要得到LCD大尺寸屏POL信号的2分频、8分频、16分频...,在控制板上拨动开关设置不同的状态,输出polout切换到不同的pol输入的分频信号。

思路,定义一个counter(cnt_pol)对输入pol信号进行计数,则cnt_pol的bit0位与pol输入信号一致,cnt_pol的bit1位为pol信号的2分频,bit2位为pol的4分频,bit3位为pol的8分频,bit4位为pol的16分频...

counter计数有两种方法,一种是直接使用pol作为边沿触发事件计数:

reg [8:0] cnt_pol;

always @ (posedge polin or negedge rst)

if(!rst) cnt_pol <= 0;

else cnt_pol <= con_pol +1;

(程序中还有一个主clk信号clkin作为其它信号的主时钟)

上面这种方法比较简单,但是polin就作为了一个clk信号,只能定义到FPGA的clk IO端口,并且实现时容易报错。

另一种方法是,采用主时钟信号为cnt_pol计数的边沿敏感事件:

reg [8:0] cnt_pol;

reg pold;

wire cnt_event;

always @ (posedge clkin or negedge rst)

if (!rst)  pold <= 0;

else pold <= polin;

assign cnt_event = polin & pold;

always @ (posedge clkin or negedge rst)

if (!rst) cnt_pol <= 0;

else if (!cnt_event) ;

else cnt_pol <= cnt_pol +1;

这样,程序比较多,但整个程序(包括其它部分)只有clkin是clk信号,避免了上述问题。

对这段程序的解释:cnt_pol计数的机理与第一种方法不同,先通过第一个always块(寄存器),对polin信号进行延迟,产生pold信号,pold与polin在相位上差一个clkin周期。然后对pold和polin进行与操作并赋值给cnt_event信号,这样,cnt_event信号的每个高电平,即代表一个polin周期。然后再在第二个always块中,通过判断cnt_event的状态,来对cnt_pol计数。简单讲,就是将polin的上升沿,转成一个信号的电平状态,然后通过判断这个信号电平的状态来计数。整个过程使用的边沿触发信号都是主clk。

原文地址:http://blog.csdn.net/phenixyf/article/details/46364193

Verilog语言注意事项——always相关推荐

  1. Verilog语言注意事项

    目录 一.基本格式 二.端口 三.逻辑操作符 四.连续赋值语句 五.关键字+标识符 六.其他 (1)注释 一.基本格式 模板 module 模块名 (模块端口名表):     模块端口和模块功能描述 ...

  2. Verilog语言快速入门(一)

    组合逻辑的一般模板 时序电路的一般模板 模块总体结构 模块说明 功能描述 1.assign语句   1)算数型 2)逻辑型 3)关系运算符 4) 等价运算符 5)按位运算符 6)缩减运算符 7) 移位 ...

  3. vivado环境下用Verilog语言实现编码器

    ** vivado环境下用Verilog语言实现编码器 ** 编码器的分类 编码器通常分为两大类: 普通编码器和优先编码器. 其中,普通编码器对某一个给定时刻只能对一个输入信号进行编码的编码器, 它的 ...

  4. FPGA学习之verilog语言入门指导

    本人985硕士,在此分享下学习过程,verilog通关!本人博客页也分享了很多课程设计和毕业设计,欢迎收藏观看订阅!谢谢支持! 在学习之前,要思考下为什么学习FPGA,老师要求?项目要求?课题组要求? ...

  5. 怎么运行verilog语言_(六) Verilog入门之有限状态机

    现在让我们回到主线,继续FPGA编程的学习.之前我们我们在测试FPGA是否工作时所用到的代码里面有组合逻辑,如加法器:也有时序逻辑,如将时钟信号分频而得到的闪烁灯. 但如何组合这两种逻辑实现我们所需的 ...

  6. Verilog语言实现并行(循环冗余码)CRC校验

    1 前言 (1)    什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能, ...

  7. (61)FPGA面试题-使用Verilog语言编写异步复位同步释放代码

    1.1 FPGA面试题-使用Verilog语言编写异步复位同步释放代码 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-使用Verilog语言编写异步复位 ...

  8. (53)FPGA面试题-利用任务task实现单字节乘法功能(Verilog语言实现)

    1.1 FPGA面试题-利用任务task实现单字节乘法功能(Verilog语言实现) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-利用任务task实现 ...

  9. (52)FPGA面试题-利用函数function实现半字节加法功能(Verilog语言实现)

    1.1 FPGA面试题-利用函数function实现半字节加法功能(Verilog语言实现) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-利用函数fu ...

  10. (11)verilog语言编写8路分配器

    2.10 verilog语言编写8路分配器 2.10.1 本节目录 1)本节目录: 2)FPGA简介: 3)verilog简介: 4)verilog语言编写8路分配器: 5)本节结束. 2.10.2 ...

最新文章

  1. 首发 | 13篇京东CVPR 2019论文!你值得一读~ 技术头条
  2. php内核分析-fpm和df的问题思考
  3. 【编程之美】2.21 只考加法的面试题
  4. VMware vSAN紧盯虚拟化应用
  5. 服务器2003 系统修复,第十一篇 Windows Server 2003系统修复.pdf
  6. oracle磁盘组故障组的概念,ASM中理解的问题大家帮忙!!(asm的外部冗余,为什么也有故障组呢?)...
  7. JavaScript的函数声明与函数表达式的区别
  8. 防范网络*** 应用层防护是重点
  9. 今天用Map集合写了一个字符串字符统计的程序,看集合看的头痛,就看了一下GUI,于是就随便记点。
  10. Tensorflow如何读取文件
  11. java案例代码21-电影院购票系统[重要]
  12. 安卓机型刷写第三方twrp 刷写第三方rom的教程和一些问题解决
  13. 员工管理能力怎么提高?不妨使用现代工时表软件
  14. python 之免费ip代理池
  15. PLM Agile BOM表结构笔记
  16. win10蓝屏后的解决办法
  17. Android build.gradle配置详解
  18. 常见的深度学习图像处理数据集下载
  19. 小米10000MAH充电宝四个灯同时闪烁故障维修
  20. 怎样安装win10系统?(使用u盘制作启动盘并安装windows详细教程)

热门文章

  1. 在html中书名号怎么写,html范本
  2. Python深度学习-第一章、什么是深度学习
  3. CR 与 LF 换行符
  4. Blender导出模型到maya
  5. 深度学习实战 2 YOLOv5 添加CBAM、CA、ShuffleAttention注意力机制
  6. 信号在PCB走线中的延迟
  7. 字体图标转png透明图标——小程序开发用
  8. Zabbix实现短信报警设置(实战)
  9. 为了让机器听懂“长篇大论”,阿里工程师构建了新模型
  10. 年轻时欠下风流情债的十大男女明星(组图)