差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
流水灯 [2016/06/07 15:38] anran [代码设计] |
流水灯 [2021/09/13 01:39] (当前版本) gongyu |
||
---|---|---|---|
行 1: | 行 1: | ||
- | =====流水灯===== | + | ## 流水灯 |
====硬件平台==== | ====硬件平台==== | ||
行 8: | 行 8: | ||
====设计要求==== | ====设计要求==== | ||
------ | ------ | ||
- | - 掌握分频功能的设计 | + | - 掌握任意数分频计数功能的设计 |
- 掌握时序逻辑的设计 | - 掌握时序逻辑的设计 | ||
- 掌握case的基本语法 | - 掌握case的基本语法 | ||
- | - 基于小脚丫STEP FPGA Base Board开发平台LED实现流水灯的功能,每个LED点亮时间为1秒 | + | - 基于小脚丫STEP FPGA Base Board开发平台LED实现流水灯的功能,总计8个LED灯,循环、轮流点亮,每个LED点亮时间为1秒 |
====工作原理==== | ====工作原理==== | ||
行 18: | 行 18: | ||
本设计为流水灯实验,我们需要结合使用的硬件平台实现[[STEP-Baseboard]]平台上的8个LED循环闪烁,每个LED灯点亮时间为1秒。 | 本设计为流水灯实验,我们需要结合使用的硬件平台实现[[STEP-Baseboard]]平台上的8个LED循环闪烁,每个LED灯点亮时间为1秒。 | ||
- | LED也叫发光二极管,属于二极管的一种,具有二极管的单项导电性,使用时需要给LED上施加正向压差,产生电流(一般在20mA以内,具体参考设计中使用的LED的参数),点亮LED。 | + | LED也叫发光二极管,属于二极管的一种,具有二极管的单项导电性,使用时需要给LED上施加正向压差,产生电流(一般在20mA以内,具体参考设计中使用的LED的参数),点亮LED。本平台使用的8个LED都是通过低电平点亮(参照电路图),因此控制该LED的FPGA的IO管脚输出“1“(高电平)时LED灭,输出”0“(低电平)时LED亮。 |
- | 为了使每个LED点亮1秒的时间,我们需要一个1Hz的信号,因为硬件平台[[STEP-MXO2第一代]]上使用的晶振为25MHz,2^25 = 33554432 > 25000000,所以我们需要做一个位宽为25的计数器。计数器初值为0,当计数到24999999时,总共计数25000000,也就是1秒时间。 | + | 为了使一个循环周期内每个LED点亮1秒的时间,我们需要一个持续时间为1秒的低电平信号,这可以通过本硬件平台[[STEP-MXO2第一代]]上的25MHz主时钟得到,2^25 = 33554432 > 25000000,所以我们需要做一个位宽为25的计数器。计数器初值为0,当计数到24999999时,总共计数25000000,也就是1秒时间。 |
为了实现流水的效果,我们需要一个寄存器,寄存器的值不同控制着不同的LED点亮,而寄存器的值在每次计数器计数到24999999时改变,这样每隔1秒时间,寄存器的值改变,对应控制8个LED按照同一方向循环闪烁,就实现了流水灯的功能。 | 为了实现流水的效果,我们需要一个寄存器,寄存器的值不同控制着不同的LED点亮,而寄存器的值在每次计数器计数到24999999时改变,这样每隔1秒时间,寄存器的值改变,对应控制8个LED按照同一方向循环闪烁,就实现了流水灯的功能。 | ||
行 40: | 行 40: | ||
{{ :流水灯程序设计.jpg |流水灯程序设计}} | {{ :流水灯程序设计.jpg |流水灯程序设计}} | ||
- | 为了实现对8个LED的控制,我们设计了25位的计数器cnt进行1s周期的循环计数,同时我们定义了一个4位寄存器led_cnt作为状态机的状态控制流水灯的闪烁。状态机共有8个状态,每一个状态对应点亮一个LED灯。 | + | 为了实现对8个LED的控制,我们设计了25位的计数器cnt进行1s周期的循环计数,同时我们定义了一个3位寄存器led_cnt作为状态机的状态控制流水灯的闪烁。状态机共有8个状态,每一个状态对应点亮一个LED灯。 |
首先是计数器的设计,计数器的计数范围为0~CNT_NUM-1,为了实现每个LED灯1秒的点亮时间,设计文件代码中我们定义参数CNT_NUM为25000000,但是在仿真文件调用设计文件时,为了方便仿真,我们会将参数CNT_NUM重新赋值为10. | 首先是计数器的设计,计数器的计数范围为0~CNT_NUM-1,为了实现每个LED灯1秒的点亮时间,设计文件代码中我们定义参数CNT_NUM为25000000,但是在仿真文件调用设计文件时,为了方便仿真,我们会将参数CNT_NUM重新赋值为10. | ||
行 60: | 行 60: | ||
<code verilog> | <code verilog> | ||
- | reg [3:0] led_cnt = 4'd0; | + | reg [2:0] led_cnt = 3'd0; |
always@(posedge clk_in or negedge rst_n_in) begin | always@(posedge clk_in or negedge rst_n_in) begin | ||
if(!rst_n_in) begin | if(!rst_n_in) begin | ||
- | led_cnt <= 4'd0; | + | led_cnt <= 3'd0; |
end else if(cnt==CNT_NUM-1) begin | end else if(cnt==CNT_NUM-1) begin | ||
- | if(led_cnt==4'd7) led_cnt <= 4'd0; | + | if(led_cnt==3'd7) led_cnt <= 3'd0; |
- | else led_cnt <= led_cnt + 4'd1; | + | else led_cnt <= led_cnt + 3'd1; |
end | end | ||
end | end | ||
行 76: | 行 76: | ||
always@(led_cnt) begin | always@(led_cnt) begin | ||
case(led_cnt) | case(led_cnt) | ||
- | 4'd0: led_out = 8'b1111_1110; | + | 3'd0: led_out = 8'b1111_1110; |
- | 4'd1: led_out = 8'b1111_1101; | + | 3'd1: led_out = 8'b1111_1101; |
- | 4'd2: led_out = 8'b1111_1011; | + | 3'd2: led_out = 8'b1111_1011; |
- | 4'd3: led_out = 8'b1111_0111; | + | 3'd3: led_out = 8'b1111_0111; |
- | 4'd4: led_out = 8'b1110_1111; | + | 3'd4: led_out = 8'b1110_1111; |
- | 4'd5: led_out = 8'b1101_1111; | + | 3'd5: led_out = 8'b1101_1111; |
- | 4'd6: led_out = 8'b1011_1111; | + | 3'd6: led_out = 8'b1011_1111; |
- | 4'd7: led_out = 8'b0111_1111; | + | 3'd7: led_out = 8'b0111_1111; |
default: led_out = 8'b1111_1111; | default: led_out = 8'b1111_1111; | ||
endcase | endcase | ||
行 110: | 行 110: | ||
====仿真结果==== | ====仿真结果==== | ||
- | {{:38译码器仿真.jpg|38译码器仿真}} | + | {{:流水灯仿真.jpg|流水灯仿真}} |
====资源报告==== | ====资源报告==== | ||
^ 资源 | 数量 | 比例 | 说明 | | ^ 资源 | 数量 | 比例 | 说明 | | ||
- | ^ LUTs | 8 | 1% | | | + | ^ LUTs | 27 | 4% | | |
- | ^ 寄存器 | 0 | 0% | | | + | ^ 寄存器 | 28 | 2% | | |
^ 存储器 | 0 | 0% | | | ^ 存储器 | 0 | 0% | | | ||
- | ^ IO管脚 | 12 | | | | + | ^ IO管脚 | 10 | | | |
^ 时钟频率 | 25MHz | | | | ^ 时钟频率 | 25MHz | | | | ||
====知识点==== | ====知识点==== | ||
- | * 组合逻辑 | + | * 分频设计 |
+ | * 时序控制 | ||
+ | * 简单状态机 | ||
====参考文档==== | ====参考文档==== | ||
+ | * [[点亮led灯]] | ||
* {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} | * {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} | ||
+ | |||
====相关文档==== | ====相关文档==== | ||
^ **文件名称** | **功能** | | ^ **文件名称** | **功能** | | ||
- | ^ **[[Decode38.v]]** | **38译码器** | | + | ^ **[[Water_led.v]]** | **流水灯** | |
- | ^ **[[Decode38_test.v]]** | **测试文件** | | + | ^ **[[Water_led_test.v]]** | **测试文件** | |