Verilog HDL 综合实用教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《Verilog HDL 综合实用教程》读书笔记——锁存器、触发器
加入收藏
2007-08-29 00:23
转发分享 人人网 开心网 新浪微博 搜狐博客 百度收藏 谷歌收藏 qq 书签 豆瓣 淘江湖 Facebook Twitter Digg Yahoo!Bookmarks
锁存器:
推导出锁存器的一般规则是,如果变量未在 always 语句所有可能的执行过程中被赋值, 就推导出锁存器。如果变量在 if 的所有分支中都被赋值则综合成组合逻辑。 case、casez、casex 可转成 if、else 形式。当 case 中不是所有情况都列举出或使用 default 语句时、在 case 语句前对 case 中赋值对象赋初值也可避免综合出锁存器。若不 是以上各种情况且须综合成组合逻辑可以使用综合命令,如下: 例: always @ (Toggle) case (Toggle) //synthesis full_case 2'b01: NextToggle = 2'b10; 2'b10: NextToggle = 2'b01; end case end module 上例中的//synthesis full_case 是综合命令,告知综合工具 case 中已是全部列举可能的 情况,这样综合后无锁存器。(正常的 case 语句是有优先级的,先出现的优先级最高,若 case 中各分支是互斥时,综合成译码逻辑。当使用 casex 时用综合命令//synthesis parallel-case 告知综合工具该 casex 是互斥的)。 触发器: 沿控制的用触发器,且沿控制的赋值用非阻塞的方式“Zee<=A;”。 当 always 中是沿敏感时,此 always 中有 if……else if……且在这些 if……else if 中有多 于 1 个对同一变量赋值时,这个变量很可能被综合成有异步置位或清零的触发器。 例: always @ (negedge Reset or negedge Set or negedge CLKA) if (!Reset) NextState<=12; else if (!Set) NextState<=5;
else NextState<=CurrentState; 上例为异步赋值,最后一个 else 才是时钟控制,前两个不受时钟控制,综合时形成带异步 清零或置位。(书中说“不提倡使用异步赋值”)使其同步化的方法是将 always 中的敏感变 量表中只有时钟作为触发源则为同步,既 always 中的处理都是在时钟的控制下进行的。 触发器、锁存器优化: 例: always @ (posedge clockA) case (PreserState) 0:begin PresetState<=1; Zont<=4'b0100; end 1:begin PresetState<=0; Zont<=4'b0001; end endcase Zont 的赋值在 clockA 的上升沿触发的 always 语句块中, 所以 Zont 就被综合成四位触发 器,太浪费资源,改为如下: always @ (posedge clockA) case (PresetState) 0:PresetState<=1; 1:PresetState<=0; endcase always @ (PresetState) case (PresetState) 0:Zont=4'b0100; 1:Zont=4'b0001; endcase always @ (Probe or Count)
又例:
if (Probe) Luck=Count; 综合后因 Probe 为 0 时 Luck 保留原值,所以综合成锁存器。若要去掉锁存器可以改为 always @ (Probe or Count) if (Probe) Luck=Count; else Luck=0; 或 always @ (Probe or Count) begin Luck=0; if (Probe) Luck=Count;
end