基于FPGA的辩说赛体系计划-8名选手-正反两方-支持单选手评分-正反两方评分总和

[复制链接]
发表于 2025-11-16 04:13:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

功能形貌

1.答辩倒计时功能,当正反恣意一方开始答辩后,倒计时30S。在倒计时末了10S后,LED灯开始闪耀。
2.答辩评分和计分功能,当答辩方竣事答辩后,评委可以通过按键举行评分,底子分数为10分(满分),可以通过按键镌汰分数,末了通过确认按键确定评分。同时正方和反方的评分总数可以通过按键举行表现,到达一个计分的功能。
3.请看vcr
一、体系概述

控制模块:负责状态切换,应用状态机
数码管数据表现:负责表现数据切换
按键消抖:防止按键抖动
变量声明
  1. module control(
  2.     input       clk,
  3.     input       rst_n,
  4.     input       key_start,
  5.     input       key_score,
  6.     input       key_down,
  7.     output  wire      led_time,
  8.     output  wire      led_score,
  9.     output  reg       led_display_score,
  10.     output  reg       led_time_warnning,
  11.     output  reg       flag_po_ne,
  12.     output  wire[3:0]  display_count,
  13.     output  reg [7:0]  score,
  14.     output  reg [7:0]  data_time,
  15.     output  reg [7:0]  po_score,
  16.     output  reg [7:0]  ne_score
  17.     );
  18.     parameter   IDLE        =8'd0;
  19.     parameter   DABIAN        =8'd1;
  20.     parameter   TALK_1        =8'd2;
  21.     parameter   TEST_1        =8'd3;
  22.     parameter   TALK_2        =8'd4;
  23.     parameter   TEST_2        =8'd5;
  24.     parameter   TALK_3        =8'd6;
  25.     parameter   TEST_3        =8'd7;
  26.     parameter   TALK_4        =8'd8;
  27.     parameter   TEST_4        =8'd9;
  28.    
  29.     reg     [4:0]   state;
  30.     reg     [25:0]  count;
  31.     reg     [3:0]   po_count;
  32.     reg     [3:0]   ne_count;
  33.    
  34.     reg     [7:0]   po_1_score;
  35.     reg     [7:0]   po_2_score;
  36.     reg     [7:0]   po_3_score;
  37.     reg     [7:0]   po_4_score;
  38.    
  39.     reg     [7:0]   ne_1_score;
  40.     reg     [7:0]   ne_2_score;
  41.     reg     [7:0]   ne_3_score;
  42.     reg     [7:0]   ne_4_score;
复制代码
倒计时 还剩10秒 灯闪耀 另有其他一些指示灯
  1.   assign led_time=(state==TALK_1 || state==TALK_2 || state==TALK_3 || state==TALK_4)?1'b1:1'b0;
  2.     assign led_score=(state==TEST_1 || state==TEST_2|| state==TEST_3|| state==TEST_4)?1'b1:1'b0;
  3.     assign display_count=(flag_po_ne==1'b0)?po_count:ne_count;
  4.    
  5.     always @(posedge clk or negedge rst_n) begin
  6.     if(!rst_n) begin
  7.         led_time_warnning<=1'b0;
  8.     end
  9.     else if(data_time<=8'h10 && count==25000000 || count==49999999)begin
  10.         led_time_warnning<=~led_time_warnning;
  11.     end
  12.     else if(data_time >8'h10)begin
  13.         led_time_warnning<=1'b0;
  14.     end
  15.     else begin
  16.         led_time_warnning<=led_time_warnning;
  17.     end
  18.     end
复制代码
展示总积分的标志
  1. always @(posedge clk or negedge rst_n) begin
  2.     if(!rst_n) begin
  3.         led_display_score<=1'b0;
  4.     end
  5.     else if(led_time==1'b0 && led_score==1'b0 && key_score==1'b1)begin
  6.         led_display_score<=~led_display_score;
  7.     end
  8.     else begin
  9.         led_display_score<=led_display_score;
  10.     end
  11.    
  12.     end
复制代码
正反方瓜代举行 正反方次数各自累加
  1. always @(posedge clk or negedge rst_n) begin
  2.     if(!rst_n) begin
  3.          po_count<=4'd0;
  4.          ne_count<=4'd0;
  5.     end
  6.     else if((state==TEST_1 || state==TEST_2|| state==TEST_3|| state==TEST_4)&& key_start==1'b1&&flag_po_ne==1'b0)begin
  7.          po_count<=po_count+1;
  8.     end
  9.     else if((state==TEST_1 || state==TEST_2|| state==TEST_3|| state==TEST_4)&& key_start==1'b1&&flag_po_ne==1'b1)begin
  10.          ne_count<=ne_count+1;
  11.     end
  12.     else if(state==IDLE)begin
  13.          po_count<=4'd0;
  14.          ne_count<=4'd0;
  15.     end
  16.     end
复制代码
总分盘算
  1. always @(posedge clk or negedge rst_n) begin
  2.     if(!rst_n) begin
  3.         ne_score<=8'h40;
  4.         po_score<=8'h40;
  5.     end
  6.     else if(state== DABIAN)begin
  7.         ne_score<=8'h40;
  8.         po_score<=8'h40;
  9.     end
  10.     else if((state==TEST_1 || state==TEST_2|| state==TEST_3|| state==TEST_4)&& key_down==1'b1&& flag_po_ne==1'b0)begin
  11.         if(po_score[3:0]==4'h0 && po_score[7:4]>4'h0)begin
  12.             po_score[3:0]<=4'h9;
  13.             po_score[7:4]<=po_score[7:4]-4'd1;
  14.         end
  15.         else if(po_score[3:0]>4'h0 && po_score[7:4]>=4'h0)begin
  16.             po_score[3:0]<=po_score[3:0]-4'd1;
  17.             po_score[7:4]<=po_score[7:4];
  18.         end
  19.         else if(po_score[3:0]==4'h0 && po_score[7:4]==4'h0)begin
  20.             po_score[3:0]<=po_score[3:0];
  21.             po_score[7:4]<=po_score[7:4];
  22.         end
  23.         
  24.     end
  25.     else if((state==TEST_1 || state==TEST_2|| state==TEST_3|| state==TEST_4)&& key_down==1'b1&& flag_po_ne==1'b1)begin
  26.         if(ne_score[3:0]==4'h0 && ne_score[7:4]>4'h0)begin
  27.             ne_score[3:0]<=4'h9;
  28.             ne_score[7:4]<=ne_score[7:4]-4'd1;
  29.         end
  30.         else if(ne_score[3:0]>4'h0 && ne_score[7:4]>=4'h0)begin
  31.             ne_score[3:0]<=ne_score[3:0]-4'd1;
  32.             ne_score[7:4]<=ne_score[7:4];
  33.         end
  34.         else if(ne_score[3:0]==4'h0 && ne_score[7:4]==4'h0)begin
  35.             ne_score[3:0]<=ne_score[3:0];
  36.             ne_score[7:4]<=ne_score[7:4];
  37.         end
  38.         
  39.     end
  40.     end
复制代码
单人评分
  1. always @(posedge clk or negedge rst_n) begin
  2.     if(!rst_n) begin
  3.         score<=8'h10;
  4.     end
  5.     else if(state==TALK_1 || state==TALK_2|| state==TALK_3|| state==TALK_4)begin
  6.         score<=8'h10;
  7.     end
  8.     else if((state==TEST_1 || state==TEST_2|| state==TEST_3|| state==TEST_4)&& key_down==1'b1)begin
  9.         if(score[3:0]==4'h0 && score[7:4]>4'h0)begin
  10.             score[3:0]<=4'h9;
  11.             score[7:4]<=score[7:4]-4'd1;
  12.         end
  13.         else if(score[3:0]>4'h0 && score[7:4]>=4'h0)begin
  14.             score[3:0]<=score[3:0]-4'd1;
  15.             score[7:4]<=score[7:4];
  16.         end
  17.         else if(score[3:0]==4'h0 && score[7:4]==4'h0)begin
  18.             score[3:0]<=score[3:0];
  19.             score[7:4]<=score[7:4];
  20.         end
  21.         
  22.     end
  23.     end
复制代码
倒计时30S 记得把count改成49999999 应该就是1秒
  1. always @(posedge clk or negedge rst_n) begin
  2.     if(!rst_n) begin
  3.         data_time<=8'h30;
  4.     end
  5.     else if(count==499 && (state==TALK_1 || state==TALK_2|| state==TALK_3|| state==TALK_4))begin
  6.         if(data_time[3:0]==4'h0 && data_time[7:4]>4'h0)begin
  7.             data_time[3:0]<=4'h9;
  8.             data_time[7:4]<=data_time[7:4]-4'd1;
  9.         end
  10.         else if(data_time[3:0]>4'h0 && data_time[7:4]>=4'h0)begin
  11.             data_time[3:0]<=data_time[3:0]-4'd1;
  12.             data_time[7:4]<=data_time[7:4];
  13.         end
  14.         else if(data_time[3:0]==4'h0 && data_time[7:4]==4'h0)begin
  15.             data_time[3:0]<=data_time[3:0];
  16.             data_time[7:4]<=data_time[7:4];
  17.         end
  18.     end
  19.     else if(state==TEST_1 || state==TEST_2|| state==TEST_3|| state==TEST_4)begin
  20.         data_time<=8'h30;
  21.     end
  22.     end   
  23.    
  24.     always @(posedge clk or negedge rst_n) begin
  25.     if(!rst_n) begin
  26.         count<=26'd0;
  27.     end
  28.     else if(state==TALK_1 || state==TALK_2|| state==TALK_3|| state==TALK_4)begin
  29.         if(count<499)begin
  30.             count<=count+1;
  31.         end
  32.         else begin
  33.             count<=26'd0;
  34.         end
  35.     end
  36.     else begin
  37.         count<=26'd0;
  38.     end
  39.     end
复制代码
状态机切换 ,似乎有一些用不到的、、
  1. always @(posedge clk or negedge rst_n) begin
  2.     if(!rst_n) begin
  3.         state <= IDLE;
  4.         po_1_score<=8'h10;
  5.         po_2_score<=8'h10;
  6.         po_3_score<=8'h10;
  7.         po_4_score<=8'h10;
  8.         ne_1_score<=8'h10;
  9.         ne_2_score<=8'h10;
  10.         ne_3_score<=8'h10;
  11.         ne_4_score<=8'h10;
  12.         flag_po_ne<=1'b0;
  13.     end
  14.     else begin
  15.         case(state)
  16.         IDLE:begin
  17.             if(key_start==1'b1)begin
  18.                 state<=DABIAN;
  19.             end
  20.             else begin
  21.                 state<=IDLE;
  22.             end
  23.         end
  24.         DABIAN:begin
  25.             state<=TALK_1;
  26.         end
  27.         TALK_1:begin
  28.             if(data_time==8'h00)begin
  29.                 state<=TEST_1;
  30.             end
  31.             else begin
  32.                 state<=TALK_1;
  33.             end
  34.         end
  35.         TEST_1:begin
  36.             if(key_start==1'b1 && po_count==0)begin
  37.                 state<=TALK_2;
  38.                 flag_po_ne<=~flag_po_ne;
  39.                 po_1_score<=score;
  40.             end
  41.             else if(key_start==1'b1 && po_count==2)begin
  42.                 state<=TALK_2;
  43.                 flag_po_ne<=~flag_po_ne;
  44.                 po_3_score<=score;
  45.             end
  46.             else begin
  47.                 state<=TEST_1;
  48.             end
  49.         end
  50.         TALK_2:begin
  51.             if(data_time==8'h00)begin
  52.                 state<=TEST_2;
  53.             end
  54.             else begin
  55.                 state<=TALK_2;
  56.             end
  57.         end
  58.         TEST_2:begin
  59.             if(key_start==1'b1 && ne_count==0)begin
  60.                 state<=TALK_3;
  61.                 flag_po_ne<=~flag_po_ne;
  62.                 ne_1_score<=score;
  63.             end
  64.             else if(key_start==1'b1 && ne_count==2)begin
  65.                 state<=TALK_3;
  66.                 flag_po_ne<=~flag_po_ne;
  67.                 ne_3_score<=score;
  68.             end
  69.             else begin
  70.                 state<=TEST_2;
  71.             end
  72.         end
  73.         TALK_3:begin
  74.             if(data_time==8'h00)begin
  75.                 state<=TEST_3;
  76.             end
  77.             else begin
  78.                 state<=TALK_3;
  79.             end
  80.         end
  81.         TEST_3:begin
  82.             if(key_start==1'b1 && po_count==1)begin
  83.                 state<=TALK_4;
  84.                 flag_po_ne<=~flag_po_ne;
  85.                 po_2_score<=score;
  86.             end
  87.             else if(key_start==1'b1 && po_count==3)begin
  88.                 state<=TALK_4;
  89.                 flag_po_ne<=~flag_po_ne;
  90.                 po_4_score<=score;
  91.             end
  92.             else begin
  93.                 state<=TEST_3;
  94.             end
  95.         end
  96.         TALK_4:begin
  97.             if(data_time==8'h00)begin
  98.                 state<=TEST_4;
  99.             end
  100.             else begin
  101.                 state<=TALK_4;
  102.             end
  103.         end
  104.         TEST_4:begin
  105.             if(key_start==1'b1 && ne_count==1)begin
  106.                 state<=TALK_1;
  107.                 flag_po_ne<=~flag_po_ne;
  108.                 ne_2_score<=score;
  109.             end
  110.             else if(key_start==1'b1 && ne_count==3)begin
  111.                 state<=IDLE;
  112.                 flag_po_ne<=~flag_po_ne;
  113.                 po_4_score<=score;
  114.             end
  115.             else begin
  116.                 state<=TEST_4;
  117.             end
  118.         end
  119.         default:state<=IDLE;
  120.         endcase
  121.      end
  122.      end
  123.      
  124.      
  125.             
  126. endmodule
复制代码
按键消抖模块 另有数码管模块在我其他文章内里有,去复制一下吧,上面是一个模块,全部连起来就是。
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2024/12/25 22:38:47
  7. // Design Name:
  8. // Module Name: top
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module top(
  22.     input       sys_clk,
  23.     input       rst_n,
  24.     input       key_start,
  25.     input       key_dowm,
  26.     input       key_score,
  27.     output  wire    [3:0]   LED,
  28.     output        wire        [5:0]        sel,
  29.     output        wire        [7:0]        dig
  30.     );
  31.     wire            button1_negedge;
  32.     wire            button2_negedge;
  33.     wire            button3_negedge;
  34.    
  35.     wire            flag_po_ne;
  36.     wire            led_time;
  37.     wire            led_score;
  38.     wire            led_display_score;
  39.    
  40.     wire        [3:0]        count;
  41.     wire        [3:0]        display_count;
  42.     wire        [7:0]        po_score;
  43.     wire        [7:0]        ne_score;
  44.     wire        [7:0]        data_time;
  45.     wire        [7:0]        score;
  46.     wire        [7:0]        display_data;
  47.     wire        [23:0]        din;
  48.     wire        [23:0]        seg_data;
  49.     wire        [23:0]        display_score;
  50.     assign LED={led_time,flag_po_ne,led_display_score,led_time_warnning};
  51.     assign display_data=(led_time==1'b1)?data_time:(led_score==1'b1)?score:8'hDD;
  52.     assign count=(led_score==1'b1)?display_count:4'hD;
  53.     assign din={display_data,4'hD,count,8'hDD};
  54.     assign display_score={4'h0,po_score,4'h1,ne_score};
  55.     assign seg_data=(led_display_score==1'b1)?display_score:din;
  56.     control u_control(
  57.     .clk(sys_clk),
  58.     .rst_n(rst_n),
  59.     .key_start(key_start),
  60.     .key_score(key_score),
  61.     .key_down(key_down),
  62.     .score(score),
  63.     .po_score(po_score),
  64.     .ne_score(ne_score),
  65.     .flag_po_ne(flag_po_ne),
  66.     .display_count(display_count),
  67.     .led_display_score(led_display_score),
  68.     .led_time(led_time),
  69.     .led_time_warnning(led_time_warnning),
  70.     .led_score(led_score),
  71.     .data_time(data_time)
  72.     );
  73.    
  74.    
  75. key_debounce u_key_debounce1
  76. (
  77. .sys_clk(sys_clk),
  78. .rst_n(rst_n),
  79. .key(key_start),
  80. .button_negedge(button1_negedge) //Key falling edgz
  81. );
  82. key_debounce u_key_debounce2
  83. (
  84. .sys_clk(sys_clk),
  85. .rst_n(rst_n),
  86. .key(key_dowm),
  87. .button_negedge(button2_negedge) //Key falling edgz
  88. );
  89. key_debounce u_key_debounce3
  90. (
  91. .sys_clk(sys_clk),
  92. .rst_n(rst_n),
  93. .key(key_score),
  94. .button_negedge(button3_negedge) //Key falling edgz
  95. );
  96. seg_ctrl u_seg_ctrl(
  97.     .clk(sys_clk)                ,
  98.     .rst_n(rst_n)        ,
  99.     .din(seg_data)                ,//输入6位数码管显示数据,每位数码管占4位
  100.     .point_n(6'b111111) ,//输入小数点控制位
  101.     .sel(sel)        ,//输出位选
  102.     .dig(dig)  //输出段选
  103. );       
  104.    
  105. endmodule
复制代码
二、仿真波形

当主持人无使用时,无法举行辩说赛,倒计时、评分、计分功能无法表现;当主持人按下答辩开关,第一及第二个数码管表现30秒倒计时,而且开始倒计时,当倒计时10S后,LED灯闪耀报警;依次按照正方1辩,反方1辩,正方2辩,反方2辩,正方3辩,反方3辩,正方4辩,反方4辩次序举行辩说。辩说完时,评委举行选手评分,第一个和第二个数码管表现选手的当前分数(满分10分),随后第三数码管表现横杠,第四个数码管表现选手编号。评委可以通过按键手动举行减分,确定好分数后按下确认键。竣事答辩后,展示评分阶段,数码管表现:0(代表正方)-正方分数-1(代表反方)-反方分数。

视频


   基于FPGA的辩说赛计分器

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表