概述
阻塞赋值与非阻塞赋值:
在描述组合逻辑电路的时候,使用阻塞赋值,比如 assign 赋值语句和不带时钟的 always 赋值语句,这种电路结构只与输入电平的变化有关系
在描述时序逻辑的时候,使用非阻塞赋值,综合成时序逻辑的电路结构,比如带时钟的 always 语句;这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值的变化
assign 和 always 区别:
assign 语句使用时不能带时钟。
always 语句可以带时钟,也可以不带时钟。在 always 不带时钟时,逻辑功能和 assign 完全一致,都是只产生组合逻辑。
比较简单的组合逻辑推荐使用 assign 语句,比较复杂的组合逻辑推荐使用 always 语句。在always带时钟信号时,这个逻辑语句才能产生真正的寄存器
什么是 latch
latch 是指锁存器,是一种对脉冲电平敏感的存储单元电路。锁存器和寄存器都是基本存储单元,锁存器是电平触发的存储器,寄存器是边沿触发的存储器。
两者的基本功能是一样的,都可以存储数据。锁存器是组合逻辑产生的,而寄存器是在时序电路中使用,由时钟触发产生的。
latch的主要危害是会产生毛刺,这种毛刺对下一级电路时很危险的。并且隐蔽性很强,不易查出。因此,在设计中,因避免latch的使用。
代码中出现latch的两个原因时在组合逻辑中,if或者case语句不完整的描述,比如if缺少else分支,case缺少default分支,导致代码在综合过程中出现了latch。解决办法就是if必须带else分支,case必须带default分支。只有不带时钟的 always 语句 if 或者 case 语句不完整才会产生 latch,带时钟的语句 if或者 case 语句不完整描述不会产生 latch。
状态机:
Mealy 状态机:组合逻辑的输出不仅取决于当前状态,还取决于输入状态。
Moore 状态机:组合逻辑的输出只取决于当前状态。
三段式状态机(最常用)的基本格式是:
第一个 always 语句实现同步状态跳转;
第二个 always 语句采用组合逻辑判断状态转移条件;
第三个 always 语句描述状态输出(可以用组合电路输出,也可以时序电路输出)。
在开始编写状态机代码前,一般先画出状态机跳转图,这样在编写代码时思考比较清晰。
模块化设计:
在进行模块话设计中,对于复杂的数字系统,我们一般采用自顶向下的设计方法。把系统划分为几个功能模块,每个功能模块再划分成下一层的子模块。一般整个设计的顶层模块只做例化(调用其他模块),不做逻辑。顶层模块对子模块做例化时,只需要知道子模块的端口信号名,而不用关心子模块内部具体是如何实现的。
Verilog 语法中的localparam代表的意思同样是参数定义,用法和 parameter 基本一致,区别在于 parameter 定义的参数可以做例化,而 localparam 定义的参数是指本地参数,上层模块不可以对localparam 定义的参数做例化。
最后
以上就是曾经芒果为你收集整理的FPGA学习笔记(一)的全部内容,希望文章能够帮你解决FPGA学习笔记(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复