VHDLで1ビットおよび32ビットレジスタを設計する際に問題が発生しました。レジスタの主な入力には、クロック(clk)、クリア(clr)、ロード/イネーブル(ld)信号、およびnビットデータ(d)が含まれます。 nビット出力は(q)で表されます。これまでのところ、1ビットのレジスタを作成したと思います。これが私のコードです。
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY register32 IS
PORT(
d : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- input.
ld : IN STD_LOGIC; -- load/enable.
clr : IN STD_LOGIC; -- async. clear.
clk : IN STD_LOGIC; -- clock.
q : OUT STD_LOGIC; -- output.
END register32;
ARCHITECTURE description OF register32 IS
BEGIN
process(clk, clr, ld)
begin
if clr = '1' then
q <= '0';
elsif d = '1' and ld = 1 and clk'event and clk='1' then
q <= '1';
elsif d = '0' and ld = 1 and clk'event and clk='1' then
q <= '0';
else
q <= '0';
end if;
end process;
END description;
これが1ビットレジスタに対して正しい場合、どのようにして32ビットレジスタにするのでしょうか。いくつかの助けをいただければ幸いです。
それでは、最初にコードのいくつかの問題を見てみましょう。
'0'
_に設定します。これはレジスターのモデリングではないので、削除しましょう。d
をq
に割り当てるだけで、内部ロジックを簡素化することもできます。 (これにより、32ビットロジックもはるかに単純になります)。clk'event and clk='1'
_はrising_Edge(clk)
と書くことができます。);
_で終わっていることに注意してください。したがって、これにより、1ビットのレジスタが必要になります。
_ENTITY register1 IS PORT(
d : IN STD_LOGIC;
ld : IN STD_LOGIC; -- load/enable.
clr : IN STD_LOGIC; -- async. clear.
clk : IN STD_LOGIC; -- clock.
q : OUT STD_LOGIC -- output.
);
END register1;
ARCHITECTURE description OF register1 IS
BEGIN
process(clk, clr)
begin
if clr = '1' then
q <= '0';
elsif rising_Edge(clk) then
if ld = '1' then
q <= d;
end if;
end if;
end process;
END description;
_
そして、これを32ビットに拡張したい場合:
_ENTITY register32 IS PORT(
d : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
ld : IN STD_LOGIC; -- load/enable.
clr : IN STD_LOGIC; -- async. clear.
clk : IN STD_LOGIC; -- clock.
q : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) -- output
);
END register32;
ARCHITECTURE description OF register32 IS
BEGIN
process(clk, clr)
begin
if clr = '1' then
q <= x"00000000";
elsif rising_Edge(clk) then
if ld = '1' then
q <= d;
end if;
end if;
end process;
END description;
_