关于阻塞式赋值和非阻塞式赋值

这两种赋值方式都用在always块中。不同点:

  1. 阻塞式赋值,是真正的按行执行,格式“a = b;”

  2. 非阻塞式赋值,执行中只要右边表达式计算完成即给左边“赋值”,格式“a <= b;”

    1. 举例:

      always @ (posedge clk) begin
      	a <= 1'b1;
      	b <= 1'b0;
      	c <= a + 1'b0;
      	d <= b + 1'b1;
      	e <= c + d;
      end
      

      赋值顺序为:

      {
      	a <= 1;
      	b <= 0;
      }, {
      	c <= 1 + 0;
      	d <= 0 + 1;
      }, {
      	e <= 1 + 1;
      }
      
  3. 电路分类

    1. 时序电路

      是有状态的电路,需要运行时间,输出和输入以及时间有关。

      特征/特性有:

      1. 敏感列表中只涉及始终时钟,可以有上升沿/下降沿
      2. 赋值只使用非阻塞式赋值
    2. 组合电路

      没有状态的电路,输出只和输入有关,是映射关系。

      特性/特征:

      1. 敏感列表中涉及的是输入,没有时钟
      2. 赋值只使用阻塞式赋值
  4. 基本总结:

    1. 时序电路用非阻塞式赋值“<=”
    2. 组合电路用阻塞式赋值“=”
    3. 不能混用

防止锁存器问题

  1. 问题的产生:组合电路中没有完全改变状态到新的状态,导致状态机下一步状态可能不确定。
  2. 举例:

Xilinx FPGA开发流程

  1. 建立项目
    1. 选定位置和名字
    2. 选定芯片
      1. 7020: xc7z020clg400-2
      2. 7010: xc7z010clg400-1
    3. 添加约束文件
    4. 添加设计源代码
  2. 编辑约束文件
  3. 编辑设计源代码
  4. 运行:综合
  5. 运行:实现
  6. 生成:比特流
  7. 烧写:写入比特流

ZYNQ开发流程

  1. 建立项目
    1. 选定位置和名字
    2. 选定芯片
      1. 7020: xc7z020clg400-2
      2. 7010: xc7z010clg400-1
    3. 添加约束文件
    4. 添加设计源代码
  2. 编辑约束文件