FPGA基础知识一(功能仿真与时序仿真)

功能仿真也被称作 RTL 级行为仿真,前仿真,目的是分析设计电路逻辑关系的正确性。缺点:不带有任何的门延时、线延时等等,只是理想情况下的仿真。优点: 仿真速度快,可以根据需要观察电路输入输出端口和电路内部任一信号和寄存器的波形

时序仿真使用布局布线后器件给出的模块和连线的延时信息, 在最坏的情况下对电路的行为作出实际地估价。时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的;惟一的差别是为时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时, 并且在仿真结果波形图中,时序仿真后的信号加载了时延, 而功能仿真没有

下面用QuartusII13.1和Modelsim-Altera来举例说明一下

 1. 代码比较简单,就是一个二选一的程序

2. 下面是对代码进行一个简单的仿真,代码比较简单

3. 功能仿真的话,不需要全编译,只需综合一下即可,然后我们打开Modelsim软件,在这里我是用的Modelsim-Altera联合仿真,可以直接在QuartusII直接打开Modelsim

如图所示,RTL仿真就是功能仿真,也叫前仿真

4. 打开Modelsim,我们把光标在仿真波形界面点一下,在点一下自动收缩,我们可以看到,仿真的结果和我们所设计的是一致的,证明我们的逻辑是OK的

5. 关闭仿真软件,下面我们看一下时序仿真,仿真之前我们要进行一下全编译,布局布线

点击RTL仿真下面的选项,同样的,我们自动收缩一下

6. 对比前仿真和后仿真,我们可以清晰的看到,两个波形是不一样的,那是因为前仿真是完全理想情况下的仿真,它不考虑你实际的器件,延时,等实际的影响,所以用来验证代码逻辑是可行的,但是后仿真是模拟实际的电路延时,在最坏的情况下对电路的行为以及布局布线作出实际地估价,所以我们看到的波形有明显的时延

7. 由此可知,仿真对于我们整个工程来说是至关重要的,它能快速,有效的去帮你查找代码逻辑上的错误,还能以最坏的情况去分析代码的可靠性,实际上,Quartus比起VIVADO的综合速度还是较快的,所以前仿真的效率还是可以的

为了实现三个线程循环打印ABC,可以使用Synchronized同步方法和Object的wait()和notify()方法。首先,创建三个线程A、B、C,并设置它们的打印次数为10。然后,通过使用三个对象锁a、b、c来控制线程的执行顺序。A线程首先获得c对象锁,打印A后释放c对象锁,并通过notify()方法唤醒B线程。B线程等待a对象锁,获取到a对象锁后打印B,并释放a对象锁,然后通过notify()方法唤醒C线程。C线程等待b对象锁,获取到b对象锁后打印C,并释放b对象锁,并通过notify()方法唤醒A线程。这样就实现了三个线程循环打印ABC的需求。 以下是一个示例代码: ```java class PrintThread implements Runnable { private static final Object a = new Object(); private static final Object b = new Object(); private static final Object c = new Object(); private String name; public PrintThread(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 10; i++) { synchronized (name) { try { switch (name) { case "A": synchronized (c) { System.out.print("A"); c.notify(); } name.wait(); break; case "B": synchronized (a) { System.out.print("B"); a.notify(); } name.wait(); break; case "C": synchronized (b) { System.out.print("C"); b.notify(); } name.wait(); break; } } catch (InterruptedException e) { e.printStackTrace(); } } } } } public class Main { public static void main(String[] args) { Thread threadA = new Thread(new PrintThread("A")); Thread threadB = new Thread(new PrintThread("B")); Thread threadC = new Thread(new PrintThread("C")); threadA.start(); threadB.start(); threadC.start(); } } ``` 通过以上代码,三个线程将按照ABCABCABC的顺序循环打印10次。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [多线程交替打印ABC的多种实现方法](https://blog.csdn.net/xiaokang123456kao/article/details/77331878)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [三个线程轮流打印ABC](https://blog.csdn.net/yu1336199790/article/details/118725454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值