実現したいこと
DE10を使い、SW0~9のスライドスイッチを押すことで0~9の値が入力され、(例:1,2の順で押すと12と認識する)KEY0のボタンを押すと、1から入力した数までの総和が7セグメントディスプレイに最大6桁まで表示される。また、入力中及び表示後にKEY1のボタンを押すと、処理がリセットされるプログラムを制作したい。
発生している問題・分からないこと
7セグメントディスプレイに0が表示されたまま何を押してもうんともすんとも言わない。ピン番号もあっているはずなのになぜか動かない。
エラーメッセージ
error
1コンパイル後もエラーは吐かれていなかった。
該当のソースコード
VHDL
1library IEEE; 2use IEEE.STD_LOGIC_1164.ALL; 3use IEEE.NUMERIC_STD.ALL; 4 5entity sumtotalcounter1 is 6 Port ( 7 clk : in std_logic; -- クロック信号 8 reset_button : in std_logic; -- リセットボタン 9 sum_button : in std_logic; -- 決定ボタン 10 SW : in std_logic_vector(9 downto 0); -- スライドスイッチ (0~9) 11 HEX0 : out std_logic_vector(7 downto 0); -- 最下位桁の7セグメント 12 HEX1 : out std_logic_vector(7 downto 0); -- 2桁目 13 HEX2 : out std_logic_vector(7 downto 0); -- 3桁目 14 HEX3 : out std_logic_vector(7 downto 0); -- 4桁目 15 HEX4 : out std_logic_vector(7 downto 0); -- 5桁目 16 HEX5 : out std_logic_vector(7 downto 0) -- 6桁目 17 ); 18end sumtotalcounter1; 19 20architecture Behavioral of sumtotalcounter1 is 21 signal input_num : unsigned(19 downto 0) := (others => '0'); -- 入力値(最大6桁) 22 signal current_digit : integer range 0 to 5 := 0; -- 現在の桁数(0~5) 23 signal total_sum : unsigned(19 downto 0) := (others => '0'); -- 総和 24 signal bcd_output : std_logic_vector(23 downto 0) := (others => '0'); -- BCD変換用 25 signal sw_prev : std_logic_vector(9 downto 0) := (others => '0'); -- スイッチの前回状態 26 27 -- 数字→7セグメント表示デコード関数(アクティブロー対応) 28 function decode_7seg(bcd_digit : std_logic_vector(3 downto 0)) return std_logic_vector is 29 variable seg_output : std_logic_vector(7 downto 0); 30 begin 31 case bcd_digit is 32 when "0000" => seg_output := "11000000"; -- 0 33 when "0001" => seg_output := "11111001"; -- 1 34 when "0010" => seg_output := "10100100"; -- 2 35 when "0011" => seg_output := "10110000"; -- 3 36 when "0100" => seg_output := "10011001"; -- 4 37 when "0101" => seg_output := "10010010"; -- 5 38 when "0110" => seg_output := "10000010"; -- 6 39 when "0111" => seg_output := "11111000"; -- 7 40 when "1000" => seg_output := "10000000"; -- 8 41 when "1001" => seg_output := "10010000"; -- 9 42 when others => seg_output := "11111111"; -- すべて消灯 43 end case; 44 return seg_output; 45 end function; 46 47 48begin 49 -- 入力処理 50 process(clk, reset_button) 51 variable detected_num : integer := -1; -- 入力された数字を保持 52 variable inverted_sw : std_logic_vector(9 downto 0); -- スイッチ入力を反転した信号 53 begin 54 if reset_button = '1' then 55 input_num <= (others => '0'); -- 入力値リセット 56 current_digit <= 0; -- 桁数リセット 57 total_sum <= (others => '0'); -- 総和リセット 58 elsif rising_edge(clk) then 59 -- スイッチ入力を反転(アクティブロー対応) 60 inverted_sw := not SW; 61 62 -- スライドスイッチの状態を確認 63 detected_num := -1; 64 for i in 0 to 9 loop 65 if inverted_sw(i) = '1' and sw_prev(i) = '0' then -- スイッチがアクティブになった瞬間 66 detected_num := i; -- 対応する数字を取得 67 end if; 68 end loop; 69 sw_prev <= inverted_sw; -- 現在のスイッチ状態を保持 70 71 -- 入力された数字を処理 72 if detected_num /= -1 and current_digit < 6 then 73 -- 桁をシフトして新しい数字を追加 74 input_num <= (input_num(19 downto 4) & to_unsigned(detected_num, 4)); 75 current_digit <= current_digit + 1; 76 end if; 77 78 -- 総和計算 79 if sum_button = '1' then 80 total_sum <= total_sum + resize(input_num, total_sum'length); -- 総和を加算 81 input_num <= (others => '0'); -- 入力値リセット 82 current_digit <= 0; -- 桁数リセット 83 end if; 84 end if; 85 end process; 86 87 88 -- 総和をBCDに変換 89 process(total_sum) 90 variable temp : integer := 0; 91 variable bcd : std_logic_vector(23 downto 0) := (others => '0'); 92 begin 93 temp := to_integer(total_sum); -- 総和を整数に変換 94 for i in 0 to 5 loop 95 bcd((i * 4) + 3 downto i * 4) := std_logic_vector(to_unsigned(temp mod 10, 4)); 96 temp := temp / 10; 97 end loop; 98 bcd_output <= bcd; 99 end process; 100 101 -- 各桁のBCD値を7セグメントディスプレイに出力 102 HEX0 <= decode_7seg(bcd_output(3 downto 0)); -- 最下位桁 103 HEX1 <= decode_7seg(bcd_output(7 downto 4)); -- 2桁目 104 HEX2 <= decode_7seg(bcd_output(11 downto 8)); -- 3桁目 105 HEX3 <= decode_7seg(bcd_output(15 downto 12)); -- 4桁目 106 HEX4 <= decode_7seg(bcd_output(19 downto 16)); -- 5桁目 107 HEX5 <= decode_7seg(bcd_output(23 downto 20)); -- 6桁目 108end Behavioral; 109
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
デバウンス回路が必要ではないかとchatgptに言われたので現在実装中。
補足
あなたの回答
tips
プレビュー