时间:2024-07-30 来源:网络搜集 关于我们 0
FPGA是一个高度集成化的芯片,其学习过程既需要编程,又需要弄懂硬件电路和计算机架构。涉及到的知识和基础非常多,如果不合理地安排学习内容,学习过程会非常漫长和枯燥。这使很多想要学习FPGA小伙伴望而却步。
今天将为大家分享一些FPGA/CPLD 数字电路设计经验,供学习参考,可以识别二维码,私信老师领取。话不多说,正文即将开始。
FPGA 设计中的同步设计
异步设计不是总能满足(它们所馈送的触发器的)建立和保持时间的要求。因此,异步输入常常会把错误的数据锁存到触发器,或者使触发器进入亚稳定的状态,在该状态下,触发器的输出不能识别为 l 或 0。如果没有正确地处理,亚稳性会导致严重的系统可靠性问题。
另外,在 FPGA 的内部资源里最重要的一部分就是其时钟资源(全局时钟网络),它一般是经过 FPGA 的特定全局时钟管脚进入 FPGA 内部,后经过全局时钟 BUF 适配到全局时钟网络的,这样的时钟网络可以保证相同的时钟沿到达芯片内部每一个触发器的延迟时间差异是可以忽略不计的。
在 FPGA 中上述的全局时钟网络被称为时钟树,无论是专业的第三方工具还是器件厂商提供的布局布线器在延时参数提取、分析的时候都是依据全局时钟网络作为计算的基准的。如果一个设计没有使用时钟树提供的时钟,那么这些设计工具有的会拒绝做延时分析有的延时数据将是不可靠的。
在我们日常的设计中很多情形下会用到需要分频的情形,好多人的做法是先用高频时钟计数,然后使用计数器的某一位输出作为工作时钟进行其他的逻辑设计。其实这样的方法是不规范的。比如下面的描述方法:
在上述的第一个 process 电路描述中,首先计数器的输出结果(count(2))相对于全局时钟 clk 已经产生了一定的延时(延时的大小取决于计数器的位数和所选择使用的器件工艺);而在第二个 process 中使用计数器的 bit2 作为时钟,那么 shift_reg 相对于全局clk 的延时将变得不好控制。布局布线器最终给出的时间分析也是不可靠的。这样产生的结果波形仿真如下图所示:
正确的做法可以将第二个 process 这样来写:
process
begin
wait until clk’event and clk=’1’ ;
if count(2 downto 0)=”000” then
shift_reg<=data;
end if;
end process;
或者分成两步来写:
process(count)
begin
if count(2 downto 0)=”000” then
en<=’1’;
else en<=’0’;
end if;
end process;
processbegin wait until clk’event and clk=’1’ ;
if en=’1’ then
shift_reg<=data;
end if;
end process;
这样做是相当于产生了一个 8 分频的使能信号,在使能信号有效的时候将 data 数据采样到shift_reg 寄存器中。但此种情形下 shift_reg 的延时是相对于全局时钟 clk 的。下面的图形更能看得清楚。
更多《FPGA/CPLD 数字电路设计经验分享》可识别下方二维码获取,共计27页。
————————————————