Last up date:
entity XXX is Port ( A : in std_logic; B : out std_logic); architecture Behavioral of XXX is signal BUF : std_logic; begin process (CLK) begin if rising_edge (CLK) then BUF <= A; B <= BUF; end if; end process; end Behavioral;で、"BUF"を観測しようとして、ロジアナ(オシロ)を当てる為の外部観測ピン"TestPort"を追加するため、
entity XXX is Port ( A : in std_logic; B : out std_logic; TestPort : out std_logic); architecture Behavioral of XXX is signal BUF : std_logic; signal TestPort : std_logic; begin process (CLK) begin if rising_edge (CLK) then BUF <= A; B <= BUF; TestPort <= BUF; end if; end process; end Behavioral;などとすると、配置状況(ピンアサインの位置や他の回路ブロックとの関係など)によってはFFがIOB内ではなく、LUTのものが使われてしまい、結果として"BUF"に観測ピンをアサインしたときと、しないときで遅延が変わってしまうことがあり、危険。観測ピンならまだ可観測だが、内部ロジックで分岐している場合にはディバッグ困難?!つまり、さっきまで動いていたところが、ロジック上無関係な回路をいじることで(タイミングがおかしくなり)動かなくなる可能性がある。
VHDL87 | VHDL97 | |
2進数表記 | "11110011" | "11110011" |
16進数表記 | 不可 | X"F3" |
process (CLK) begin if rising_edge (CLK) then B <= A; end if; end process; C <= A and not B;で、入力Aに対するOne-Shot Pulse出力Cが得られる。
process (CLK) begin if rising_edge (CLK) then B <= A and not B; end if; end process;では入力Aをイネーブル入力とする、トグルFFになってしまう。
signal databus_A : std_logic_vector(3 downto 0); signal databus_B : std_logic_vector(8 downto 0); component XXX port(databus: OUT std_logic_vector(3 downto 0)); end component; Instance_name: XXXのとき、
port map (databus => databus_A); port map (databus => databus_A(3 downto 0)); port map (databus => databus_B(7 downto 4)); port map (databus => "0000"); port map (databus => "0011"); port map (databus => '0'&'0'&'0'&'0'); port map (databus => '0'&'1'&'0'&'0');などは可能だが、
port map (databus => databus_A(3)&databus_A(2)&databus_A(1)&databus_A(0)); port map (databus => databus_A(3)&'0'&'0'&'0');などはダメ。
process (CLK) if rising_edge (CLK) then B <= A; C <= B; end if; end process;とした場合、A -> B -> C となるD-FFが2個生成される。
process (CLK) begin if rising_edge (CLK) then A <= '0'; if B='1' then A <= '1'; end if; end if; end process;はBによりAの値が変化するが、
process (CLK) begin if rising_edge (CLK) then if B='1' then A <= '1'; end if; A <= '0'; end if; end process;では、AはBによらず常に'0'となる。
process (CLK) begin if rising_edge (CLK) then A <= '0'; end if; end process;若しくは、単に
A <= '0';
と等価。process (CLK) begin if rising-edge (CLK) then B <= A; D <= C; E <= D; end if; end process;としたとき、始めの"CLK"の遷移で
B <= A;
が実行され、次の"CLK"遷移でD <= C;
が実行されるわけではない。B <= A; D <= C; E <= D;
は全て1回の"CLK"遷移で同時実行される。