用户工具

站点工具


icore4tfpga_15

差别

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

到此差别页面的链接

后一修订版
前一修订版
上一修订版 两侧同时换到之后的修订记录
icore4tfpga_15 [2020/02/24 21:04]
zgf 创建
icore4tfpga_15 [2024/04/10 11:09]
zhaowenzhe [五、 实验步骤及实验结果]
行 1: 行 1:
- 
 |  **银杏科技有限公司旗下技术文档发布平台** ​ |||| |  **银杏科技有限公司旗下技术文档发布平台** ​ ||||
 |技术支持电话|**0379-69926675-801**||| |技术支持电话|**0379-69926675-801**|||
 |技术支持邮件|Gingko@vip.163.com||| |技术支持邮件|Gingko@vip.163.com|||
-|技术论坛|http://​www.eeschool.org||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
-|  V1.0  |  ​2019-02-24  ​| ​ gingko ​ |  初次建立 ​ | +|  V1.0  |  ​2020-02-26  ​| ​ gingko ​ |  初次建立 ​ | 
  
-===== 实验十五:有限状态机实验——三段式状态机描述 ​=====+===== 实验十五:PWM输出实验=====
  
 ==== 一、 实验目的与意义 ==== ==== 一、 实验目的与意义 ====
-  - 掌握三段式状态机描述方法。+  - 掌握输出不同PWM原理及方法。
   - 掌握宏定义、参数变量的使用方法。   - 掌握宏定义、参数变量的使用方法。
   - 掌握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开发平台。
   - 电脑一台。   - 电脑一台。
 ==== 三、 实验原理 ==== ==== 三、 实验原理 ====
 +  * PWM全称是Pulse Width Modulation,是脉冲宽度调制缩写。它是通过对脉冲宽度进行调制,等效输出所需要的波形。在PWM波形属性中频率和占空比是两个非常重要的参数。而本实验的主要目的就是通过FPGA的硬件语言描述实现不同频率、占空比的PWM信号输出。
 +  * FPGA产生不同频率不同占空比的的原理是基于计数器实现的,通过对参考时钟进行计数,控制某个信号高低电平输出实现频率和占空比的变化。其实现原理如图15.1所示,通过改变puty的值改变pwm的占空比,通过改变cycle的值改变pwm的频率。
 +{{ :​icore4t:​icore4t_fpga_15_1.png?​direct |}}
  
-  * 状态机是一种设计思想,通常由组合逻辑和寄存器两部分组成。寄存器用于存储状态,组合逻辑完成状态译码和产生输出信号。状态机的组成有3各基本要素:状态、输入和输出。其中状态是用来划分逻辑顺序和时序规律的变量;输入指的是状态机进入每个状态的条件;输出指的是在某种状态下发生的事件。 
-  * 描述状态机关键是要描述清楚状态机的三个要素,即如何进行状态转移、每个状态的输出是什么、状态转移的条件是什么等。在Verilog硬件描述时,状态机有3种常用的描述方法:一段式、二段式和三段式。 
-  * 整个状态机由三个always模块实现,其中一个模块采用同步时序的方式描述状态转移,另一个模块采用组合逻辑的方式判断状态转移条件、描述状态转移规律,最后一个模块描述状态输出。 
-  * 三段式与二段式状态机相比,它能够根据状态转移规律,在上一个状态根据输入条件判断当前状态的输出,从而在不插入额外时钟节拍的前提下实现寄存器输出,弥补二段式状态机的不足。 
-  * 本实验的实验原理是通过硬件语言描述产生一个周期为3s的时间闸门信号,以该信号作为状态转移的触发信号来实现状态跳转,通过状态跳转改变led的亮灭。在其中一个always模块采用同步时序描述状态转移,在另一个模块中判断状态转移条件、描述状态转移的规律,在最后一个模块中描述led输出状态,实现控制led。 
 ==== 四、 代码讲解 ==== ==== 四、 代码讲解 ====
-  * 本实验状态机的主要功能是通过状态切换实现led的闪烁,在state_idle状态,led为灭;程序开始运当3s间闸门打开,状态跳转到state_led_on状态,点亮led;当3s间闸门打开,状态转移信号有效状态跳转到state_led_off状态;当3s间闸门打开状态转移信号有效状态跳转到state_led_on状态,以此循环实现led闪烁。其代码如下:+  * 本实验原理是通过参考时钟进计数并在钟计数器特定刻进行高低电平的变换来改变输出波形的频率和占空比。本实验中参考钟为clk_25m频率控制参数为cycle占空比参数为puty_50和puty_20。频率为500KHz波形计算方公式为:clk_25m/​(cycle-1);​占空比为20%的参数计算公式为:puty_20/​cycle;​ 占空比为50%的参数计算公式为:puty_50/​cycle。其代码如下:
 <code verilog> <code verilog>
-//​控制led亮灭的状态机 +     always@(posedge clk_25m or negedge rst_n)
-//​状态机流程,上电复位后进入空闲状态,然后等待大约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         begin
             if(!rst_n)             if(!rst_n)
                 begin                 begin
-                    ​led_current_state ​<= `state_idle;+                    ​cycle_cnt ​<= 8'​d0;​ 
 +                    pwm20_sig_r <= 1'​d0;​ 
 +                    pwm50_sig_r <= 1'd0;
                 end                 end
             else             else
                 begin                 begin
-                    ​led_current_state <led_next_state;​ +                    ​if(cycle_cnt==cycle-1'​d1)//对计数器清零,同步两个信号相位 
-                end +                        begin 
-        end +                            ​cycle_cnt ​<= 8'd0
-         +                            ​pwm20_sig_r ​<= 1'd1
-//状态输出 +                            ​pwm50_sig_r ​<= 1'd1;
-    ​always@(led_current_state or state_sig or rst_n) +
-        ​begin +
-            ​if(!rst_n) +
-                begin +
-                    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; +
-                                end +
-                            ​else +
-                                begin +
-                                    led_next_state ​<= `state_idle; +
-                                end+
                         end                         end
-                        `state_led_on:​begin +                    else if(cycle_cnt==puty_50-1'​d1)//​变换占空比为50%的波形 
-                            ​if(state_sig+                        begin 
-                                begin +                            ​pwm50_sig_r ​<= 1'd0
-                                    ​led_next_state ​<= `state_led_off; +                            ​cycle_cnt ​<= cycle_cnt + 8'd1;
-                                end +
-                            ​else +
-                                begin +
-                                    led_next_state ​<= `state_led_on; +
-                                end+
                         end                         end
-                        `state_led_off:​begin +                    else if(cycle_cnt==puty_20-1'​d1)//​变换占空比为20%的波形 
-                            ​if(state_sig+                        begin 
-                                begin +                            ​pwm20_sig_r ​<= 1'd0
-                                    ​led_next_state ​<= `state_led_on; +                            ​cycle_cnt ​<= cycle_cnt + 8'd1;
-                                end +
-                            ​else +
-                                begin +
-                                    led_next_state ​<= `state_led_off; +
-                                end+
                         end                         end
-                        default:begin +                    else//​计数器自加 
-                            ​led_next_state ​<= `state_idle;+                        ​begin 
 +                            ​cycle_cnt ​<= cycle_cnt + 8'd1;
                         end                         end
-                    endcase 
                 end                 end
         end         end
- 
-//​逻辑输出 
-    always@(posedge clk_25m or negedge rst_n) 
-        begin 
-            if(!rst_n) 
-                begin 
-                    led_r <= led_off; 
-                end 
-            else 
-                begin 
-                    case(led_next_state) 
-                        `state_idle:​begin 
-                            led_r <= led_off; 
-                        end 
-                        `state_led_on:​begin 
-                            led_r <= led_on; 
-                        end 
-                        `state_led_off:​begin 
-                            led_r <= led_off; 
-                        end 
-                        default:​begin 
-                            led_r <= led_off; 
-                        end 
-                    endcase 
-                end 
         end         end
 </​code>​ </​code>​
 ==== 五、 实验步骤及实验结果 ==== ==== 五、 实验步骤及实验结果 ====
- +{{ :​icore4t:​icore4t_ide_1_37.jpg?​600 |图15.2}} 
-1、将硬件正确连接,如图9.1所示。 +1、将硬件正确连接,如图15.2所示。\\  ​ 
-{{ :​icore4t:​icore4t_fpga_15_1.jpg?​direct |图15.1}} +2、将编写好的代码进行编译,并下载到开发板中;\\  ​ 
- +3、观察实验现象——如图15.3所示。 
-2、将编写好的代码进行编译,并下载到开发板中; +{{ :​icore4t:​icore4t_fpga_15_3.png?​direct |}}
-3、观察实验现象——FPGA_LED闪烁,间隔大约为3s;+
 ==== 六、 拓展实验 ==== ==== 六、 拓展实验 ====
 +1、改变cycle和puty参数,观察信号变化。
  
-  - 通过Signaltap采样状态机跳转信号及状态切换,观察信号变化。 
-  - 通过Signaltap采样对比一段式状态机、二段式状态机和三段式状态机状态跳转时序有何不同。 
  
icore4tfpga_15.txt · 最后更改: 2024/04/10 11:09 由 zhaowenzhe