用PGL22G__6MBG324开发平台做一个FPGA设计:(1)拨动开关sw1为H,开始比赛。八位七数码管从左数第1、2位显示黄队分数,第7、8位显示红队分数。开始比赛时同时显示为00。按下键盘1代表黄队加1分;按下键盘2代表黄队加2分;按下键盘*3代表黄队加3分;同时对应的黄色led灯亮。按下键盘#1代表红队加1分;按下键盘#2代表红队加2分;按下键盘#3代表红队加3分;同时对应的红色led灯亮。 (2)拨动开关sw1为L,结束比赛。总分大的队伍对应颜色的led灯闪烁(闪烁频率为4Hz), (3)外部输入脉冲信号频率为50mhz;给出各模块代码
时间: 2024-02-13 13:06:51 浏览: 31
好的,下面是本题的FPGA设计代码,包括三个模块:计分模块、数码管显示模块和LED灯控制模块。
计分模块:
```verilog
module score(
input clk, //时钟信号
input rst, //复位信号
input [2:0] add_score, //加分操作
input [3:0] yellow_score, //黄队分数
input [3:0] red_score, //红队分数
output [7:0] seg_out, //七段数码管输出
output reg [7:0] led_out //LED灯输出
);
reg [3:0] y_score; //黄队分数寄存器
reg [3:0] r_score; //红队分数寄存器
always @(posedge clk) begin
if (rst) begin //复位操作
y_score <= 4'b0000;
r_score <= 4'b0000;
end else begin
case (add_score) //加分操作
3'd1: y_score <= y_score + 1'b1;
3'd2: y_score <= y_score + 2'b10;
3'd3: y_score <= y_score + 3'b100;
3'd4: r_score <= r_score + 1'b1;
3'd5: r_score <= r_score + 2'b10;
3'd6: r_score <= r_score + 3'b100;
default: ; //无操作
endcase
end
end
assign seg_out[7:6] = 2'b00; //数码管高位控制
assign seg_out[5:4] = y_score; //数码管第1、2位显示黄队分数
assign seg_out[3:2] = 2'b00; //数码管高位控制
assign seg_out[1:0] = r_score; //数码管第7、8位显示红队分数
always @(y_score, r_score) begin //LED灯控制
if (y_score > r_score) begin //黄队领先,控制黄色LED灯亮
led_out = 8'b00000001;
end else if (y_score < r_score) begin //红队领先,控制红色LED灯亮
led_out = 8'b00000010;
end else begin //平局,LED灯全灭
led_out = 8'b00000000;
end
end
endmodule
```
数码管显示模块:
```verilog
module seg_display(
input clk, //时钟信号
input rst, //复位信号
input [7:0] seg_in, //七段数码管输入
output reg [7:0] seg_out //七段数码管输出
);
reg [26:0] cnt; //计数器,用于控制数码管显示
reg [3:0] pos; //数码管位选择,从左到右依次为0~7
reg [7:0] seg_buf[8]; //数码管缓存
assign seg_out = seg_buf[pos]; //输出选择的数码管位
always @(posedge clk) begin
if (rst) begin //复位操作
cnt <= 27'b0;
pos <= 4'b0;
seg_buf <= 8'h00;
end else begin
if (cnt == 27'd49999999) begin //控制数码管刷新频率为1Hz
cnt <= 27'b0;
pos <= pos + 1'b1;
if (pos == 4'b1000) begin //循环选择数码管位
pos <= 4'b0;
end
seg_buf[pos] <= seg_in; //更新数码管缓存
end else begin
cnt <= cnt + 1'b1;
end
end
end
endmodule
```
LED灯控制模块:
```verilog
module led_ctrl(
input clk, //时钟信号
input rst, //复位信号
input [7:0] led_in, //LED灯输入
output reg [7:0] led_out //LED灯输出
);
reg [26:0] cnt; //计数器,用于控制LED灯闪烁
reg [1:0] state; //LED灯闪烁状态,0表示亮,1表示灭
reg [7:0] led_buf; //LED灯缓存
assign led_out = led_buf; //输出LED灯缓存
always @(posedge clk) begin
if (rst) begin //复位操作
cnt <= 27'b0;
state <= 2'b0;
led_buf <= 8'h00;
end else begin
if (led_in == 8'h01) begin //黄队领先,控制黄色LED灯亮
led_buf <= 8'h01;
end else if (led_in == 8'h02) begin //红队领先,控制红色LED灯亮
led_buf <= 8'h02;
end else begin //平局,LED灯全灭
led_buf <= 8'h00;
end
if (led_in != 8'h00) begin //有一队领先,控制LED灯闪烁
if (cnt == 13'd0) begin //LED灯闪烁频率为4Hz
cnt <= 27'b0;
if (state == 2'b0) begin
state <= 2'b1;
led_buf <= 8'h00;
end else begin
state <= 2'b0;
led_buf <= led_in;
end
end else begin
cnt <= cnt + 1'b1;
end
end else begin //LED灯全灭,复位计数器和状态
cnt <= 27'b0;
state <= 2'b0;
end
end
end
endmodule
```
最后,将这三个模块实例化到顶层模块中,并连接输入和输出信号即可。顶层模块的代码如下:
```verilog
module top(
input clk, //时钟信号
input rst, //复位信号
input [2:0] add_score, //加分操作
input [3:0] yellow_score, //黄队分数
input [3:0] red_score, //红队分数
output [7:0] seg_out, //七段数码管输出
output reg [7:0] led_out //LED灯输出
);
wire [7:0] seg_in; //数码管输入
wire [7:0] led_in; //LED灯输入
score score_inst(
.clk(clk),
.rst(rst),
.add_score(add_score),
.yellow_score(yellow_score),
.red_score(red_score),
.seg_out(seg_in),
.led_out(led_in)
);
seg_display seg_display_inst(
.clk(clk),
.rst(rst),
.seg_in(seg_in),
.seg_out(seg_out)
);
led_ctrl led_ctrl_inst(
.clk(clk),
.rst(rst),
.led_in(led_in),
.led_out(led_out)
);
endmodule
```
至此,本题的FPGA设计代码已经完成。请根据自己的具体需求和硬件平台进行适当的修改和调试。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![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)