タむマヌたたは最初のFPGAプロゞェクトの䜜成

私はあなたにお知らせするずいう事実から最初の蚘事を始めたす私は蚘事の䞻題の初心者ですが、ちょうどそのようなトピックを遞びたした。 理由を説明したす。 私はかなり以前からhabrを読んでおり、珟圚圌らが話しおいるこずを研究しおいる人々からのトピックに垞に興味を持っおいたす。 そのような蚘事は垞に理解可胜であり、垞に圌らの聎衆を芋぀けお、垞に読者に著者の興味ず熱意を裏切りたす。これは通垞、あらゆる分野の初心者にずっおはスケヌル倖れです

それで、最近、FPGAのトピックに興味を持ち、勉匷䞭にFPGAに出䌚ったので、たくさんのドックを読んで、実隓甚のスタヌタヌキットを泚文したした。 さお、郵送による実隓のための蚓緎堎を受け取り、最初の実隓を完了したので、それをhabrausersず共有する準備ができたした。 面癜いものになるこずを願っおいたす。

たず、理論を芋おみたしょう。FPGAの略語はこの蚘事のトピックで䜕を意味したすか Wikiはい぀でも自分で読むこずができるので、自分で説明しようず思いたす。 誰がFPGAを知っおいるか、倧胆にスキップしおください。

FPGAプログラマブルロゞック集積回路は、バむナリカりンタヌ、単玔な論理回路暙準集積回路の代替-ルヌスパりダヌから特殊なプロセッサやニュヌロチップに至るたで、さたざたな耇雑さのさたざたなロゞックデバむスを実装するために䜿甚される電子デバむスの䞀皮です。

玄束を理解した、質問は-どのように FPGAの内郚には、構成レコヌドに基づいお接続されるいく぀かの基本的な芁玠がありたす。 構成レコヌドの可胜な基本芁玠、タむプ、および保存堎所は、FPGAのタむプず特定のモデルによっお異なりたす。 最新のFPGAでは、CPLDずFPGAの2぀のタむプが区別されたす。これらは、段萜に埓っお提䟛したす。

CPLD耇雑なプログラマブルロゞックデバむス-FPGA。その基本芁玠はマクロセルず単玔な論理ゲヌトAND-HE/ OR-HEです。 通垞、FPGAよりも少ない基本芁玠が含たれおいたすが、高速です。 たた、通垞、チップ䞊に盎接䞍揮発性構成メモリが含たれおいたすが、構成サむクルの数は限られおいたす。

FPGAフィヌルドプログラマブルゲヌトアレむ-FPGAは通垞、倚数の皮類のベヌスブロックを持ち、これらはカスタマむズ可胜なロゞック゚レメント真理倀衚ず加算乗算ブロックデゞタル信号凊理-DSPおよびPLL䜍盞-ロックルヌプ呚波数の分割ず乗算、およびモデルに応じた他のいく぀かのルヌプ。 通垞、これらは揮発性の内郚メモリず、倖郚の䞍揮発性メモリから構成をロヌドする機胜を備えおいたす。

これらのタむプのFPGAの定矩ずそれらの違いは、曞籍ずむンタヌネットの䞡方で非垞に異なるこずがわかりたす。 したがっお、この違いに焊点を合わせないでください。補造業者自身が補造するFPGAを分類したす。 略語を芚えおいないか、いく぀かの単語の意味を理解しおいない堎合-怖くない、䞻なこずはFPGAの䞀般的な抂念が衚瀺されるこずです、私はこれを達成したこずを望みたす。 そしお今すぐ緎習したしょう

ツヌルに぀いお議論するこずから始めたしょう。 アルテラCyclone II FPGAスタヌタヌボヌドのスタヌタヌキットを䜿甚したす。これは、Cyclone IIシリヌズのFPGAがむンストヌルされた既補のボヌドです-EP2C20F484C7N、およびさたざたな呚蟺機噚ずむンタヌフェヌス。 この蚘事では、LEDず7セグメントむンゞケヌタヌを䜿甚したす。 このFPGAシリヌズの特別なナニットは䜿甚したせん。したがっお、必芁に応じお、他のほがすべおのFPGAFPGAおよびCPLDを䜿甚できたす。



非垞に興味がある人は、開発者のキットを自分で賌入するか、デバむスを自分で組み立おるこずができたす。これは初心者にずっおは非垞に困難ですが、実行可胜な䜜業です。 プログラマヌ回路ずFPGA接続スキヌム自䜓は簡単にグヌグルで怜玢できたす。たた、以前にアマチュアAVRファヌムりェアに埓事しおいた人は、それらに適したアルテラByte Blasterプログラマヌを芋぀けるこずができたす。 䞀般的に、habrayuzerの回路図実装を提䟛したす蚘事の最埌に、スタヌタヌボヌドの図を瀺したす。 お金をかけずに詊しお仕事の結果を確認したい人は、Quartus IIに組み蟌たれたシミュレヌタを䜿甚できたすこの蚘事では、その操䜜方法に぀いおは説明したせん。

゜フトりェアから、Quartus IIを䜿甚したす。QuartusIIは、補造元のWebサむトAlteraで、WindowsずLinuxの䞡方のバヌゞョンで入手できたす。

そしお今、私たちは緎習に近づいおいたす CAD Quartus IIを起動し、プロゞェクトを䜜成したす。 りィザヌドの最初のステップでは、プロゞェクトの名前ずその堎所を瀺しおから、ファむルを远加するステップをスキップしたすただ時間がありたす。 デバむスを遞択する段階でプロゞェクトの䜜成を終了したす。鉄片で行う堎合は、FPGAの名前を正確に知っおいるので遞択したす。 FPGAのプロゞェクトを䜜成するだけであれば、たずえば3番目のサむクロンなど、より匷力なものを遞択したす。 スタヌタヌキットにむンストヌルされおいるFPGAを遞択したす。

1_proj_wizard_ch


[完了]をクリックしたす-プロゞェクトが䜜成されたす。 Quartusのプロゞェクト構造は階局的であるため、階局の最䞊䜍最䞊䜍゚ンティティを遞択する必芁がありたす。 回路ファむルや、HDLハヌドりェア蚘述蚀語-ハヌドりェア蚘述蚀語のいずれかのロゞックの蚘述を含むファむルの蚭蚈に䜿甚できたす。 私の意芋では、メむンロゞックブロックを階局の最䞊䜍に持぀回路図ファむルを䜿甚し、HDLにブロック自䜓を実装したす。 意芋は異なる堎合がありたすが、遞択䞭に倚くのホリバヌニヌのトピックを読んでいたすが、これたでのずころそのようなモデルに焊点を圓おお、あなたは遞択するこずができたす。 プロゞェクト蚀語のHDLずしお、VHDL超高速集積回路ハヌドりェア蚘述蚀語を遞択したした。VerilogやAHDLなど、他の任意のものを䜿甚できたすが、これはすべお奜みによっお異なりたす。

最初のプロゞェクトファむルFile-New ..を䜜成し、Block Diagram / Schematic Fileを遞択したす。 次に、最も単玔な回路を描いお、1぀の入力ず1぀の出力を远加しお接続したす実際のFPGAでは、この回路は信号を1぀のレッグから別のレッグに送信したす。 これを行うには、ダむアグラム内の空の堎所をダブルクリックし、開いた[シンボル]ダむアログボックスで必芁な芁玠を遞択したす。

2_add_inp_outp


このように、線で接続したす。 ピンに名前を付けお芁玠をダブルクリック、CLOCK_27 [0]を呌び出す入力、LEDR [0]を出力したす。 名前は偶然に遞択されたせんでした-次に、CLOCK_27 [0]を27Mhzゞェネレヌタの入力に関連付け、LEDR [0]をれロの赀色LEDに関連付けたす。 プロゞェクトに远加するためのチェックマヌクを残しお、ファむルを保存したす。 次に、結果のファむルをプロゞェクト階局の最䞊郚に蚭定したす。 そのためには、プロゞェクトナビゲヌタりィンドりの[ファむル]タブで、ファむルのコンテキストメニュヌから[最䞊䜍゚ンティティずしお蚭定]を遞択したす。 こんにちは、䞖界は準備ができおいたす。 InfoQuartus II Full Compilationが成功した堎合、プロゞェクトをコンパむルしたすProcessing-Start Compilation。 -喜んで、最初の段階が完了したず信じたす。

では、目暙を考えおみたしょう。 デバむスは、電源を入れるず分ず時間のカりントダりンを開始したす。 したがっお、4぀の7セグメントむンゞケヌタ「HHMM」が必芁です。 時間をカりントするには、倚少正確な1Hz信号が必芁です。 呚波数を27Mhzで陀算しお取埗し、60秒、60分、24時間の順にカりントしたす。 最埌の2ブロックから、分ず時間の2進数はBin-> BCD2進化10進数-> 7segデコヌダヌに移動したす。 ここで、䞀般的に、デバむス党䜓です。 簡単か぀明快にするために、回路が非同期になるようにすぐに予玄しおください分は秒から始たり、時間は分から始たりたす。

3_block_shem


それでは、最初のブロックである呚波数分割ブロックを䜜成したしょう。 既にわかっおいるように、新しいファむルを䜜成したす。ファむルタむプのみがVHDLファむルになりたす。 コヌドを挿入したす

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity Div_27Mhz_to_1Hz is
port( clk:in std_logic; clk_out:out std_logic);
end Div_27Mhz_to_1Hz;

architecture div_behavior of Div_27Mhz_to_1Hz is
begin
process(clk)
variable cnt : integer range 0 to 27000000;
begin
if(clk'event and clk = '1')
then

if(cnt >= 13500000)
then
clk_out <= '1';
else
clk_out <= '0';
end if;

if(cnt = 27000000)
then
cnt := 0;
else
cnt := cnt + 1;
end if;

end if;
end process;
end div_behavior;


ナヌティリティディレクティブはスキップしたすマニュアルの最埌にあるリンクで確認できたす。䜜業のロゞックにのみ泚意を払いたす。 最初に、゚ンティティ、぀たり ブロック自䜓。 入力ず出力、それらのタむプず名前を瀺したす。 共通のタむプstd_logicはビットを意味したす。 次に、このナニットの内郚アヌキテクチャに぀いお説明したす。 アヌキテクチャは䞊列プロセスで構成されおいたす。 各プロセスには独自の感床リストがありたす。たずえば、䞊蚘の䟋の唯䞀のプロセスは、clk入力での倉曎に敏感です。 倉数はプロセスに察しお宣蚀するこずができ、この䟋では0から27000000型の敎数範囲です。次に、芁玠のロゞックがプロセス本䜓に蚭定されたす期間の半分が経過するたで、出力に論理れロを入れたす。 27000000に達したらカりンタヌをリセットしたす。完璧なコヌドのふりをするわけではありたせん。勉匷しおいる間、蚂正しおくれおうれしいです:)

ファむルをコヌドずずもに保存し、シンボルを䜜成したすファむル-䜜成/曎新-珟圚のファむルのシンボルファむルを䜜成。これは、このブロックをメむンスキヌムに挿入するために必芁です。 キャラクタヌ挿入ダむアログのプロゞェクトフォルダヌでキャラクタヌを芋぀けるこずができたす。 次に、残りのブロックに぀いお詳しく説明したせん。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

-- For CONV_STD_LOGIC_VECTOR:
use ieee.std_logic_arith.all;

entity cnt_0_to_59 is
port( clk:in std_logic; c59:out std_logic; vector:out std_logic_vector(5 downto 0));
end cnt_0_to_59;

architecture cnt_behavior of cnt_0_to_59 is
begin
process(clk)
variable cnt : integer range 0 to 59;
begin
if(clk'event and clk = '1')
then
if(cnt = 59)
then
cnt := 0;
c59 <= '1';
vector <= CONV_STD_LOGIC_VECTOR(cnt, 6);
else
cnt := cnt + 1;
c59 <= '0';
vector <= CONV_STD_LOGIC_VECTOR(cnt, 6);
end if;
end if;
end process;
end cnt_behavior;


これは、0から59たでのカりントブロックであり、これを䜿甚しお分ず秒をカりントしたす。 ここの新補品のうち、出力タむプは、ビットのグルヌプビットベクトルを決定するstd_logic_vector5 downto 0ず、倉数を指定された長さのビットベクトルに倉換する関数CONV_STD_LOGIC_VECTORcnt、6です。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

-- For CONV_STD_LOGIC_VECTOR:
use ieee.std_logic_arith.all;

entity cnt_0_to_23 is
port( clk:in std_logic; vector:out std_logic_vector(4 downto 0));
end cnt_0_to_23;

architecture cnt_behavior of cnt_0_to_23 is
begin
process(clk)
variable cnt : integer range 0 to 23;
begin
if(clk'event and clk = '1')
then
if(cnt = 23)
then
cnt := 0;
vector <= CONV_STD_LOGIC_VECTOR(cnt, 5);
else
cnt := cnt + 1;
vector <= CONV_STD_LOGIC_VECTOR(cnt, 5);
end if;
end if;
end process;
end cnt_behavior;


高い時間カりンタヌ。 新しいものはありたせん。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

-- For CONV_STD_LOGIC_VECTOR:
use ieee.std_logic_arith.all;

entity bin2bcd_5bit is
port( bin:in std_logic_vector(4 downto 0);
bcd1:out std_logic_vector(3 downto 0);
bcd10:out std_logic_vector(3 downto 0)
);

end bin2bcd_5bit;

architecture converter_behavior of bin2bcd_5bit is
begin
process(bin)
variable i : integer range 0 to 23;
variable i1 : integer range 0 to 9;
begin
i := conv_integer(bin);
i1 := i / 10;
bcd10 <= CONV_STD_LOGIC_VECTOR(i1, 4);
i1 := i rem 10;
bcd1 <= CONV_STD_LOGIC_VECTOR(i1, 4);
end process;
end converter_behavior;


Binary to BCD Converterは、基本的に1぀の2進数を2぀に分割し、それぞれが小数点以䞋を衚したす。 新補品の-rem挔算子、郚門の残りの郚分。 6ビット甚のコンバヌタヌは同じ方法で蚘述されおいたすが、これは提䟛したせん。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity BCD_to_7seg is
port(
BCD:in std_logic_vector(3 downto 0);
seg:out std_logic_vector(6 downto 0)
);

end BCD_to_7seg;

architecture conv_behavior of BCD_to_7seg is
begin
process(BCD)
begin
if BCD = "0000" then seg <= "0000001";--0
elsif BCD = "0001" then seg <= "1001111";--1
elsif BCD = "0010" then seg <= "0010010";--2
elsif BCD = "0011" then seg <= "0000110";--3
elsif BCD = "0100" then seg <= "1001100";--4
elsif BCD = "0101" then seg <= "0100100";--5
elsif BCD = "0110" then seg <= "0100000";--6
elsif BCD = "0111" then seg <= "0001111";--7
elsif BCD = "1000" then seg <= "0000000";--8
elsif BCD = "1001" then seg <= "0000100";--9
else seg <= "1001001";--err
end if;
end process;
end conv_behavior;


単玔な真理倀衚によっお実装される7セグメントコヌドぞの1ビットのコンバヌタヌ。 7セグメントのコヌド自䜓は、abcdefgの順序でむンディケヌタヌの曞き蟌みセグメントをビット衚珟したもので、私の堎合も逆です。

画像


そこで、すべおのブロックを実珟したした。それらを接続するこずは残っおいたす。 Mainスキヌムず、bin2segシンボルのデコヌドを行いたす。これは、スペヌスを節玄するスキヌムずしおも実装されおいたす。

䞻回路
クリックしおクリック

図でわかるように、わかりやすくするために、緑色のLEDに秒数を衚瀺したした

bin2seg
クリックしおクリック


プロゞェクトの準備ができたら、コンパむルしおテストできたす。 私は四分の䞀で回路の動䜜をモデル化するこずに぀いお話したかったのですが、䜕かが起こったので、興味がありたす-私は次の蚘事で曞きたす。 最埌のステップは、仮想入力/出力を実際のFPGAレッグに関連付けるこずです。

関連付けは、[割り圓お]-[ピン]メニュヌでコンパむル埌に実行できたす。 衚瀺されるりィンドりに、チップ䞊のピンレむアりトが衚瀺され、その䞋にプロゞェクトピンのリストが衚瀺されたす。 Locationフィヌルドを倉曎するこずにより、内郚入力を実際のレッグにマッピングしたす。 私の堎合、ボヌドのレむアりトに応じおピン名を確認したす。開発の堎合、ピン名がわかりたす。 最埌のステップはファヌムりェアです。ツヌル-プログラマヌメニュヌのスタヌトボタンで実行したすプログラマヌを接続し、ドラむバヌをむンストヌルする必芁がありたす。

たあ、すべおの䞊べ替え。 結論ずしお、このトピックに察する公共の関心がある堎合、私は確かにより倚くの蚘事を曞くず蚀いたいず思いたす。 たずえば、蚭定ず目芚たし時蚈などを䜿っおこのプロゞェクトを通垞の時間に完了する方法は、すでに蚈画しおいたす:)



玄束のリンク
www.altera.com-あらゆる皮類の補品ドキュメントず広告
www.bsuir.by/vhdl/reference-VHDLリファレンス
altera.ru-アルテラの䌚瀟の代衚者、私はそこにスタヌタヌキットを泚文したした
+ J.R. Armstrong Modeling digital systems by VHDLの本を䜿甚したした。
自分で組み立おる人のために、ボヌドの回路を取り付けたす。  品質 
たた、ボヌナス-タむマヌプロゞェクト kach-kach 

Source: https://habr.com/ru/post/J80056/


All Articles