这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
icore4tfpga_13 [2020/03/17 14:43] zgf 移除 |
icore4tfpga_13 [2024/04/10 10:56] (当前版本) 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-1 | gingko | 初次建立 | | + | | V1.0 | 2020-03-02 | gingko | 初次建立 | |
- | ===== 实验十三:有限状态机实验——一段式状态机描述 ===== | + | |
+ | ===== 实验十三:3-8译码器实验——FPGA实现3-8译码器 ===== | ||
==== 一、 实验目的与意义 ==== | ==== 一、 实验目的与意义 ==== | ||
- | - 掌握一段式状态机的描述方法。 | + | |
- | - 掌握宏定义、参数变量的使用方法。 | + | - 掌握3-8译码器的原理。 |
+ | - 掌握状态机的使用方法。 | ||
- 掌握QuartusII的使用方法。 | - 掌握QuartusII的使用方法。 | ||
==== 二、 实验设备及平台 ==== | ==== 二、 实验设备及平台 ==== | ||
- | - iCore4T 双核心板。[[https://item.taobao.com/item.htm?spm=a1z10.1-c.w137644-251734891.3.5923532fDrMDOe&id=610595120319|点击购买]] | + | |
- | - Blaster(或相同功能)仿真器。[[https://item.taobao.com/item.htm?id=554869837940|点击购买]] | + | - iCore4T 双核心板。 |
- | - Micro USB线缆。 | + | - iTool A(或相同功能)仿真器。 |
+ | - USB Type C线缆。 | ||
- Keil MDK 开发平台。 | - Keil MDK 开发平台。 | ||
- Quartus开发平台。 | - Quartus开发平台。 | ||
行 21: | 行 22: | ||
==== 三、 实验原理 ==== | ==== 三、 实验原理 ==== | ||
- | * 状态机是一种设计思想,通常由组合逻辑和寄存器两部分组成。寄存器用于存储状态,组合逻辑完成状态译码和产生输出信号。状态机的组成有3各基本要素:状态、输入和输出。其中状态是用来划分逻辑顺序和时序规律的变量;输入指的是状态机进入每个状态的条件;输出指的是在某种状态下发生的事件。 | + | * 译码器的逻辑功能是将每个输入的二进制代码译成对应的输出高、低电平信号或另一个代码。译码是编码的反操作。根据输入和输出信号数量的关系译码器分为全译码器和部分译码器两类。 |
- | * 描述状态机关键是要描述清楚状态机的三个要素,即如何进行状态转移、每个状态的输出是什么、状态转移的条件是什么等。在Verilog硬件描述时,状态机有3种常用的描述方法:一段式、二段式和三段式。 | + | * 3-8译码器是一种常见的全译码器,输入是3位的二进制代码,共有8种组合,输出是与这8种组合对应的8个输出信号。译码器将每种二进制的代码组合译成对应的一根输出线上的高、低电平信号。其框图如图13.1所示。 |
- | * 一段式描述方法是将状态转移的组合逻辑和状态寄存器转移的时序逻辑写在一个always模块中。这种描述方法不符合Verilog将时序和组合逻辑分开描述的代码风格,且整个代码不够清晰,不利于代码维护和升级,同时,不利于附加约束,不利于设计的综合和布局布线。 | + | {{ :icore4t:icore4t_fpga_7_1.png?direct |图13.1}} |
- | * 本实验的实验原理是通过硬件语言描述产生一个周期为3s的时间闸门信号,以该信号作为状态转移的触发信号来实现状态跳转,通过状态跳转改变led的亮灭。 | + | |
+ | * 根据3-8译码器的逻辑功能可知其逻辑真值表如表13.1所示。 | ||
+ | * **表13.1 3-8译码器逻辑真值表** | ||
+ | |||
+ | | 输入 ||| 输出 |||||||| | ||
+ | |a2 |a1 |a0 |y7 |y6 |y5 |y4 |y3 |y2 |y1 |y0| | ||
+ | |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| | ||
==== 四、 代码讲解 ==== | ==== 四、 代码讲解 ==== | ||
- | * 本实验状态机的主要功能是通过状态切换实现led的闪烁,在state_idle状态,led为灭;程序开始运行后,自动跳转到state_led_on状态,点亮led;当3s时间闸门打开,状态转移信号有效,状态跳转到state_led_off状态;当3s时间闸门打开,状态转移信号有效,状态跳转到state_led_on状态,以此循环实现led的闪烁。其代码如下: | + | |
+ | * 本实验首先通过内部程序自身产生输入信号a,并设置一个20us的定时器根据编码器的工作原理依次切换输入信号的值;然后通过状态机根据逻辑真值表将输入信号译码成对应的输出信号,改变8根输出线上的高低电平。其代码如下: | ||
<code verilog> | <code verilog> | ||
- | //控制led亮灭的状态机 | + | /*************************************************/ |
- | //状态机流程,上电复位后进入空闲状态,然后自动进入点亮led状态,当检测到时间闸门信号 | + | //利用状态机实现3-8译码器的输出信号,输出译码信号与真值表一致 |
- | //的高电平时,将状态切换至熄灭led状态,再次检测到时间闸门时切换至亮状态,如此循环。 | + | reg [7:00]y_r; |
- | reg led_r; | + | |
- | reg [2:0]led_state; | + | |
| | ||
always@(posedge clk_25m or negedge rst_n) | always@(posedge clk_25m or negedge rst_n) | ||
行 38: | 行 51: | ||
if(!rst_n) | if(!rst_n) | ||
begin | begin | ||
- | led_r <= led_off; | + | y_r <= 8'b000000000; |
- | led_state <= `state_idle; | + | |
end | end | ||
else | else | ||
begin | begin | ||
- | case(led_state) | + | case(a) |
- | `state_idle:begin | + | 3'b000:begin |
- | led_state <= `state_led_on; | + | y_r <= 8'b00000001; |
- | led_r <= led_off; | + | |
end | end | ||
- | `state_led_on:begin | + | 3'b001:begin |
- | led_r <= led_on; | + | y_r <= 8'b00000010; |
- | if(state_sig) | + | |
- | begin | + | |
- | led_state <= `state_led_off; | + | |
- | end | + | |
- | else | + | |
- | begin | + | |
- | led_state <= led_state; | + | |
- | end | + | |
end | end | ||
- | `state_led_off:begin | + | 3'b010:begin |
- | led_r <= led_off; | + | y_r <= 8'b00000100; |
- | if(state_sig) | + | end |
- | begin | + | 3'b011:begin |
- | led_state <= `state_led_on; | + | y_r <= 8'b00001000; |
- | end | + | end |
- | else | + | 3'b100:begin |
- | begin | + | y_r <= 8'b00010000; |
- | led_state <= led_state; | + | end |
- | 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 | end | ||
endcase | endcase | ||
end | end | ||
end | end | ||
+ | |||
+ | assign y = y_r; | ||
</code> | </code> | ||
==== 五、 实验步骤及实验结果 ==== | ==== 五、 实验步骤及实验结果 ==== | ||
+ | {{ :icore4t:icore4t_ide_1_37.jpg?600 |图13.2}} | ||
+ | - 将硬件正确连接,如图13.2所示。 | ||
+ | - 将编写好的代码进行编译,并下载到开发板中; | ||
+ | - 通过Signaltap工具查看输入信号与输出信号之间的关系,观察实验现象——如图7.3所示。 | ||
+ | {{ :icore4t:icore4t_fpga_7_3.png?direct |图13.3}} | ||
- | - 将硬件正确连接,如图8.1所示。 | ||
- | {{ :icore4t:icore4t_fpga_13_1.jpg?direct |图13.1}} | ||
- | |||
- | - 将编写好的代码进行编译,并下载到开发板中; | ||
- | - 观察实验现象——FPGA_LED闪烁,间隔大约为3s; | ||
==== 六、 拓展实验 ==== | ==== 六、 拓展实验 ==== | ||
- | 1、通过Signaltap采样状态机跳转信号及状态切换,观察信号变化。 | + | - 设计一个部分译码器(如:4-10译码器),观察信号变化。 |