무료 소프트웨어를 사용하여 vhdl로 작업하는 방법

클래스 전자 공학 일반적으로 다음을 사용하여 지시됩니다. 인기있는 도구, 그래서 저는 항상 제 작업을하기 위해 몇 시간을 보냅니다. FOSS. 이러한 이유로 다음을 공유하기로 결정했습니다. 가이드.

이것은 pandacris의 기여로, 주간 대회의 우승자가되었습니다.«Linux에 대해 알고있는 정보 공유«. 축하합니다!

필요한 설치

프로그램을 컴파일하고 시뮬레이션하기 위해 GCC 기반의 무료 컴파일러 인 GHDL을 사용합니다. 시뮬레이션 결과를보기 위해 GTKWAVE를 사용합니다. 편집자로서 저는 거의 모든 프로그래밍 언어를 인식하는 Geany를 추천합니다.

sudo apt-get 설치 ghdl gtkwave geany

예제 프로젝트

이 비교기를 예로 들어 보겠습니다.

프로젝트를 만들기 전에 모든 파일을 호스팅 할 폴더를 만들어 보겠습니다. 이 경우 / home / user / vhdl. 여기에서 .vhd 확장자로 프로그램의 소스 코드를 저장합니다.

그런 다음 스크린 샷에서 볼 수 있듯이 Geany를 사용하여 프로그램을 작성합니다.

compare.vhd로 저장합니다.

Geany가 형식을 인식하고 예약어의 색상을 지정할 수 있도록 .vhd 확장자로 프로그램을 저장하는 것을 잊지 마십시오.

이제 시뮬레이션을위한 신호를 생성해야합니다. 이를 위해 이전 블록을 사용하는 구성 요소를 만들고 신호를 지정합니다.

A <= 0011ns 후 "0", 0111ns 후 "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 진수, XNUMX 진수 등)을 선택합니다.

필요한 경우 중앙에 사각형이있는 돋보기 버튼은 그래프를 화면에 맞게 조정합니다.

ALU : 산술 및 논리 장치

좋아, 이제 더 흥미로운 일을 해보자 : ALU (aritmethic and logic unit). 논리 단위, 산술 단위 및 멀티플렉서가됩니다.

논리 드라이브 (LoU.vhdl)

     라이브러리 ieee; IEEE.STD_LOGIC_1164.all 사용; IEEE.NUMERIC_STD.all 사용;

엔터티 루 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));
END 루;

lou IS의 아키텍처 synth2
신호 a, b : 부호 없음 (op1 '범위);
신호 c : 부호 없음 (재 범위);
BEGIN
PROCESS (a, b, 프로세스)
BEGIN
CASE 프로세스는
WHEN "0000"=> c <= 크기 변경 ((a가 아님), c'length);
WHEN "0001"=> c <= 크기 변경 ((a 및 b), c'length);
WHEN "0010"=> c <= 크기 조정 ((a 또는 b), c'length);

WHEN "0011"=> c <= RESIZE ((a xor b), c'length);
WHEN "0100"=> c <= RESIZE ((a nand b), c'length);
WHEN "0101"=> c <= 크기 조정 ((a 또는 b), c'length);
다른 사람 => null;
종료 사례;
프로세스 종료;

a <= UNSIGNED (op1);
b <= UNSIGNED (op2);
res <= std_logic_vector (c);

END 신디사이저2;

산술 단위 (ArU.vhd)

     라이브러리 ieee; IEEE.STD_LOGIC_1164.all 사용; IEEE.NUMERIC_STD.all 사용;

엔터티 아루 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));
END 아루;

아루 IS의 아키텍처 신디사이저
신호 a, b : 부호 없음 (op1 '범위);
신호 c : 부호 없음 (재 범위);
BEGIN
PROCESS (a, b, 프로세스)
BEGIN
CASE 프로세스는
WHEN "0000"=> c <= 크기 변경 ((a + b), c'length);
WHEN "0001"=> c <= 크기 조정 ((a-b), c'length);
WHEN "0010"=> c <= 크기 조정 ((a * b), c'length);

WHEN "0011"=> c <= RESIZE ((a / b), c'length);
WHEN "0100"=> c <= RESIZE ((a + "1"), c'length);
WHEN "0101"=> c <= 크기 조정 ((b + "1"), c'length);
다른 사람 => null;
종료 사례;
프로세스 종료;

a <= UNSIGNED (op1);
b <= UNSIGNED (op2);
res <= std_logic_vector (c);

END 신디사이저;

멀티플렉서 (muxVector.vhd)

     라이브러리 ieee; IEEE.STD_LOGIC_1164.all 사용; IEEE.NUMERIC_STD.all 사용;

ENTITY 먹스벡터 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));
END 다중화벡터;

muxVector의 아키텍처 변경은
BEGIN
스위치 선택
출력 <= '0'일 때 ARU에서, 다른 경우 LOU에서;
END 변경;

ALU 구성 요소 (aluComponent.vhd)

     라이브러리 ieee; IEEE.STD_LOGIC_1164.all 사용; IEEE.NUMERIC_STD.all 사용;

ENTITY alu 구성 요소 IS
END aluComponent;

aluComponent의 아키텍처 inputs_aluComponent IS

구성 요소 aru
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));
끝 구성 요소;

신호 출력 ARU : std_logic_vector (7 DOWNTO 0);
신호 출력 LOU : 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에서 0까지);
신호 B : std_logic_vector (7에서 0까지);

BEGIN
u0 : aru PORT MAP (A, B, 프로세스, ARU 종료);
u1 : lou PORT MAP (A, B, 프로세스, LOU 출력);
u2 : muxVector PORT MAP (outputARU, outputLOU, 스위치, 출력);

A <= 00000011ns 이후 "0", 00000111ns 이후 "5", 00000111ns 이후 "10", 00001001ns 이후 "15", 00000000ns 이후 "20", 00000101ns 이후 "25", 00001111 이후 "30" ns, 00000101ns 이후 "35";
B <= 00000010ns 후 "0", 00000100ns 후 "5", 00000010ns 후 "10", 00000011ns 후 "15", 00000100ns 후 "20", 00000110ns 후 "25", 00001111ns 후 "30" ns, 00000011ns 이후 "35";
스위치 <= 1ns 후 '0', 0ns 후 '5', '1ns 후'10 ', 0ns 후'15 ', 1ns 후'20 ','0ns 후 '25', 1 초 후 '30' ns, 0ns 후 '35', 1ns 후 40 ';
프로세스 <= 0000ns 후 "0", 0001ns 후 "5", 0010ns 후 "10", 0011ns 후 "15", 0100ns 후 "20", 0101ns 후 "25", 0110ns 후 "30" ns;
END inputs_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 / 홈 / 사용자 / 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 Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   나쵸

    GTKWave가 나타내는 게이트 회로를 제공하는 방법이 있습니까?