这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 上一修订版 两侧同时换到之后的修订记录 | ||
icore4tfpga_11 [2020/03/05 00:23] zgf 创建 |
icore4tfpga_11 [2024/04/10 11:05] zhaowenzhe |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
- | | V1.0 | 2020-02-20 | gingko | 初次建立 | | + | | V1.0 | 2019-02-24 | gingko | 初次建立 | |
- | ===== 实验:锁相环实验——锁相环IP核调用 ===== | + | |
+ | ===== 实验十一:有限状态机实验——二段式状态机描述 ===== | ||
==== 一、 实验目的与意义 ==== | ==== 一、 实验目的与意义 ==== | ||
- | - 掌握锁相环IP核的调用方法。 | + | - 掌握二段式状态机的描述方法 |
- | - 掌握QuartusII的使用方法。 | + | - 掌握宏定义、参数变量的使用方法 |
+ | - 掌握QuartusII的使用方法 | ||
==== 二、 实验设备及平台 ==== | ==== 二、 实验设备及平台 ==== | ||
- | - iCore4T 双核心板。[[https://item.taobao.com/item.htm?spm=a1z10.1-c.w137644-251734891.3.5923532fDrMDOe&id=610595120319|点击购买]] | + | - iCore4T 双核心板。 |
- | - Blaster(或相同功能)仿真器。[[https://item.taobao.com/item.htm?id=554869837940|点击购买]] | + | - iTool A(或相同功能)仿真器。 |
- | - Micro USB线缆。 | + | - USB Type C 线缆。 |
- Keil MDK 开发平台。 | - Keil MDK 开发平台。 | ||
- Quartus开发平台。 | - Quartus开发平台。 | ||
- | - 电脑一台 | + | - 电脑一台。 |
==== 三、 实验原理 ==== | ==== 三、 实验原理 ==== | ||
- | * 锁相环全称是锁相环路,是一种反馈控制电路,其主要特点是利用外部输入的参考信号控制环路内部振荡信号和相位。锁相环通常由鉴相器、环路滤波器和压控震荡器三部分组成。 | + | * 状态机是一种设计思想,通常由组合逻辑和寄存器两部分组成。寄存器用于存储状态,组合逻辑完成状态译码和产生输出信号。状态机的组成有3各基本要素:状态、输入和输出。其中状态是用来划分逻辑顺序和时序规律的变量;输入指的是状态机进入每个状态的条件;输出指的是在某种状态下发生的事件。 |
- | * FPGA内部锁相环的工作原理主要是通过调用内部IP核,改变IP核内部分频、倍频及相位差等参数,以此改变输入参考时钟的输出频率和相位,从而达到用户所需要的时钟信号,驱动程序的运行。 | + | * 描述状态机关键是要描述清楚状态机的三个要素,即如何进行状态转移、每个状态的输出是什么、状态转移的条件是什么等。在Verilog硬件描述时,状态机有3种常用的描述方法:一段式、二段式和三段式。 |
- | ==== 四、 锁相环IP核调用步骤 ==== | + | * 二段式状态机的整个功能由两个模块完成,一个always模块采用同步时序的方法描述状态转移,另一个模块采用组合逻辑的方式判断状态转移条件,描述状态转移规律,两者结合功能完成状态机功能。 |
- | + | * 二段式与一段式状态机相比,将同步时序和组合逻辑分别放在不同的always模块中,不仅便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线实现设计。在二段式描述中,常采用组合逻辑描述状态的输出,这种组合逻辑有产生毛刺的可能性,且不利于约束,这也是二段式描述的缺点。 | |
- | 1、新建一个工程名为pll的工程,然后点击Tool ->Megawizard Plug-In Manager,如图11.1所示。 | + | * 本实验的实验原理是通过硬件语言描述产生一个周期为3s的时间闸门信号,以该信号作为状态转移的触发信号来实现状态跳转,通过状态跳转改变led的亮灭。在其中一个always模块采用同步时序描述状态转移,在另一个模块中判断状态转移条件、描述状态转移的规律和输出,实现控制led的状态。 |
- | {{ :icore4t:icore4t_fpga_11_1.png?direct |图11.1}} | + | ==== 四、 代码讲解 ==== |
- | + | ||
- | 2、在该对话框选择新建IP核,如图11.2所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_2.png?direct |图11.2}} | + | |
- | + | ||
- | 3、在此对话框选择新建IP核类型、生成的硬件描述语言、IP核文件的存储位置,如图11.3所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_3.png?direct |图11.3}} | + | |
- | + | ||
- | 4、在此对话框中设置速度等级和输入时钟大小,设备芯片的速度等级是8,输入参考时钟是25MHz,如图11.4所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_4.png?direct |图11.4}} | + | |
- | + | ||
- | 5、添加时钟复位信号和时钟锁,两个都是非必须信号,一般不需要添加,如图11.5所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_5.png?direct |图11.5}} | + | |
- | + | ||
- | 6、该对话框直接默认设置即可,如图11.6所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_6.png?direct |图11.6}} | + | |
- | + | ||
- | 7、该对话框直接默认设置即可,如图11.7所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_7.png?direct |图11.7}} | + | |
- | + | ||
- | 8、该对话框直接默认设置即可,如图11.8所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_8.png?direct |图11.8}} | + | |
- | + | ||
- | 9、设置第一个输出时钟100MHz,由25MHz输入时钟进行4倍频得到的,输出时钟相位差为0,占空比为50%,设置参数如图11.9所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_9.png?direct |图11.9}} | + | |
- | + | ||
- | 10、输出第二路时钟信号50MHz,设置参数如图11.10所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_10.png?direct |图11.10}} | + | |
- | + | ||
- | 11、输出第三路时钟信号25MHz,设置参数如图11.11所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_11.png?direct |图11.11}} | + | |
- | + | ||
- | 12、输出第四路时钟信号12.5MHz,设置参数如图11.12所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_12.png?direct |图11.12}} | + | |
- | + | ||
- | 13、输出第五路时钟信号6.25MHz,设置参数如图11.13所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_13.png?direct |图11.13}} | + | |
- | + | ||
- | 14、在该对话框一般默认设置即可,如图11.14所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_14.png?direct |图11.14}} | + | |
- | 15、选择要生成的IP核文件信息,一般默认即可,如图11.15所示。 | + | * 本实验状态机的主要功能是通过状态切换实现led的闪烁,在state_idle状态,led为灭;程序开始运行后,当3s时间闸门打开,状态跳转到state_led_on状态,点亮led;当3s时间闸门打开,状态转移信号有效,状态跳转到state_led_off状态;当3s时间闸门打开,状态转移信号有效,状态跳转到state_led_on状态,以此循环实现led的闪烁。其代码如下: |
- | {{ :icore4t:icore4t_fpga_11_15.png?direct |图11.15}} | + | <code verilog> |
+ | //控制led亮灭的状态机 | ||
+ | //状态机流程,上电复位后进入空闲状态,然后等待大约3s时间闸门打开时进入点亮led状态,当检测到时间 | ||
+ | //闸门信号的高电平时,将状态切换至熄灭led状态,再次检测到时间闸门时切换至亮状态,如此循环。 | ||
+ | reg led_r; | ||
+ | reg [2:0]led_current_state;//当前状态 | ||
+ | reg [2:0]led_next_state;//下一个状态 | ||
+ | |||
+ | //状态跳转逻辑设计always块 | ||
+ | always@(posedge clk_25m or negedge rst_n) | ||
+ | begin | ||
+ | if(!rst_n) | ||
+ | begin | ||
+ | led_current_state <= `state_idle; | ||
+ | end | ||
+ | else | ||
+ | begin | ||
+ | led_current_state <= led_next_state; | ||
+ | end | ||
+ | end | ||
+ | |||
+ | //状态逻辑输出 | ||
+ | always@(led_current_state or state_sig or rst_n) | ||
+ | begin | ||
+ | if(!rst_n) | ||
+ | begin | ||
+ | led_r <= led_off; | ||
+ | led_next_state <= `state_idle; | ||
+ | end | ||
+ | else | ||
+ | begin | ||
+ | case(led_current_state) | ||
+ | `state_idle:begin | ||
+ | if(state_sig) | ||
+ | begin | ||
+ | led_next_state <= `state_led_on; | ||
+ | led_r <= led_on; | ||
+ | end | ||
+ | else | ||
+ | begin | ||
+ | led_next_state <= `state_idle; | ||
+ | end | ||
+ | end | ||
+ | `state_led_on:begin | ||
+ | if(state_sig) | ||
+ | begin | ||
+ | led_next_state <= `state_led_off; | ||
+ | led_r <= led_off; | ||
+ | end | ||
+ | else | ||
+ | begin | ||
+ | led_next_state <= `state_led_on; | ||
+ | end | ||
+ | end | ||
+ | `state_led_off:begin | ||
+ | if(state_sig) | ||
+ | begin | ||
+ | led_next_state <= `state_led_on; | ||
+ | led_r <= led_on; | ||
+ | end | ||
+ | else | ||
+ | begin | ||
+ | led_next_state <= `state_led_off; | ||
+ | end | ||
+ | end | ||
+ | endcase | ||
+ | end | ||
+ | end | ||
+ | </code> | ||
+ | ==== 五、 实验步骤及实验结果 ==== | ||
+ | {{ :icore4t:icore4t_fpga_14_1.jpg?direct&600 |图11.1}} | ||
- | 16、点击Finish后弹出该对话框,在此一定选择Yes,如图11.16所示。 | + | - 将硬件正确连接,如图11.1所示。 |
- | {{ :icore4t:icore4t_fpga_11_16.png?direct |图11.16}} | + | - 将编写好的代码进行编译,并下载到开发板中; |
- | + | - 观察实验现象——FPGA_LED闪烁,间隔大约为3s; | |
- | 17、在工程中新建pll.v文件,并对锁相环IP核进行例化,如图11.17所示。 | + | ==== 六、 拓展实验 ==== |
- | {{ :icore4t:icore4t_fpga_11_17.png?direct |图11.17}} | + | |
- | 18、程序编写完成后进行编译即可,此时锁相环调用完成。 | + | - 通过Signaltap采样状态机跳转信号及状态切换,观察信号变化。 |
- | 五、 实验步骤及实验结果 | + | - 对比一段式状态机和二段式状态机状态跳转时序有何不同。 |
- | 1、将硬件正确连接,如图11.18所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_18.jpg?direct |图11.18}} | + | |
- | + | ||
- | 2、将编写好的代码进行编译; | + | |
- | 3、以100MHz时钟作为采样时钟,对其他所有输出时钟信号进行采样; | + | |
- | 4、观察其实验结果,如图11.19所示。 | + | |
- | {{ :icore4t:icore4t_fpga_11_19.png?direct |图11.19}} | + | |
- | 六、 拓展实验 | ||
- | - 思考为什么6.25MHz输出时钟的相位与其他相位不一样; | ||
- | - 更改相位核占空比,观察Signaltap采样结果有何不同。 | ||