AHB协议理解3--AHB GPIO项目
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长度的数组