用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;给出各模块代码,其中要求每个数码管显示数字为0~9即显示时用BCD码。
时间: 2024-02-13 18:07:52 浏览: 88
这是一个比较具体的FPGA设计要求,需要涉及到数字电路和Verilog HDL语言的知识。以下是该设计的基本框架:
1. 定义模块端口,包括开关、七段数码管、LED灯、键盘等。
```
module score_board(
input clk, // 时钟信号
input rst, // 复位信号
input sw1, // 开关1
input [2:0] key, // 键盘输入
output reg [7:0] seg,// 数码管输出
output reg [1:0] led // LED灯输出
);
```
2. 定义各个模块,包括计分器、BCD码转换器、数码管驱动、LED灯驱动等。
- 计分器模块:
```
module score_counter(
input clk, // 时钟信号
input rst, // 复位信号
input [2:0] key, // 键盘输入
output reg [3:0] score_yellow, // 黄队分数
output reg [3:0] score_red // 红队分数
);
```
- BCD码转换器模块:
```
module bcd_converter(
input [3:0] score, // 待转换的分数
output reg [3:0] bcd // 转换后的BCD码
);
```
- 数码管驱动模块:
```
module seg_driver(
input clk, // 时钟信号
input rst, // 复位信号
input [3:0] bcd, // BCD码输入
output reg [6:0] seg // 数码管输出
);
```
- LED灯驱动模块:
```
module led_driver(
input clk, // 时钟信号
input rst, // 复位信号
input [3:0] score_yellow, // 黄队分数
input [3:0] score_red, // 红队分数
output reg [1:0] led // LED灯输出
);
```
3. 在主模块中实例化各个子模块,并用时序逻辑描述比赛过程。
```
module score_board(
input clk, // 时钟信号
input rst, // 复位信号
input sw1, // 开关1
input [2:0] key, // 键盘输入
output reg [7:0] seg,// 数码管输出
output reg [1:0] led // LED灯输出
);
// 实例化各个子模块
score_counter counter(.clk(clk), .rst(rst), .key(key), .score_yellow(score_yellow), .score_red(score_red));
bcd_converter yellow_bcd(.score(score_yellow), .bcd(yellow_bcd));
bcd_converter red_bcd(.score(score_red), .bcd(red_bcd));
seg_driver seg0(.clk(clk), .rst(rst), .bcd(yellow_bcd[0]), .seg(seg[0]));
seg_driver seg1(.clk(clk), .rst(rst), .bcd(yellow_bcd[1]), .seg(seg[1]));
seg_driver seg6(.clk(clk), .rst(rst), .bcd(red_bcd[0]), .seg(seg[6]));
seg_driver seg7(.clk(clk), .rst(rst), .bcd(red_bcd[1]), .seg(seg[7]));
led_driver led(.clk(clk), .rst(rst), .score_yellow(score_yellow), .score_red(score_red), .led(led));
// 比赛过程
reg [1:0] state = 0;
reg [3:0] add_score = 0;
always @(posedge clk) begin
if (rst) begin
state <= 0;
add_score <= 0;
seg <= 8'b00000000;
led <= 2'b00;
end else begin
case (state)
0: begin // 比赛未开始
if (sw1 == 1'b1) begin // 开始比赛
score_yellow <= 4'b0000;
score_red <= 4'b0000;
state <= 1;
end
end
1: begin // 比赛进行中
case (key)
3'b010: begin // * + 1
add_score <= 1;
state <= 2;
end
3'b011: begin // * + 2
add_score <= 2;
state <= 2;
end
3'b100: begin // * + 3
add_score <= 3;
state <= 2;
end
3'b001: begin // # + 1
add_score <= -1;
state <= 2;
end
3'b101: begin // # + 2
add_score <= -2;
state <= 2;
end
3'b110: begin // # + 3
add_score <= -3;
state <= 2;
end
default: begin
add_score <= 0;
end
end
end
2: begin // 分数更新
score_yellow <= score_yellow + add_score;
score_red <= score_red - add_score;
state <= 3;
end
3: begin // 显示分数
yellow_bcd <= score_yellow;
red_bcd <= score_red;
seg <= {yellow_bcd[2:0], yellow_bcd[3], 2'b00, 2'b00, red_bcd[2:0], red_bcd[3]};
led <= (score_yellow > score_red) ? 2'b01 : 2'b10;
state <= (sw1 == 1'b0) ? 4 : 1;
end
4: begin // 比赛结束
seg <= {8{4'b1111}};
led <= (score_yellow > score_red) ? 2'b01 : 2'b10;
state <= 5;
end
5: begin // LED闪烁
led <= ~led;
state <= 6;
end
6: begin // 等待状态
state <= 5;
end
default: begin
state <= 0;
end
endcase
end
end
endmodule
```
以上代码仅为参考,具体实现还需要根据实际情况进行修改和调试。
阅读全文