私はwebPackISEv13を使用して次のコードでNexys3ボードをプログラムしていますが、ifelsifステートメントのステートメントを交換することでまったく異なる動作に気づきました。基本的に、ボード上で3つの押しボタンを使用しています。最初の押しボタンbtn(0)を押すと、8つのスイッチの状態がレジスタに格納されます。btn(1)を押すと、スイッチの状態が8つのLEDに表示され、LEDはこの状態を維持するはずです。btn(2)を押すと、すべてのLEDが強制的に点灯し、btn1または2のどちらも押されていない場合はこのままになります。ボタン1と2のifとelsifのアクションを入れ替えると、動作が変わります。スイッチの状態は、対応するボタンを押したときにのみ表示され、離すとすべてのLEDが点灯します。
「これを機能させるために必要なもの」を探すだけでなく、vhdlがC ++とは非常に異なる動作をする理由を説明した後です(この場合、順序は重要ではありません)。
以下はコードの抜粋です。動作「a」または動作「b」を取得するためにコメント/コメント解除する行を指定します。
動作'a':
- btn(0)を押すと、8つのスイッチの状態がdata_regに正しくロードされます
- btn(1)を押すと、LEDがすべてオンになります( "111 ... 11")
- btn(2)を押すと、LEDにdata_regの内容が表示されます
- ボタンが押されていない場合、LEDの状態は、最後にボタンを押したときに指示された状態になります。
動作'b':
- btn(0)を押すと、8つのスイッチの状態がdata_regに正しくロードされます
- btn(1)を押すと、LEDにdata_regの内容が表示されます
- btn(2)を押すと、LEDがすべてオンになります( "111 ... 11")
- ボタンが押されていない場合、すべてのLEDがオンになり、data_regの内容を確認する唯一の方法は、btn(1)を押したままにすることです。
`
プロセス(clk)
始める
if (clk'event and clk='1') then
if (db_btn(0)='1') then --load sw state into data_reg data_reg <= sw; end if;
次の場合に終了します。終了プロセス;
process(btn,data_reg)
begin
if btn(1)='1' then
data_s2f <= "1111111111111111"; --behvr a; comment this line for behvr b
-- data_s2f <= "00000000" & data_reg; -- uncomment for behvr b; comment for behvr a
elsif btn(2)='1' then -- read
data_s2f <= "00000000" & data_reg; --behvr a; comment this line for behvr b
--data_s2f <= "1111111111111111"; -- uncomment for behvr b; comment for behvr a
end if;
end process;
-- output
led <= data_s2f(7 downto 0); --display data_s2f in LEDs
シミュレーションテストベンチ
これが私のシミュレーションテストベンチです。すべてのシグナルの結果を実行すると、UUU..UUになります。コメントをいただければ幸いです。
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
ENTITY ifstmt_tb IS
END ifstmt_tb;
ARCHITECTURE behavior OF ifstmt_tb IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT ram_ctrl_test
PORT(
clk : IN std_logic;
reset : IN std_logic;
sw : IN std_logic_vector(7 downto 0);
btn : IN std_logic_vector(2 downto 0);
led : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal reset : std_logic := '0';
signal sw : std_logic_vector(7 downto 0) := (others => '0');
signal btn : std_logic_vector(2 downto 0) := (others => '0');
--Outputs
signal led : std_logic_vector(7 downto 0);
-- Clock period definitions
constant clk_period : time := 10 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: ram_ctrl_test PORT MAP (
clk => clk,
reset => reset,
sw => sw,
btn => btn,
led => led
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
-- hold reset state for 100 ns.
reset <= '1';
sw <= "11001100";
btn<= (others => '0');
wait for 100 ns;
reset <= '0';
wait for clk_period*10;
-- load register
btn<= (0=>'1', others => '0');
wait for clk_period*2;
btn<= (others => '0');
wait for clk_period*10;
-- display with btn 1
btn<= (1=>'1', others => '0');
wait for clk_period*5;
btn<= (others => '0');
wait for clk_period*10;
-- display with btn 2
btn<= (2=>'1', others => '0');
wait for clk_period*5;
btn<= (others => '0');
wait for clk_period*10;
-- change pattern
sw <= "11100111";
wait for clk_period;
-- load register
btn<= (0=>'1', others => '0');
wait for clk_period*2;
btn<= (others => '0');
wait for clk_period*10;
-- display with btn 2
btn<= (2=>'1', others => '0');
wait for clk_period*5;
btn<= (others => '0');
wait for clk_period*10;
-- display with btn 1
btn<= (1=>'1', others => '0');
wait for clk_period*5;
btn<= (others => '0');
-- insert stimulus here
wait;
end process;
END;