Vhdl10位选手抢答器

1.至多十位选手参与抢答
2.从某个选手最快按下抢答键开始所有选手的抢
答键被锁定并令结果显示驱动器输出该选手的编号,用于驱动七段液晶显示器
3,结果锁定后可以进行手动重置,并重新开始抢

4需要分别完成以下3个模块的VHDL设计并分别进行仿真测试:选手按键编码模块,抢答及锁定模块,结果显示驱动模块。
5按照合理逻辑将上述三个模块进行连接,必要时
适当添加周边电路完成整体的VHDL设计再进行仿
真测试。
采用tb仿真,不需要实物

可私信,赏金

该回答引用ChatGPT4与博主@晓码自在合作编写:

这里是一个解决该问题的VHDL设计思路:

  1. 选手按键编码模块:
vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity buttons_encode is
    Port ( clk : in STD_LOGIC;
           btn : in STD_LOGIC_VECTOR (9 downto 0);
           encoded : out STD_LOGIC_VECTOR (3 downto 0));
end buttons_encode;

architecture Behavioral of buttons_encode is
begin
    process(clk)
    begin
        if rising_edge(clk) then
            if btn(0) = '1' then
                encoded <= "0001";
            elsif btn(1) = '1' then
                encoded <= "0010";
                ......
            end if; 
        end if;
    end process;
end Behavioral;

该模块对10个选手按钮进行编码,输出一个4位二进制编码表示被按下的按钮号。
2. 抢答及锁定模块:

vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity answer_lock is
    Port ( clk : in STD_LOGIC;
           rst : in STD_LOGIC;
           encoded : in STD_LOGIC_VECTOR (3 downto 0);
           locked : out STD_LOGIC;
           led : out STD_LOGIC_VECTOR (3 downto 0)); 
end answer_lock;

architecture Behavioral of answer_lock is
    signal answer : STD_LOGIC_VECTOR (3 downto 0);
begin
    process(clk, rst)
    begin
        if rst = '1' then       
            answer <= "0000"; 
            locked <= '0';
        elsif rising_edge(clk) then
            if locked = '0' then
                if encoded /= "0000" then
                    answer <= encoded;
                    locked <= '1';
                end if;
            end if;
        end if;
    end process; 
    
    led <= answer;
end Behavioral;

该模块检测到第一个被按下的按键,锁定抢答结果,并输出对应的编码到4位LED显示器。同时拉高locked信号。

  1. 结果显示驱动模块:根据answer信号,驱动7段数码管显示对应的选手号。

将这3个模块连接,添加rst复位信号,可以完成整个设计。仿真测试可以验证是否正常工作。

这是一个比较简单的抢答器设计思路。关键是对按钮进行编码,然后锁定第一个被按下的按钮并显示结果。