無料のソフトウェアを使用してvhdlを操作する方法

のクラス 電子工学 通常、を使用して口述されます 人気のあるツール、だから私はいつも自分の仕事をするために数時間を費やしています FOSS。 このため、私は以下を共有することにしました ギア.

これはパンダクリスからの寄稿であり、毎週のコンテストの優勝者のXNUMX人になります。«Linuxについて知っていることを共有する«。 おめでとう!

必要なインストール

プログラムをコンパイルしてシミュレートするには、GCCに基づく無料のコンパイラであるGHDLを使用します。 シミュレーション結果を確認するには、GTKWAVEを使用します。 編集者として、ほとんどすべてのプログラミング言語を認識するGeanyをお勧めします。

sudo apt-get install ghdl gtkwave geany

サンプルプロジェクト

このコンパレータを例として使用してみましょう。

プロジェクトを作成する前に、すべてのファイルがホストされるフォルダーを作成することから始めましょう。 この場合、/ home / user / vhdlです。 そこで、プログラムのソースコードを.vhd拡張子で保存します。

次に、スクリーンショットに示すように、Geanyを使用してプログラムを作成します。

compare.vhdとして保存します。

Geanyがフォーマットを認識し、予約語に色を付けることができるように、拡張子.vhdを付けてプログラムを保存することを忘れないでください。

次に、シミュレーション用の信号を作成する必要があります。 このために、前のブロックを使用するコンポーネントを作成し、シグナルを指定します。

台詞 A <= 0011 ns後の「0」、0111 ns後の「5」、0111ns後の「10」。 時間内に入力信号を構成するものです

ファイルを/ home / user / vhdlに保存します。 次に、ターミナルを開いてコンパイルします。

ghdl -a compare.vhd

エラーメッセージがない場合、コンパイルは成功しています。

次に、「コンポーネント」をコンパイルします

ghdl -a compare_tb.vhd

エラーがない場合は、実行可能ファイルを作成します。

ghdl -e compare_tb

最後に、シミュレーションを実行し、結果を「compare.vcd」という名前のファイルに保存する必要があります。

ghdl -r compare_tb --vcd = compare.vcd

結果を確認するために、gtkwaveを使用します。

gtkwave compare.vcd

開いたら、Ctrlキーとマウスを使用して、関心のある信号をポイントし、挿入を押します。 次に、ベクトルをダブルクリックして、個別の信号を確認します。 次に、信号を右クリックして形式(バイナリ、XNUMX進、XNUMX進、XNUMX進など)を選択します。

必要に応じて、中央に正方形が付いた虫眼鏡ボタンでグラフを画面に合わせて調整します。

ALU:算術論理演算装置

では、もっと面白いことをしましょう。ALU(アリティメティックおよびロジックユニット)です。 論理ユニット、算術ユニット、マルチプレクサになります。

論理ドライブ(LoU.vhdl)

     LIBRARY ieee; IEEE.STD_LOGIC_1164.allを使用します。 IEEE.NUMERIC_STD.allを使用します。

ENTITY ルー IS
PORT(op1:IN std_logic_vector(7 DOWNTO 0);
op2:IN std_logic_vector(7 DOWNTO 0);
プロセス:IN std_logic_vector(3 DOWNTO 0);
res:OUT std_logic_vector(7 DOWNTO 0));
終わります。

louISのARCHITECTUREsynth2
SIGNAL a、b:UNSIGNED(op1'range);
SIGNAL c:UNSIGNED(res'range);
ベギン
プロセス(a、b、プロセス)
ベギン
ケースプロセスは
WHEN "0000" => c <= RESIZE((not a)、c'length);
WHEN "0001" => c <= RESIZE((a and b)、c'length);
WHEN "0010" => c <= RESIZE((a or b)、c'length);

WHEN "0011" => c <= RESIZE((a xor b)、c'length);
WHEN "0100" => c <= RESIZE((a nand b)、c'length);
WHEN "0101" => c <= RESIZE((aまたはb)、c'length);
その他の場合=> null;
エンドケース;
終了プロセス;

a <= UNSIGNED(op1);
b <=署名なし(op2);
res <= std_logic_vector(c);

終了シンセ 2;

算術演算装置(ArU.vhd)

     LIBRARY ieee; IEEE.STD_LOGIC_1164.allを使用します。 IEEE.NUMERIC_STD.allを使用します。

ENTITY ある IS
PORT(op1:IN std_logic_vector(7 DOWNTO 0);
op2:IN std_logic_vector(7 DOWNTO 0);
プロセス:IN std_logic_vector(3 DOWNTO 0);
res:OUT std_logic_vector(7 DOWNTO 0));
終了する;

aruISのアーキテクチャシンセ
SIGNAL a、b:UNSIGNED(op1'range);
SIGNAL c:UNSIGNED(res'range);
ベギン
プロセス(a、b、プロセス)
ベギン
ケースプロセスは
WHEN "0000" => c <= RESIZE((a + b)、c'length);
WHEN "0001" => c <= RESIZE((a --b)、c'length);
WHEN "0010" => c <= RESIZE((a * b)、c'length);

WHEN "0011" => c <= RESIZE((a / b)、c'length);
WHEN "0100" => c <= RESIZE((a + "1")、c'length);
WHEN "0101" => c <= RESIZE((b + "1")、c'length);
その他の場合=> null;
エンドケース;
終了プロセス;

a <= UNSIGNED(op1);
b <=署名なし(op2);
res <= std_logic_vector(c);

ENDシンセ;

マルチプレクサー(muxVector.vhd)

     LIBRARY ieee; IEEE.STD_LOGIC_1164.allを使用します。 IEEE.NUMERIC_STD.allを使用します。

エンティティ muxVector IS
PORT(ARUから:IN std_logic_vector(7 DOWNTO 0);
fromLOU:IN std_logic_vector(7 DOWNTO 0);
スイッチ:IN std_logic;
出力:out std_logic_vector(7 DOWNTO 0));
終了 muxVector;

muxVectorのアーキテクチャの変更は
ベギン
スイッチ選択付き
出力<=「0」の場合はARUから、その他の場合はLOUから。
変更を終了します。

ALUコンポーネント(aluComponent.vhd)

     LIBRARY ieee; IEEE.STD_LOGIC_1164.allを使用します。 IEEE.NUMERIC_STD.allを使用します。

ENTITYaluコンポーネントは
END aluComponent;

aluComponentのアーキテクチャinputs_aluComponentは

コンポーネントある
PORT(op1:IN std_logic_vector(7 DOWNTO 0);
op2:IN std_logic_vector(7 DOWNTO 0);
プロセス:IN std_logic_vector(3 DOWNTO 0);
res:OUT std_logic_vector(7 DOWNTO 0));
コンポーネントの終了;

コンポーネントルー
PORT(op1:IN std_logic_vector(7 DOWNTO 0);
op2:IN std_logic_vector(7 DOWNTO 0);
プロセス:IN std_logic_vector(3 DOWNTO 0);
res:OUT std_logic_vector(7 DOWNTO 0));
コンポーネントの終了;

コンポーネントmuxVector
PORT(ARUから:IN std_logic_vector(7 DOWNTO 0);
fromLOU:IN std_logic_vector(7 DOWNTO 0);
スイッチ:IN std_logic;
出力:out std_logic_vector(7 DOWNTO 0));
コンポーネントの終了;

SIGNAL outputARU:std_logic_vector(7 DOWNTO 0);
SIGNAL outputLOU:std_logic_vector(7 DOWNTO 0);
シグナルスイッチ:std_logic;
シグナルプロセス:std_logic_vector(3 DOWNTO 0);
信号出力:std_logic_vector(7 DOWNTO 0);
信号A:std_logic_vector(7 DOWNTO 0);
信号B:std_logic_vector(7 DOWNTO 0);

ベギン
u0:aru PORT MAP(A、B、プロセス、ARU出口);
u1:lou PORT MAP(A、B、プロセス、LOU出力);
u2:muxVector PORT MAP(outputARU、outputLOU、switch、output);

A <= 00000011 ns後の「0」、00000111 ns後の「5」、00000111 ns後の「10」、00001001 ns後の「15」、00000000 ns後の「20」、00000101 ns後の「25」、00001111後の「30」 ns、00000101ns後の「35」。
B <= 00000010 ns後の「0」、00000100 ns後の「5」、00000010 ns後の「10」、00000011 ns後の「15」、00000100 ns後の「20」、00000110 ns後の「25」、00001111後の「30」 ns、00000011ns後の「35」。
スイッチ<=「1」0ns後、「0」5 ns後、「1」10 ns後、「0」15 ns後、「1」20 ns後、「0」25 ns後、「1」30後ns、0 ns後の「35」、1ns後の「40」。
プロセス<= "0000" 0 ns後、 "0001" 5 ns後、 "0010" 10 ns後、 "0011" 15 ns後、 "0100" 20 ns後、 "0101" 25 ns後、 "0110" 30 ns ns;
END input_aluComponent;

プログラムの作業中にコマンドごとにコンパイルする時間を無駄にしないために、compilar.shというファイルを次の内容で同じフォルダーに保存します。

ghdl -a lou.vhd && ghdl -a aru.vhd && ghdl -a muxVector.vhd && ghdl -a aluComponente.vhd && ghdl -e aluComponent && ghdl -r aluComponent --vcd = alu&ghdlwave

ターミナルを開き、フォルダに入り、スクリプトを実行します。

cd / home / user / vhdl sh compile.sh

エラーがない場合、gtkwaveが開き、シグナルを確認できます。

これらのツールは私にとって非常に便利であり、クラスで使用する独自のツールよりも使いやすく、コンパイルに時間がかかりすぎると思われます。 ghdlを使用すると、コンパイルよりもウィンドウの切り替えに時間がかかります。

VHDLの詳細

vhdlを初めて使用する場合は、 ここで 彼らはデニールの基本的な例を持っています。

ビデオの例:
http://www.youtube.com/watch?v=feVMXsyLSOU

最新バージョンのUbuntuのリポジトリにはGHDLがないことに注意してください。 これは、プロジェクトページからLinux / Windows用にダウンロードできます。
http://ghdl.free.fr/site/pmwiki.php?n=Main.Download


コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:MiguelÁngelGatón
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。

  1.   ナッチョ

    GTKWaveがそれが表すゲート回路を提供する方法はありますか?