module flowing_led2(clk, rst, led,change,star); input clk; input rst; input change,star; output [7 : 0] led; parameter WIDTH =27; parameter COUNT = 9_999_999; reg [WIDTH - 1 : 0] cnt; reg [7 : 0] light; reg flag; reg change; always @(posedge clk) begin if (!rst) cnt <= 0; else if (cnt == COUNT) cnt <= 0; else begin if(star) cnt <= cnt ; else cnt <= cnt + 1 ; end end always @(posedge clk) begin if (light == 8'h01) flag <= 1; //left move else if (light == 8'h80) flag <= 0; //rihgt move else begin if (change && !change_prev) begin change_prev = change; flag = !flag; end else begin change_prev = change; flag = flag; end end end always @(posedge clk) begin if (!rst) light <= 8'h01; else if (cnt == COUNT) begin if (flag) light <= light << 1; else light <= light >> 1; end else ; end assign led = light; endmodule
时间: 2024-02-10 15:19:31 浏览: 44
这是一个 Verilog HDL 语言编写的模块,主要实现的功能是让 LED 灯不断流动。以下是代码的逐行翻译:
- module flowing_led2(clk, rst, led,change,star);:声明一个模块名为 flowing_led2,该模块有五个输入输出端口分别为 clk、rst、led、change 和 star。
- input clk;:声明一个输入端口 clk,用于接收时钟信号。
- input rst;:声明一个输入端口 rst,用于接收复位信号。
- input change,star;:声明两个输入端口 change 和 star,用于接收控制信号。
- output [7 : 0] led;:声明一个 8 位输出端口 led,用于控制 LED 灯的亮灭。
- parameter WIDTH =27;:声明一个宽度参数 WIDTH,其默认值为 27。
- parameter COUNT = 9_999_999;:声明一个计数参数 COUNT,其默认值为 9,999,999。
- reg [WIDTH - 1 : 0] cnt;:声明一个宽度为 WIDTH 的寄存器 cnt。
- reg [7 : 0] light;:声明一个 8 位寄存器 light。
- reg flag;:声明一个寄存器 flag,用于控制灯光流动方向。
- reg change;:声明一个寄存器 change,用于存储控制信号 change 的值。
- always @(posedge clk):在时钟的上升沿触发以下操作。
- begin:起始标记。
- if (!rst):如果复位信号 rst 为零,则执行以下操作。
- cnt <= 0;:将计数寄存器 cnt 的值设置为零。
- else if (cnt == COUNT):否则,如果计数寄存器 cnt 的值等于计数参数 COUNT,则执行以下操作。
- cnt <= 0;:将计数寄存器 cnt 的值设置为零。
- else:否则,执行以下操作。
- if(star):如果控制信号 star 为 1,则执行以下操作。
- cnt <= cnt ;:计数器不做改变。
- else:否则,执行以下操作。
- cnt <= cnt + 1 ;:计数器的值加 1。
- end:结束标记。
- always @(posedge clk):在时钟的上升沿触发以下操作。
- begin:起始标记。
- if (light == 8'h01):如果灯的状态为 0000 0001,则执行以下操作。
- flag <= 1;:将 flag 设置为 1,表示灯光向左流动。
- else if (light == 8'h80):否则,如果灯的状态为 1000 0000,则执行以下操作。
- flag <= 0;:将 flag 设置为 0,表示灯光向右流动。
- else:否则,执行以下操作。
- if (change && !change_prev):如果控制信号 change 为 1 且上一次的控制信号为 0,则执行以下操作。
- change_prev = change;:将上一次的控制信号设置为当前的控制信号。
- flag = !flag;:将 flag 取反,改变灯光流动方向。
- else:否则,执行以下操作。
- change_prev = change;:将上一次的控制信号设置为当前的控制信号。
- flag = flag;:灯光流动方向不变。
- end:结束标记。
- always @(posedge clk):在时钟的上升沿触发以下操作。
- begin:起始标记。
- if (!rst):如果复位信号 rst 为零,则执行以下操作。
- light <= 8'h01;:将灯光的状态设置为 0000 0001。
- else if (cnt == COUNT):否则,如果计数寄存器 cnt 的值等于计数参数 COUNT,则执行以下操作。
- begin:起始标记。
- if (flag):如果 flag 为 1,表示灯光向左流动,则执行以下操作。
- light <= light << 1;:将灯光状态左移一位。
- else:否则,执行以下操作。
- light <= light >> 1;:将灯光状态右移一位。
- end:结束标记。
- else:否则,不做任何操作。
- end:结束标记。
- assign led = light;:将灯光状态赋值给输出端口 led。
- endmodule:模块定义结束标记。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)