always和assign的物理含义

Posted on 2024-03-29 23:05  绿叶落秋风  阅读(7)  评论(0编辑  收藏  举报

模型功能

  • always实现时序逻辑
  • assign实现组合逻辑
  • 两者共同构成数字系统

模型框图

reg  r_A;
wire w_A;
always@(posedge clk)
begin
  if(!i_rst_n)
  begin
    r_A <= 1'b0;
  end 
  else 
  begin
    r_A <= ~r_A;
  end 
end
assign w_A = r_A;

实现步骤

  1. always的电路描述
  • always@(posedge clk)实现触发器FF(也可以作为锁存器,但是FPGA内很少见)
    • 触发器的复位包括三种:同步复位、异步复位、时钟使能(本人按照作用进行划分,非传统复位)
      • 同步复位不需要将复位加入到敏感列表
      • 异步复位则需要加入
      • 时钟使能则是需要将值进行保持
    • 之所以将前面三种模式联合,是因为这三种信号共同组成了control sets
    • 对于FPGA来说,相近的逻辑使用相同的control sets可以提高资源利用率
    • 所以always描述应当尽可能保持一致,以降低资源浪费
  • always@(*)实现的是组合逻辑,一般用于希望使用case的组合逻辑
  1. assign的简单使用
  • 将wire信号和其他信号关联,实现复杂的线逻辑
  • assign形成的硬件包含了所有的组合逻辑
    • 高低电平转化
    • DUT逻辑
    • 比较器
  1. always和generate的综合使用
  • always也可以在generate内形成级联逻辑
  • 具体的用法可以见前一章的reg级联中的示例
  • 本章需要解释的是always级联后的硬件意义
    • always级联时,依旧遵循module类似的原则
      • 相同位宽进行复制、不同位宽进行补位
    • 其底层的硬件逻辑是先构建一定数量的FF
    • 然后按照原则将所有的端口进行级联
  • 最终,该级联会形成一个可以调整的逻辑组,用于实现一些复杂的逻辑
parameter STR = "hello";
reg [7:0] r_string [0:9-1];
generate genvar i;
for(i = 0; i < 9; i = i + 1)
begin: FOR_9
  always@(posedge clk)
  begin
       r_string[i] <= STR[8*(i+1)-1:8*i];
  end 
end 
endgenerate
  • 上图是一个简单的将字符串缓存到二维变量的例子
  • 如果加入一些判断条件,就可以进行字符串的遍历
  • 更加重要的时,for里面可以在进行for,实现快速的bit位寻找
  • 比如找出128'h00010023000340中的最高位
  • 使用for可以得到极其简易的代码,且方便修改

最终效果

调用接口