好吧!看一下锁存器这个概念吧!对于锁存器这个概念确实困扰我一段时间,知道自己的数电知识不是很好,而且对于FPGA还是“半路出家”,本来就不容易的FPGA对于我来说学起来更加费劲了,别人看一遍就能够懂的知识,我看好几篇才会懂。但是这样才会具有挑战性对吧?好了不说的有点多了,一般我遇到自己从来没有遇到的知识或者问题我都会习惯性的去百度,如果有官方网站的话我会去官网上去寻找我需要的答案,如果找不到的话,我才会去找课本或者问别人啊,我也不知道我这个解决问题的思路对不对。对于锁存器这个概念百度上是这样解释的锁存器是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。只有在有锁存信号时输入的状态被保存到输出,直到下一个锁存信号,通常只有0和1两个值。
在实际的verilog hdl的代码书写过程中,很容易产生不期望的锁存器,使自己设计的代码功能失效,我感觉锁存器是一种基本单元,完全是由你所写的代码决定,所以产生不期望锁存器是我们所书写的代码决定的。
说一下锁存器与寄存器之间的区别吧,曾经在一本书中看到有很多的篇幅讲锁存器(那是我见过对锁存器说的最详细的一本书,感谢作者)锁存器是电平触发的存储器,触发器是边沿触发的存储器。锁存器对毛刺敏感,上电之后处于不确定的状态;是静态时序分析变得很复杂;需要很多的资源,因为PLD芯片里面的基本单元是查找表很触发器。所以要避免产生不期望的锁存器。
锁存器产生的原因always组合逻辑描述语句中,可能产生锁存器有两种,一种是在if语句中,另一种是在case语句中。由于if语句中缺乏else分支或者case语句的不完整,但有时候也会产生我们需要的信号,而且这个时候虽然会出现警告信息。这里截取一本书上的例子:
通过verilog hdl 语言实现序列最大值的搜寻程序,并保持检测到的最大值。
module two_max (a,reset_n,abmax);
input [7:0] a;
input reset_n;
output [7:0] abmax;
reg [7:0] abmax_tmp;
always @ (a or reset_n)
begin
if (reset_n)
abmax_tmp=8’h00;
else
if (a>abmax_tmp)
abmax_tmp=a;
end
assign abmax=abmax_tmp;
endmodule
这是综合后产生的警告但是锁存器是设计所需要的,因此代码没有问题。
总结一下:锁存器是一种基本的电路单元,会影响到电路的时序性能,应该尽量避免使用,但是出现一些不期望的锁存器,那应该是设计人员设计代码所出现的问题
文章评论(0条评论)
登录后参与讨论