AHB协议理解3--AHBGpio项目

发布时间 2023-07-12 14:30:45作者: 傅红雪a

GPIO的两个重要功能

1.中断生成 2.掩码访问

 

 

1.中断生成--为什么要2个filp-flop同步?

对于sigle bit lever signal(单比特信号),可以用两级flop来同步目标域信号,即俗称的打两拍。

 

2.中断生成--FCLK HCLK的协议时序理解

协议中FCLK的定义是和HCLK相位相同,但是必须运行这个才能产生边缘触发中断。
因此使用FCLK来实现检查中断信号。
代码中的实现:

  logic hclk;
  logic fclk;
  logic rstn;
  initial begin : hclk_gen
    hclk = 0;
    forever #2ns hclk = !hclk;
  end
  initial begin : fclk_gen
    fclk = 0;
    forever @(posedge hclk) fclk = !fclk;//fclk的周期是hclk的周期的两倍
  end

FCLK到HCLK需要用一拍的时间
HCLK和FCLK是同一个phase,所以不需要做同步。
当HCLK跨到FCLK后,由FCLK来做驱动,用FCLK时钟域打一拍
portin利用FCLK做两拍的同步,同步到FCLK的时钟域上面
三个周期符合协议3.5.1的note

 

 3.中断生成--为什么要等中断信息生成后,需要三个周期FCLK以上才能检查到?

协议3.5.1的note中:由于双触发器同步逻辑。中断还有三个周期的延迟。由两个用于输入信号同步的周期和一个用于记录中断状态。
若只给三个周期的,可能出现delta cycle情况,如图所示(portin和gpioint)

 因此如果lvc_driver是下降沿也可以三个周期满足,改lvc vip的driver的采样时序是一种策略,直接延迟4个周期的策略显然更加简便。

 

 4.掩码访问--掩码是什么,作用是什么?

BitMask在计算机学中指的是一串二进制数字,通过与目标数字的按位操作,达到`屏蔽指定位`的目的。BitMask采用数值记录状态,每一个bit有两种取值,即0和1,数值的每一位表示一个状态。使用BitMask可以用很少的资源表达非常丰富的状态。在 Java 中,一個 byte 型的数组,有 8 位(bit),可以表达 8 个不同的状态,而且这些状态并不会相互影响。对于int,则32位,即可以表达32种状态。使用掩码,可以在单个按位操作中将字节,半字节,字等中的多个位设置为打开,关闭或从打开反转为关闭(反之亦然)。

 

//1.状态设定 Status |= mask;
//其他位不管,把第二位变为1即可。
     xxxx xxxx
 OR  0000 0010
  =  xxxx xx1x
//2.状态清除 status &= ~mask;
//其他位不管,把第二位变为0。
    xxxx xxxx
AND 1111 1101
 =  xxxx xx0x 
//3.查询状态  Boolean isOn = (status & mask) > 0;
//通过查询确定第二位是0还是1,和mask进行“与”运算:
//如果为1,返回一个大于零的值,否则返回0。
     xxxx xxxx 
AND  0000 0010
  =  0000 00x0 

 

5.掩码访问--掩码实例解析

 

 

如图中3-7所示为例,GPIOOUT[15:0] = 0x32E8=16'b0011 0010 1110 1000
bit mask为0xC3的含义是置1:0位为1,清除7:6位为0,对于GPIO寄存器写操作来说,写1有效,写0无效,bit mask为0xC3.
而MASKLOWBYTE用于低8位做掩码访问,因此高八位不变,经过掩码操作后,GPIOOUT[15:0] = 0x322B = 16'b0011 0010 0010 1011
在寄存器的相应地址上操作可以写或读来访问掩码操作
注意:MASKLOWBYTE、MASKHIGHBYTE在寄存器模型中是32位的256长度的数组