FPGA通过上位机串口发送指令实现两种灯的切换,输入1完成呼吸灯,周期两秒,输入2完成流水灯,灯亮一秒,切换时间两秒。代码实例
时间: 2024-06-08 17:06:02 浏览: 14
这里提供一个FPGA的Verilog代码实例,使用UART模块接收上位机串口指令,控制两种不同的LED灯的切换。在代码中,使用了一个计数器来实现呼吸灯和流水灯的时间控制。
```verilog
module LED_control(
input clk,
input rst,
input UART_RX, //串口接收端口
output reg LED1,
output reg LED2
);
reg [7:0] UART_data;
reg [3:0] count;
parameter BAUD_RATE = 9600; //波特率
parameter CLK_FREQ = 50000000; //时钟频率
//UART模块
UART_rx #(.BAUD_RATE(BAUD_RATE), .CLK_FREQ(CLK_FREQ)) UART(
.clk(clk),
.rst(rst),
.rx(UART_RX),
.data(UART_data)
);
always @(posedge clk) begin
if (rst) begin
LED1 <= 1'b0;
LED2 <= 1'b0;
count <= 4'd0;
end
else begin
//根据UART接收的数据控制LED灯
case(UART_data)
8'h31: begin //输入1,开启呼吸灯
count <= count + 1;
if (count >= 50) count <= 0;
if (count <= 25) LED1 <= count[4];
else LED1 <= ~count[4];
LED2 <= 1'b0;
end
8'h32: begin //输入2,开启流水灯
count <= count + 1;
if (count >= 10) count <= 0;
if (count <= 5) LED1 <= 1'b1;
else LED1 <= 1'b0;
if (count >= 5) LED2 <= 1'b1;
else LED2 <= 1'b0;
end
default: begin
LED1 <= 1'b0;
LED2 <= 1'b0;
end
endcase
end
end
endmodule
//UART接收模块
module UART_rx(
input clk,
input rst,
input rx,
output reg [7:0] data
);
parameter BAUD_RATE = 9600; //波特率
parameter CLK_FREQ = 50000000; //时钟频率
reg [3:0] bit_cnt;
reg [15:0] baud_div;
reg [7:0] shift_reg;
assign data = shift_reg;
always @(posedge clk) begin
if (rst) begin
bit_cnt <= 4'd0;
baud_div <= CLK_FREQ / BAUD_RATE;
shift_reg <= 8'h00;
end
else begin
if (bit_cnt == 4'd0) begin
if (~rx) begin
bit_cnt <= bit_cnt + 1;
shift_reg <= {1'b0, shift_reg[7:1]};
end
end
else if (bit_cnt < 4'd9) begin
baud_div <= baud_div - 1;
if (baud_div == 0) begin
baud_div <= CLK_FREQ / BAUD_RATE;
shift_reg <= {rx, shift_reg[7:1]};
bit_cnt <= bit_cnt + 1;
end
end
else if (bit_cnt == 4'd9) begin
baud_div <= baud_div - 1;
if (baud_div == 0) begin
bit_cnt <= 4'd0;
shift_reg <= {shift_reg[6:0], 1'b0};
end
end
end
end
endmodule
```
在代码中,使用了一个计数器来实现呼吸灯和流水灯的时间控制。当输入1时,计数器不断递增,控制LED1灯的亮度变化,从而实现呼吸灯效果;当输入2时,计数器也不断递增,根据计数器的值控制LED1和LED2灯的亮灭,从而实现流水灯效果。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)