ブロックをVHDLでするのはです。カウンタのののはbit_vectorです。 bit_vector 、9ビットの
bit_vectorをしてそれをします。のなは、じデータにしてビットパリティのなどとをするがあるか
らです。ライブラリieeeのなnumeric_bitパッケージは、これをします。これは、 bit_vectorとくじ
をつunsignedをし、にunsignedのをるようにオーバーロードします。キャリーアウトとりしをする
ために、10ビットのunsignedテンポラリをします。
ライブラリのとエンティティ
library ieee;
use ieee.numeric_bit.all;
entity cooley is port(
clock: in bit;
up: in bit;
down: in bit;
di: in bit_vector(8 downto 0);
co: out bit;
bo: out bit;
po: out bit;
do: out bit_vector(8 downto 0) );
end entity cooley;
アーキテクチャのスケルトンはのとおりです。
architecture arc1 of cooley is signal cnt: unsigned(8 downto 0);
signal ncnt: unsigned(8 downto 0);
signal nco: bit;
signal nbo: bit;
signal npo: bit;
begin
<...processes...>
end architecture arc1;
それぞれの5つのブロックはプロセスとしてモデルされています。たちの2つのレジスタにするプ ロセスはににコーディングできます。 コーディングのでされたパターンをするだけです。えば、
パリティ・アウト・フラグをするレジスタは、のようにコードされる。
poreg: process(clock) begin
if rising_edge(clock) then po <= npo;
end if;
end process poreg;
co 、 bo 、およびcntをするもう1つのレジスタ
cobocntreg: process(clock) begin
if rising_edge(clock) then co <= nco;
bo <= nbo;
cnt <= ncnt;
end if;
end process cobocntreg;
ののみわせプロセスもにです
rename: process(cnt) begin
do <= (others => '0');
do <= bit_vector(cnt);
end process rename;
パリティでは、となループをできます。
parity: process(ncnt) variable tmp: bit;
begin
tmp := '0';
npo <= '0';
for i in 0 to 8 loop tmp := tmp xor ncnt(i);
end loop;
npo <= not tmp;
end process parity;
のコンビナトリアルプロセスはすべてのでもですが、されたをにすることでになります
u3d5: process(up, down, di, cnt) variable tmp: unsigned(9 downto 0);
begin
tmp := (others => '0');
nco <= '0';
nbo <= '0';
ncnt <= (others => '0');
if up = '0' and down = '0' then ncnt <= unsigned(di);
elsif up = '1' and down = '1' then ncnt <= cnt;
elsif up = '1' and down = '0' then tmp := ('0' & cnt) + 3;
ncnt <= tmp(8 downto 0);
nco <= tmp(9);
elsif up = '0' and down = '1' then tmp := ('0' & cnt) - 5;
ncnt <= tmp(8 downto 0);
nbo <= tmp(9);
end if;
end process u3d5;
2つのプロセスをマージすることもでき、みわせプロセスの1つをなりてですることができます。
ライブラリとパッケージのをむなコードとされたはのとおりです。
library ieee;
use ieee.numeric_bit.all;
entity cooley is port(
clock: in bit;
up: in bit;
down: in bit;
di: in bit_vector(8 downto 0);
co: out bit;
bo: out bit;
po: out bit;
do: out bit_vector(8 downto 0) );
end entity cooley;
architecture arc2 of cooley is signal cnt: unsigned(8 downto 0);
signal ncnt: unsigned(8 downto 0);
signal nco: bit;
signal nbo: bit;
signal npo: bit;
begin
reg: process(clock) begin
if rising_edge(clock) then co <= nco;
bo <= nbo;
po <= npo;
cnt <= ncnt;
end if;
end process reg;
do <= bit_vector(cnt);
parity: process(ncnt) variable tmp: bit;
begin
tmp := '0';
npo <= '0';
for i in 0 to 8 loop tmp := tmp xor ncnt(i);
end loop;
npo <= not tmp;
end process parity;
u3d5: process(up, down, di, cnt) variable tmp: unsigned(9 downto 0);
begin
tmp := (others => '0');
nco <= '0';
nbo <= '0';
ncnt <= (others => '0');
if up = '0' and down = '0' then ncnt <= unsigned(di);
elsif up = '1' and down = '1' then ncnt <= cnt;
elsif up = '1' and down = '0' then tmp := ('0' & cnt) + 3;
ncnt <= tmp(8 downto 0);
nco <= tmp(9);
elsif up = '0' and down = '1' then tmp := ('0' & cnt) - 5;
ncnt <= tmp(8 downto 0);
nbo <= tmp(9);
end if;
end process u3d5;
end architecture arc2;
もうしく
されたはでですが、できるいくつかのにしています。