1条回答 默认 最新
- 梦幻编织者 2023-06-07 17:28关注
以下是按键连击电路的VHDL代码:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity button_counter is Port ( clk : in STD_LOGIC; button : in STD_LOGIC; reset : in STD_LOGIC; digit_out : out STD_LOGIC_VECTOR (3 downto 0); segment_out : out STD_LOGIC_VECTOR (6 downto 0)); end button_counter; architecture Behavioral of button_counter is signal counter : unsigned(7 downto 0) := (others => '0'); signal prev_button : std_logic := '0'; signal count_enable : std_logic := '0'; signal count_ended : std_logic := '0'; signal clock_count : unsigned(23 downto 0) := (others => '0'); begin -- Clock divider process(clk) begin if rising_edge(clk) then if clock_count = 24999999 then clock_count <= (others => '0'); count_ended <= '1'; else clock_count <= clock_count + 1; count_ended <= '0'; end if; end if; end process; -- Button counter process(clk, reset) begin if reset = '1' then counter <= (others => '0'); prev_button <= '0'; count_enable <= '0'; elsif rising_edge(clk) then if button = '1' and prev_button = '0' then count_enable <= '1'; prev_button <= '1'; else count_enable <= '0'; prev_button <= button; end if; if count_enable = '1' then counter <= counter + 1; end if; end if; end process; -- Display driver process(counter, count_ended) variable temp : unsigned(7 downto 0); begin if count_ended = '1' then temp := (others => '0'); else temp := counter; end if; case temp is when "00000000" => digit_out <= "1111"; segment_out <= "0000001"; when "00000001" => digit_out <= "1110"; segment_out <= "1001111"; when "00000010" => digit_out <= "1101"; segment_out <= "0010010"; when "00000011" => digit_out <= "1100"; segment_out <= "0000110"; when "00000100" => digit_out <= "1011"; segment_out <= "1001100"; when "00000101" => digit_out <= "1010"; segment_out <= "0100100"; when "00000110" => digit_out <= "1001"; segment_out <= "0100000"; when "00000111" => digit_out <= "1000"; segment_out <= "0001111"; when "00001000" => digit_out <= "0111"; segment_out <= "0000000"; when "00001001" => digit_out <= "0110"; segment_out <= "0000100"; when "00001010" => digit_out <= "0101"; segment_out <= "0001000"; when "00001011" => digit_out <= "0100"; segment_out <= "1100000"; when "00001100" => digit_out <= "0011"; segment_out <= "0110001"; when "00001101" => digit_out <= "0010"; segment_out <= "1000010"; when "00001110" => digit_out <= "0001"; segment_out <= "0110000"; when "00001111" => digit_out <= "0000"; segment_out <= "0111000"; when others => digit_out <= "1111"; segment_out <= "1111111"; end case; end process; end Behavioral;
该电路包含一个时钟分频器,一个按键计数器和一个数码管显示驱动器。时钟分频器将输入时钟分频为1秒,按键计数器在每次按键时增加计数器的值,数码管显示驱动器将计数器的值转换为七段数码管的显示。
以下是按键连击电路的测试台代码:library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity button_counter_tb is end button_counter_tb; architecture Behavioral of button_counter_tb is component button_counter is Port ( clk : in STD_LOGIC; button : in STD_LOGIC; reset : in STD_LOGIC; digit_out : out STD_LOGIC_VECTOR (3 downto 0); segment_out : out STD_LOGIC_VECTOR (6 downto 0)); end component; signal clk : std_logic := '0'; signal button : std_logic := '0'; signal reset : std_logic := '0'; signal digit_out : std_logic_vector(3 downto 0); signal segment_out : std_logic_vector(6 downto 0); begin uut: button_counter port map (clk, button, reset, digit_out, segment_out); clk_process : process begin clk <= '0'; wait for 10 ns; clk <= '1'; wait for 10 ns; end process; reset_process : process begin reset <= '1'; wait for 5 ns; reset <= '0'; wait for 100 ns; reset <= '1'; wait; end process; button_process : process begin button <= '0'; wait for 50 ns; button <= '1'; wait for 10 ns; button <= '0'; wait for 20 ns; button <= '1'; wait for 30 ns; button <= '0'; wait for 60 ns; button <= '1'; wait for 40 ns; button <= '0'; wait for 70 ns; button <= '1'; wait for 80 ns; button <= '0'; wait for 90 ns; button <= '1'; wait for 100 ns; button <= '0'; wait for 150 ns; button <= '1'; wait for 200 ns; button <= '0'; wait; end process; end Behavioral;
该测试台代码生成一个时钟信号和一系列模拟按键按下的事件。在仿真中,可以观察到计数器的值随着按键的按下而增加,并在每秒钟重置。数码管显示也会更新以显示当前计数器的值。
解决 无用评论 打赏 举报
悬赏问题
- ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
- ¥15 STM32串口接收问题
- ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接
- ¥15 filenotfounderror:文件是存在的,权限也给了,但还一直报错
- ¥15 MATLAB和mosek的求解问题
- ¥20 修改中兴光猫sn的时候提示失败
- ¥15 java大作业爬取网页
- ¥15 怎么获取欧易的btc永续合约和交割合约的5m级的历史数据用来回测套利策略?
- ¥15 有没有办法利用libusb读取usb设备数据
- ¥15 为什么openeluer里面按不了python3呢?