这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 上一修订版 两侧同时换到之后的修订记录 | ||
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采样对比一段式状态机、二段式状态机和三段式状态机状态跳转时序有何不同。 | ||