当前位置:   article > 正文

9 EDA实用技术与教程【Verilog深入】_verilog hdl中的always语句中不完整的if语句可以实现

verilog hdl中的always语句中不完整的if语句可以实现

1.过程中的两类赋值语句

1. 阻塞式赋值和非阻塞式赋值的区别

阻塞式赋值语句(目标变量名=驱动表达式) 的执行过程分为三步:

计算出“驱动表达式”的值;

向目标变量进行赋值操作;

完成赋值。

这三步是并成一步完成的,即一旦执行,目标 变量被立即更新,而在此过程中其他同类赋值 语句必须停止工作!

非阻塞式赋值的三个步骤不是一步完成的

非阻塞式赋值在赋值的第一个阶段(计 算“驱动表达式”的值)理论上是可以 立即完成的,但第二个阶段(向目标变 量进行赋值操作),需要由一个δ延时段。 也就是δ延时后,赋值才被更新。在这个 延迟时间段,允许其他同类赋值语句的 执行或者说赋值操作。

2. 未指定延时的阻塞式赋值语句

        目标变量名=驱动表达式

                

3. 指定了延时的阻塞式赋值

 

 左边例子表示,当第一条语句执行完之后需要延时6个时间单位在执行第二条语句;右边例子表示,当第一条语句执行完后,立刻执行等式右边表达式的值,等待6个时间单位后再赋值给左边

4. 未指定延时的非阻塞式赋值

非阻塞赋值允许对同一目标多次赋值或驱动,并且最终获得赋值(更新)的目标 变量是最后一个,即最接近过程结束的那一语句的目标变量。

左:程序是不被允许的,由于连续赋值语句的并行性,使得综合器无法确定Q1获得什么值,除非这三条语句被执行后,Q1能获得高阻态z的赋值。

中:阻塞式赋值,Q1经历了2b'11和2b'01的赋值

对于非阻塞赋值,Q1从来未经历过2’b11和2‘b01数据的更新。 

5. 指定了延时的非阻塞式赋值

 赋值号左侧的[延时]是指对整条语句执行的延时,即相隔与上一条 语句的延时量。

赋值号右侧的[延时]是指在赋值语句的右侧表达式得出运算结果后, 延时一段指定的时间再将运算结果赋值给赋值号左边的变量

6. 深入认识阻塞与非阻塞式赋值的特点

7. 不同的赋初值方式导致不同综合结果的示例

 

 

2.过程语句归纳

1. 过程语句应用总结

(1)和软件语言不同,过程语句always的执行依赖于敏感信号的变化。

(2)在一个模块中可以包含任意个过程语句结构,所有的过程语句结构本身都属于并行运行语句, 而由任一过程引导的各类语句结构都属于顺序语句。

(3)与引导行为语句(顺序执行的语句)的always语句相对应,assign引导的语句属于并行语句。 always语句本身也属于并行语句,所以在许多情况下这两类语句是可以互相转换表达的。

2. 深入认识不完整条件语句与时序电路的关系

(1)不完整的条件语句的描述,是Verilog描述时序电路的途径之一(通常用于描述电平触发类锁存 器电路)。

(2)在利用条件语句进行纯组合电路设计时,如果没有充分考虑电路中所有可能出现的问题(条 件),即没有列全所有的条件及其对应的处理方法,将导致不完整的条件语句的出现,从而综合出了 设计者不希望的组合与时序电路的混合体。

 

 完整的条件语句构成组合电路,不完整的条件语句构成时序电路

3.if语句归纳

1. if语句的一般表述形式

 

第(3)种if语句是一种多重if语句嵌套式条件句,其重要特点为,其任一分支 顺序语句的执行条件是以上各分支所确定条件的相与,即相关条件同时成立。 即语句中顺序语句的执行条件具有向上相与的功能,而有的逻辑设计恰好需要 这种功能,如优先编码器。

 

 设计一个11分频的分频器,要 求输出占空比为50%

  1. module div11x(input clk,input reset_n,output q);
  2. reg [3:0] cnt;
  3. reg x_p,x_n;
  4. always @(posedge clk,negedge reset_n)
  5. if(!reset_n)
  6. cnt <= 0;
  7. else if(cnt < 11-1)
  8. cnt <= cnt + 1'b1;
  9. else
  10. cnt <= 0
  11. always @(posedge clk,negedge reset_n)
  12. if(!reset_n)
  13. x_p <= 0;
  14. else if(cnt < 11/2)
  15. x_p <= 1;
  16. else
  17. x_p <= 0;
  18. always @(negedge clk,negedge reset_n)
  19. if(!reset_n)
  20. x_n <= 0;
  21. else
  22. x_n <= x_p;
  23. assign q = x_p | x_n;
  24. endmodule

4.三态Verilog的描述

 

 (1)当使能控制信号ENA为1时,4位数据输出;为0时输出呈高阻态

(2)Z和普通数值不同,它只能在端口赋值,不能在电路模块中被信号所传递;而且由于Z在 综合中是一个不确定的值,有的情况下不同的综合器可能会给出不同的结果,因而对于 Verilog综合前的行为仿真与综合后的功能仿真结果也可能是不同的。

2. 双向端口设计

由于双向端口在完成输入功能时,必须使 原来呈输出模式的端口呈高阻态,否则待 输入的外部数据势必会与端口处原有电平 发生“线与”,导致无法将外部数据正确 地读入,也就无法实现双向功能

 3. 三态总线控制电路设计

 

 

要设计出能产生独立控制的多通道的三态总线电路结构,必须使用并行语句

例题:根据RTL图写程序、

 

5.双向端口设计 

 

由于双向端口在完成输入功能时,必须使原来呈输出 模式的端口呈高阻态,否则待输入的外部数据势必会 与端口处原有电平发生“线与”,导致无法将外部数 据正确地读入,也就无法实现双向功能。 

右边例子的情况就不同了,其中在else之前的块语句中仅增加了语句 Q<=4’HZ就解决了两个重要的问题: (1)使Q在if语句中有了完整的条件描述,从而克服了时序元件的引入。 (2)在Q履行输入功能时,将其设定为高阻态输出,使Q成为真正的双向 端口

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/101502
推荐阅读
相关标签
  

闽ICP备14008679号