开发一个网站大概多少钱,网站单页seo,河南郑州最新新闻,成都flash互动网站开发这篇帖子用于记录学习Verilog过程中的一些syntax的问题#xff0c;会不断更新#xff0c;有不正确的地方请各位帮忙指正:D一.Verilog 语法中的可综合性Verilog HDL 真的很强大#xff0c;如果程序只用于仿真#xff0c;那么几乎所有的语法和编程语句都可以使用。但如果程序… 这篇帖子用于记录学习Verilog过程中的一些syntax的问题会不断更新有不正确的地方请各位帮忙指正:D 一.Verilog 语法中的可综合性 Verilog HDL 真的很强大如果程序只用于仿真那么几乎所有的语法和编程语句都可以使用。但如果程序是用于硬件实现那么我们就必须保证程序的可综合性即所编写的程序能被综合器 转化为相应的电路结构。不可综合的HDL语句在用综合工具综合时将被忽略或者报错。作为设计者应该对可综合模型的结构有所了解。 虽然不同的综合工具对Verilog HDL语法结构的支持不尽相同但Verilog HDL中某些典型的结构是很明确地被所有综合工具支持或不支持的。 1所有综合工具都支持的结构 alwaysassignbeginendcasewiretriaupply0supply1regintegerdefaultfor functionandnandornorxorxnorbufnotbufif0bufif1notif0notif1ifinout inputinstantitationmodulenegedgeposedgeoperatorsoutputparameter。 2所有综合工具都不支持的结构timedefparam$finishforkjoininitialdelaysUDPwait。 3有些工具支持有些工具不支持的结构casexcasezwandtriandwortriorrealdisableforeverarraysmemoriesrepeat taskwhile。 看到一些资料上说其实Verilog HDL的产生是为了写testbench而编程设计只用到了其中的很少的部分。Verilog有人说很好学很容易入手但是我觉得仅仅入手是没有用的充其量就鸡肋一根一定要仔细深入研究语法和结构这样才能写出高效率的代码否则基本的代码一塌糊涂的话后面的功能仿真时序仿真都是浮云。 | | 二.避免锁存器 在 always 块的 if..else 语句中如果所列的条件不完整综合时则会产生锁存器。 example always (action) if(action) out1 1b1; 没有考虑到 !action 的情况默认out1保持不变这就产生了锁存器。 优化方法1.列出 !action 的情况2.对out1赋初始值 1.always (action) if(action) out1 1b1; else out1 1b0; | 2.always (action) begin out 1b0; if(action) out1 1b1; end 但是在描述时序逻辑的时候也通常利用 if 语句的隐式条件对带时钟使能的 D 触发器建模 example always(posedge clk, negedge rst_n) begin if(!rst_n) sum 0; else if(EN) sum ab; 表示在时钟正沿来临时如果 EN 为 1 则将 ab 的值赋给 sum 言下之意是如果 EN 为 0 那么 sum 保持原值不变。这里综合工具会把代码综合成一个带时钟使能的 D 触发器。 三.产生占空比不等于50%的波形 状态机的巧用 在面试的时候常常看到一些对verilog用得不熟的同学在被要求写出可综合的RTL代码并产生占空比不同的输出脉冲时选择用很多计数器来对输入的脉冲进行计数而且还分别对输入脉冲的上升沿和下降沿进行计数非常的糟糕因为输入的脉冲一般只能保证一个触发沿是稳定的 如果要产生占空比相同的波形那么计数器可以很简单的搞定。 例如将一个200kHz的时钟做2分频4分频8分频这时候你也许会想到用PLL但是这里的时钟速率是kHz级别很低无法使用PLL。 可以这样设计 reg [2:0] cnt; always (posedge clk_200k, negedge rst_n) if(!rst_n) cnt 3b000; else cnt cnt 1b1; assign clk_100k cnt[0]; assign clk_50k cnt[1]; assign clk_25k cnt[2]; 如要要求产生一个占空比为14的波形用计数器实现的话就很麻烦了在这种时候就可以用一个简单的状态机来实现。 000-001-110-100-010- | | --------------------- 利用状态机就很简单的实现了占空比不同的波形的产生。 代码如下 1 reg [2:0] state; 2 3 always (posedge clk, negedge rst_n) 4 if(!rst_n) 5 state 3b000; 6 else 7 case (state) 8 3b000: state 3b001; 9 3b001: state 3b110;10 3b110: state 3b100;11 3b100: state 3b010;12 3b010: state 3b000;13 default : state 3b000;14 endcase 15 16 assign clk_out state[0];17 仿真波形 状态机的设计水平直接反映了工程师的逻辑功底要写好状态机就一定要多练习。 转载于:https://www.cnblogs.com/semiok/archive/2010/10/13/1849730.html