一、以一小段时钟模块代码为例,说明一下RTL图如何查看,代码如下:
--1s时钟模块
Module_1Hz : process(clk)
begin
if(clk'event and clk='1')then
if(cnt_50MHz=49999999)then
cnt_50MHz<=0;
else
cnt_50MHz<=cnt_50MHz+1;
end if;
if(cnt_50MHz<=24999999)then
clk1Hz<=1;
else
clk1Hz<=0;
end if;
end if;
end process module_1Hz;
输入时钟clk=50MHz,通过一个cnt_50MHz=49999999的计数来实现1Hz的粗时钟输出。
对应的RTL如下:
二、解释RTL图之前,首先说一下RTL图例,在Quartus软件的Help文件中可以查到部分解释:
三、我们来详细了解一下RTL图例与代码的对应关系
这是一个锁存器,这个锁存器的作用就是当clk上升沿到来时,Q<=D。此处的D就是代码中的cnt_50MHz.
这个锁存器是26位的,不是一位的,注意cnt_50MHz[25..0]。右单击这个锁存器图示,点击Properties,在左侧窗口可以看到:
因为时钟源50MHz对应的计数值49999999,其二进制位数为26位,对应的十六进制是
然后,我们在说一下锁存器前面三个图例:
Add0: OUT=A+B 其中B[25..0]是一个常量 26'h1 ,B[25..0]=1 。(26'h1表示二进制位数是26位的,h1表示用16进制数 1,因为大的数全部用二进制数写出来,不方便查看)。此处相当于代码中的cnt_50MHz<=cnt_50MHz+1. 图例中的1'h0可能表示初始值为0吧。
Equal0: 当A==B时,OUT=1;当A!=B时,OUT=0。B[25..0]的上限就是49999999,即16进制数2FAF07F。
cnt_50MHz~[25..0] :这是一个选择器,当Equal0的out=0时,选择0对应的数据。当Equal0的out=1时,选择1对应的26'h0,就是将cnt_50MHz重新赋值为0.
这三个图例就是实现了如下逻辑:
if(cnt_50MHz=49999999)then
cnt_50MHz<=0;
else
cnt_50MHz<=cnt_50MHz+1;
end if;
1Hz的时钟如下:
对应的代码:
if(cnt_50MHz<=24999999)then
clk1Hz<=1;
else
clk1Hz<=0;
end if;
图例LessThan0中的 1'h1 CIN 应该表示 out的初始值为1.这是因为cnt_50MHz小于24999999的时候,clk1hz一直是高。
以上有问题的地方,请留言指正。