• 検索結果がありません。

2008のVHDLバージョンでのコーディング

ドキュメント内 vhdl #vhdl (ページ 47-51)

ブロックを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;

もうしく

されたはでですが、できるいくつかのにしています。

ドキュメント内 vhdl #vhdl (ページ 47-51)

関連したドキュメント