这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
icore4tfpga_7 [2020/03/02 20:19] zgf 创建 |
icore4tfpga_7 [2024/04/10 11:01] (当前版本) zhaowenzhe [五、 实验步骤及实验结果] |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
- | | V1.0 | 2020-03-02 | gingko | 初次建立 | | + | | V1.0 | 2020-02-20 | gingko | 初次建立 | |
- | ===== 实验七:3-8译码器实验——FPGA实现3-8译码器 ===== | + | ===== 实验七:锁相环实验——锁相环IP核调用 ===== |
==== 一、 实验目的与意义 ==== | ==== 一、 实验目的与意义 ==== | ||
- | - 掌握3-8译码器的原理。 | + | - 掌握锁相环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-8译码器是一种常见的全译码器,输入是3位的二进制代码,共有8种组合,输出是与这8种组合对应的8个输出信号。译码器将每种二进制的代码组合译成对应的一根输出线上的高、低电平信号。其框图如图12.1所示。 | + | * FPGA内部锁相环的工作原理主要是通过调用内部IP核,改变IP核内部分频、倍频及相位差等参数,以此改变输入参考时钟的输出频率和相位,从而达到用户所需要的时钟信号,驱动程序的运行。 |
- | {{ :icore4t:icore4t_fpga_7_1.png?direct |图7.1}} | + | ==== 四、 锁相环IP核调用步骤 ==== |
- | * 根据3-8译码器的逻辑功能可知其逻辑真值表如表7.1所示。 | + | 1、新建一个工程名为pll的工程,然后点击Tool ->Megawizard Plug-In Manager,如图7.1所示。 |
- | * **表7.1 3-8译码器逻辑真值表** | + | {{ :icore4t:icore4t_fpga_11_1.png?direct |图7.1}} |
- | | 输入 ||| 输出 |||||||| | + | 2、在该对话框选择新建IP核,如图7.2所示。 |
- | |a2 |a1 |a0 |y7 |y6 |y5 |y4 |y3 |y2 |y1 |y0| | + | {{ :icore4t:icore4t_fpga_11_2.png?direct |图7.2}} |
- | |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1| | + | |
- | |0 |0 |1 |0 |0 |0 |0 |0 |0 |1 |0| | + | |
- | |0 |1 |0 |0 |0 |0 |0 |0 |1 |0 |0| | + | |
- | |0 |1 |1 |0 |0 |0 |0 |1 |0 |0 |0| | + | |
- | |1 |0 |0 |0 |0 |0 |1 |0 |0 |0 |0| | + | |
- | |1 |0 |1 |0 |0 |1 |0 |0 |0 |0 |0| | + | |
- | |1 |1 |0 |0 |1 |0 |0 |0 |0 |0 |0| | + | |
- | |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 |0| | + | |
- | ==== 四、 代码讲解 ==== | + | |
- | * 本实验首先通过内部程序自身产生输入信号a,并设置一个20us的定时器根据编码器的工作原理依次切换输入信号的值;然后通过状态机根据逻辑真值表将输入信号译码成对应的输出信号,改变8根输出线上的高低电平。其代码如下: | + | 3、在此对话框选择新建IP核类型、生成的硬件描述语言、IP核文件的存储位置,如图7.3所示。 |
- | <code verilog> | + | {{ :icore4t:icore4t_fpga_11_3.png?direct |图7.3}} |
- | /*************************************************/ | + | |
- | //利用状态机实现3-8译码器的输出信号,输出译码信号与真值表一致 | + | |
- | reg [7:00]y_r; | + | |
- | + | ||
- | always@(posedge clk_25m or negedge rst_n) | + | |
- | begin | + | |
- | if(!rst_n) | + | |
- | begin | + | |
- | y_r <= 8'b000000000; | + | |
- | end | + | |
- | else | + | |
- | begin | + | |
- | case(a) | + | |
- | 3'b000:begin | + | |
- | y_r <= 8'b00000001; | + | |
- | end | + | |
- | 3'b001:begin | + | |
- | y_r <= 8'b00000010; | + | |
- | end | + | |
- | 3'b010:begin | + | |
- | y_r <= 8'b00000100; | + | |
- | end | + | |
- | 3'b011:begin | + | |
- | y_r <= 8'b00001000; | + | |
- | end | + | |
- | 3'b100:begin | + | |
- | y_r <= 8'b00010000; | + | |
- | end | + | |
- | 3'b101:begin | + | |
- | y_r <= 8'b00100000; | + | |
- | end | + | |
- | 3'b110:begin | + | |
- | y_r <= 8'b01000000; | + | |
- | end | + | |
- | 3'b111:begin | + | |
- | y_r <= 8'b10000000; | + | |
- | end | + | |
- | default:begin | + | |
- | y_r <= 8'b000000000; | + | |
- | end | + | |
- | endcase | + | |
- | end | + | |
- | end | + | |
- | assign y = y_r; | + | 4、在此对话框中设置速度等级和输入时钟大小,设备芯片的速度等级是8,输入参考时钟是25MHz,如图7.4所示。 |
- | </code> | + | {{ :icore4t:icore4t_fpga_11_4.png?direct |图7.4}} |
- | ==== 五、 实验步骤及实验结果 ==== | + | |
- | 1、将硬件正确连接,如图7.2所示。 | + | 5、添加时钟复位信号和时钟锁,两个都是非必须信号,一般不需要添加,如图7.5所示。 |
- | {{ :icore4t:icore4t_fpga_7_2.jpg?direct |图7.2}} | + | {{ :icore4t:icore4t_fpga_11_5.png?direct |图7.5}} |
+ | |||
+ | 6、该对话框直接默认设置即可,如图7.6所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_6.png?direct |图7.6}} | ||
+ | |||
+ | 7、该对话框直接默认设置即可,如图7.7所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_7.png?direct |图7.7}} | ||
+ | |||
+ | 8、该对话框直接默认设置即可,如图7.8所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_8.png?direct |图7.8}} | ||
+ | |||
+ | 9、设置第一个输出时钟100MHz,由25MHz输入时钟进行4倍频得到的,输出时钟相位差为0,占空比为50%,设置参数如图7.9所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_9.png?direct |图7.9}} | ||
+ | |||
+ | 10、输出第二路时钟信号50MHz,设置参数如图7.10所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_10.png?direct |图7.10}} | ||
+ | |||
+ | 11、输出第三路时钟信号25MHz,设置参数如图7.11所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_11.png?direct |图7.11}} | ||
+ | |||
+ | 12、输出第四路时钟信号12.5MHz,设置参数如图7.12所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_12.png?direct |图7.12}} | ||
+ | |||
+ | 13、输出第五路时钟信号6.25MHz,设置参数如图7.13所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_13.png?direct |图7.13}} | ||
+ | |||
+ | 14、在该对话框一般默认设置即可,如图7.14所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_14.png?direct |图7.14}} | ||
+ | |||
+ | 15、选择要生成的IP核文件信息,一般默认即可,如图7.15所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_15.png?direct |图7.15}} | ||
+ | |||
+ | 16、点击Finish后弹出该对话框,在此一定选择Yes,如图7.16所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_16.png?direct |图7.16}} | ||
+ | |||
+ | 17、在工程中新建pll.v文件,并对锁相环IP核进行例化,如图7.17所示。 | ||
+ | {{ :icore4t:icore4t_fpga_11_17.png?direct |图7.17}} | ||
+ | |||
+ | 18、程序编写完成后进行编译即可,此时锁相环调用完成。 | ||
+ | ==== 五、 实验步骤及实验结果 ==== | ||
- | 2、将编写好的代码进行编译,并下载到开发板中; | + | 1、将硬件正确连接,如图7.18所示。 |
- | 3、通过Signaltap工具查看输入信号与输出信号之间的关系,观察实验现象——如图7.3所示。 | + | {{ :icore4t:icore4t_ide_1_37.jpg?600 |图7.18}} |
- | {{ :icore4t:icore4t_fpga_7_3.png?direct |图7.3}} | + | |
+ | 2、将编写好的代码进行编译;\\ | ||
+ | 3、以100MHz时钟作为采样时钟,对其他所有输出时钟信号进行采样;\\ | ||
+ | 4、观察其实验结果,如图7.19所示。\\ | ||
+ | {{ :icore4t:icore4t_fpga_11_19.png?direct |图7.19}} | ||
==== 六、 拓展实验 ==== | ==== 六、 拓展实验 ==== | ||
- | - 设计一个部分译码器(如:4-10译码器),观察信号变化。 | + | - 思考为什么6.25MHz输出时钟的相位与其他相位不一样; |
+ | - 更改相位核占空比,观察Signaltap采样结果有何不同。 | ||