在FPGA设计中,我们习惯了在always语句中使用非阻塞语句来实现时序逻辑或者组合逻辑。但是在实际工程中,有一类设计与众不同,必须要用阻塞语句来实现某种功能。大家可能好奇,请带着疑问向下看。
在算法中,大家听说过并且实践过一种常见算法,冒泡排序法,下面打算用这个冒泡排序法来颠覆大家的认知。假定有5个输入的数据,在工作时钟为10ns的频率下,要找出最小的一个并输出,这就是我们要实现的功能。先看部分代码截图如下:先看图1激励文件
图1:激励文件
第1种实现方式:参看代码截图2a
图2a:第1种实现方式的代码截图
对应图2a的代码仿真结果参见截图2b
图2b: 对应截图2a代码的仿真结果
第2种实现方式:参看代码截图3a
图3a:第2种实现方式的代码截图
对应图3a的代码仿真结果参见截图3b
图3b: 对应截图3a代码的仿真结果
结果分析:仔细对比两种实现方式的截图和仿真结果,可以发现第2种实现方式是对的。为什么呢?
我们分析一下,冒泡排序的核心思想是,先找到第一个数据和默认的一个数据比较,如果该数据比默认的小,那么最小数据指向该数据,这里要求数据立即更新,同理,第二个数据和第一次找到的最小数据比较,找到后,也要求立即更新这个最小数据,依次类推。我们发现,用FPGA来实现这个冒泡排序,要求变量具有立即更新,而且有保存的功能,结合这两点我们不难发现在always语句必须使用阻塞语句的原因了。
还有的同事认为第二种实现方式也不对,语句除了第一个if不用else后,后面的if前都要加esle,大家可以自己仿真一下,能否加这个else?
本仿真实例虽然简单,仔细阅读可以加深对阻塞和非阻塞语句的理解。