用户工具

站点工具


icore4tfpga_11

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore4tfpga_11 [2020/03/05 00:26]
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_ide_1_37.jpg?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采样结果有何不同。 
  
icore4tfpga_11.1583339218.txt.gz · 最后更改: 2020/03/05 00:26 由 zgf