【FPGA】2주차 예습 보고서

发布于:2022-12-15 ⋅ 阅读:(470) ⋅ 点赞:(0)

1.HDL이 무엇인지 조사하고 Verilog이외의 HDL에 대하여조사하시오

2.Verilog의 역사와 발전 과정을 조사하시오

3.Verilog의 기본적인 구조와 문법에 관하여 조사하시오

1. HDL이 무엇인지 조사하고 Verilog이외의 HDL에 대하여조사하시오

HDL 의 전칭 영어로 Hardware Description Language 이다. 즉 하드웨어 기술 언어이다. HDL는 전자회로를 정밀하게 기술하는 데 사용하는 컴퓨터 언어이다. 회로의 원하는 동작을 기술할 수도 있고, 원하는 회로 구조를 기술할 수도 있으며 시뮬레이션을 통해 제대로 동작하는지 검증할 수도 있다. 지금 넓범위에서 사용하는 HDL는 VHDL, Verilog 과 ABEL이다. 먼저 Verilog이외의 HDL, VHDL와 ABEL에 대해 설명하겠다.

 VHDL:VHDL는 1982년에 출시했는 하드웨어 기술 언어이다. 전칭 영어로 Very-High-Speed Integrated Circuit Hardware Description Language 이다. 1987년말에는 IEEE와 미국국방부한테 학인한 후에 표존 하드웨어 기술 언어를 되었다. IEEE가 VHDL의 표준 버전 IEEE-1076을 발표한 후에 많이 EDA 회사는  자체 VHDL 설계환경을 끓임없이 출시했다.  또안 설계 도구가 VHDL과 인터페이스할 수 있는 말을 발표했습니다. 그 후에 VHDL은 전자 설계 분야에서 널리 환영을 받았어 들여졌으며 점차 원래의 비표준 하드웨어 설명 언어를 대체했습니다.

 ABEL:ABEL 전칭 영어로 Advanced Boolean Equation Language 이다.  1983년에 워싱턴 Redmond에 있는 데이터 I/O 에서 개발되었다. 아벨은 동시에 실행되는 연산, 진리표 논리 연산, 순차적 상태 머신을 모두 지원하며, DEC의 Macro-11에 기반한 전처리기도 지원한다. 동일한 시대에 발명된 PLD 설계 언어로는 CUPL과 PALASM이 있다. 하지만 더 큰 FPGA의 출현으로 PLD 언어는 인기를 잃고 VHDL이나 베릴로그 같은 하드웨어 기술 언어 (HDL)가 인기를 얻게 된다. 그럼에도 불구하고 아벨은 전 세계 수천 개의 PLD 프로그래머에 의해 앞으로 20년은 계속 사용될 것으로 전망된다.일련의 획득을 통하여, 현재 아벨은 자이링스(Xilinx) 회사가 소유하고 있다.

2. Verilog의 역사와 발전 과정을 조사하시오

시간이 흐르면서 HDL은 20년 이상 개발되어 왔다. 현대 업계 표준(IEEE표준)은 주로 VHDL과 Verilog HDL 두 가지 HDL이다. 다음으로 VerilogHDL의 개발 이력과 특징을 소개한다.

Verilog HDL은 1983년 말 GDA(Gateway Design Automation)의 Phil Moorby에 의해 개척되었다. 처음에는 하나의 시뮬레이션 및 검증 도구만 설계되었다. 회사의 시뮬레이션 및 시뮬레이터 제품의 광범위한 사용으로 Verilog HDL은 점차적으로 실용적인 언어 많은 디자이너들이 인정한다. 그 후 관련 결함 시뮬레이션 및 타이밍 분석 도구가 연속적으로 개발되었다.

1985년 Moorby는 세 번째 상용 시뮬레이터인 Verilog-XL을 출시하여 큰 성공을 거두었고 Verilog HDL이 빠르게 대중화되고 적용되었다.

1989년에 CADENCE는 GDA를 인수하여 VerilogHDL을 회사의 독점 특허로 만들었다.

1990년, 언어의 인기를 높이기 위해 Verilog HDL 언어가 더 잘 알려지기 위해 공개 도메인으로 푸시되었다.OVI(Open Verilog International)는 Verilog의 개발을 촉진하는 국제 기구이다.

1992년 OVI는 Verilog OVI 표준을 IEEE 표준으로 홍보하기로 결정했다. 이 프로모션은 마침내 성공적이었고 Verilog 언어는 1995년 IEEE Std1364-1995라는 IEEE 표준이 되었다.

발전 과정

  • 1983년  GDA사의 Philip Moorby는 Veriog 언어를 개척했습니다. Moorby는 나중에 verilog HDL-XL의 수석 디자이너이자 케이던스의 첫 번째 파트너가 되었다.
  • 1984년  Moorby는 Verilog 시뮬레이션을 위한 최초의 EDA 도구를 설계했다.
  • 1986년  Moorby는 빠른 게이트 레벨 시뮬레이션을 위한 XL 알고리즘을 제안했다. Verilog-XL의 성공으로 verilog는 빠르게 발전했다.
  • 1987년  synonsys는 verilog를 합성 도구의 입력으로 사용하기 시작했다.
  • 1989년  케이던스는 GDA를 인수했고, 베릴로그는 케이던스의 사유 재산이 되었다.
  • 1990년  케이던스는 verilog를 공개적으로 발표했습니다. 이후에 설립된 OVI는 Verilog 개발 및 표준 공식화를 담당한다.
  • 1993년  거의 모든 ASIC 제조업체가 verilog를 지원하기 시작했으며 verilog-XL을 최고의 에뮬레이터로 간주했습니다. 동시에 OVI는 verilog-2.0 사양을 도입하여 IEEE에 제출했는다.
  • 1995년  IEEE는 Verilog 표준 IEEE1364-1995를 발표했다.
  • 2001년  IEEE는 Verilog 표준 IEEE1364-2001을 발표하여 몇 가지 새로운 기능을 추가했지만 검증 능력과 모델링 능력은 여전히 ​​취약한다.
  • 2005년  IEEE는 2001 버전에 대한 약간의 수정만 포함된 Verilog 표준 IEEE1364-2005를 발표했다.  IEEE는 2005년 SystemVerilog의 표준 IEEE1800-2005를 발표하여 검증 능력과 모델링 능력을 크게 향상시켰다.
  • 2009년  IEEE는 SystemVerilog와 verilog를 하나의 표준으로 결합한 SystemVerilog 표준 IEEE1800-2009를 발표했다.
  • 2012년  IEEE는 SystemVerilog의 표준 IEEE1800-2012를 발표했다.
  • 2017년  IEEE는 SystemVerilog의 표준 IEEE1800-2017을 발표했다.

3. Verilog의 기본적인 구조와 문법에 관하여 조사하시오

기본적인 구조

언어를 배우려면 문법을 이해해야 한다. 고급 언어에 대해 그 근본은 인간의 논리이다. 그 덕분에 학습자는 자신의 논리로 의하며 기능을 구현할 수 있다.하지만, 하드웨어 기술 언어에 대해 그 내부 법칙을 알어야 기능을 구현하여 설계할 수 있다. Verilog는 신호 입력, 처리와 출력을 구현하고 싶어면  모든 신호는 디자인과 연결되어야 한다. 컴파일러는 관련 없는 신호를 있다면 자동으로 제외하고 경고를 발행하겠습니다. 동시에 각 신호는 실제 하드웨어 리소스를 차지하고 사용되는 신호가 적을수록 하드웨어 규모가 작아진다.

그러므로 Verilog의 문법적 원리는 신호가 정확해야 한다. 

기본의 문법은 다음과 같다.문법은 C언어와 같다. 예를 들면 if, while 조건문은 같은 구조이 있다. 출력와 연산자도 거의 같다.

하지만, Verilog 구절을 시작하는 위치, 끝는 위치 { } 로 사용하지않고 Begin 와 End 로 대신한다.

① 첫 번째는 하드웨어의 본체를 선언하는 데 사용되는 module 이다. Verilog 코드에 module을 작성하고 모듈 이름을 파일 이름과 일관되게 유지하십시오. endmodule을 추가하면  범위를 구성된다. (이것은 HTML의 태그와 유사)

module
...
endmodule

② 두 번째는 input 과 output 입니다. 앞서 언급했듯이 verilog는 신호 처리를 목표로하므로 신호 선언이 있다. 입출력은 이 모듈을 선언하는 외부 연결 신호이다. 반면에 inout 도 있다. 내부적으로 선언된 다른 모든 것은 내부 신호이다.

③ 세 번째는 wire와 reg이다, 이 부분은 신호의 종류이다. C 언어의 데이터 유형과 유사하게 reg 및 wire는 두 가지 다른 유형의 변수이다.

④ 네 번째는 assign 와 always, 그는 시스템 기능에 해당할 수 있는 신호 처리 기능이다. (C의 printf등 와 같아) 

이상 4까지는 부분이 습득하면 기본의 verilog 코드를 실현할 수 있다.

코드 예시:

module mux(out, a, b, sel);   // Semicolon가 있어야 한다.
    input a, b, sel;
    output out;
    reg out;
    always @(a or b or sel)
        if (!sel) out = a;
        else out = b;

endmodule  // end

위의 코드는 선택기를 설명합니다. 즉, sel=0, out=a, 그렇지 않으면 out=b 입니다.

논리값:
논리 0: 회로 GND에 해당하는 낮은 수준을 나타내다.
논리 1: 우리 회로의 VCC에 해당하는 높은 수준을 나타내다.
논리 X: 알 수 없음을 의미하며 높은 수준 또는 낮은 수준일 수 있다.
로직 Z: · 고임피던스 상태를 나타내며 외부 여기 신호(입력 신호)가 없으며 부동 상태(하이 및 로우 레벨이 연결되지 않음)입다.


Verilog 숫자 형식에는 binary, octal, decimal 및 hexadecimal이 포함됩니다. 일반적으로 사용하기 많은 것 binary, decimal 및 hexadecimal 이다.

bin 표현은 다음과 같다:  4'b0101은 4비트 bin 0101을 나타내다.
oct 표현은 다음과 같다:   4'o7은 4자리 8진수 7(bin 0111)을 나타내다.
dec진수 표현은 다음과 같다. 4'd2는 4자리 dec 2(bin 0010)를 의미이다.
hex진수 표현은 다음과 같다. 4'ha는 4개의 hex 숫자 a(bin 1010)를 의미이다.

참고: 값이 비트 너비와 밑수를 나타내지 않으면 기본값은 32비트 너비의 십진수(32'd), 일반적인 사용법: 16'b1001_1010_1010_1001=16'h9AA9

변수이름

식별자: 모듈 이름, 포트 이름, 신호 이름 등을 정의하는 데 사용되다. 식별자 명명 규칙은 다음과 같다.

식별자는 문자, 숫자, $ 및 _(밑줄) 기호의 조합일 수 있다
그러나 식별자는 C 언어와 마찬가지로 숫자로 시작할 수 없다.
식별자는 대소문자를 엄격히 구분하고 대소문자를 구분한다.
혼합 케이스는 권장하지 않다.
공통 내부 신호는 모두 소문자로 사용하는 것이 좋다.
네이밍은 신호의 의미를 가장 잘 반영하며 간결하고 명확하며 이해하기 쉽면 좋겠다.

예:  ① 의미 있는 식별자: 합계      ② 밑줄을 사용하여 단어 구분: cpu_addr     ③ 접두사 또는 접미사 사용: clock clk_50 또는 sys_clk.

기본 데이터 유형

기본 데이터 유형 요람

Verilog에서 주요 데이터 유형은 다음과 같습니다.
1. 데이터 타입 등록 (resgiter)
2. Wire net 데이터 타입 (wire)
3. 파라미터 데이터 타입 (parameter)
4. 정수 (integer 

참고: 디지털 회로에서 실제로 작동하는 데이터 유형은 register와 wire 유형이다.

resgiter 유형

레지스터는 추상 데이터 저장 단위를 나타내며 레지스터에 저장된 값은 대입문을 통해 변경할 수 있다 레지스터 데이터 유형의 키워드는 reg이고 reg 유형 데이터의 기본 초기값은 불확정 값 x.

reg [9:0] delay_cnt;
     reg key_reg;

reg 유형의 데이터는 항상 문과 초기 문에만 할당할 수 있다. 절차 문이 순차 논리를 설명하는 경우, 즉 always 문에 순차 클록 신호가 있으면 레지스터는 해당 플립플롭이 된다. 레지스터는 해당 하드웨어 연결이 된다.

Wire net 유형

와이어 메쉬 데이터 유형은 게이트와 같은 구조적 엔티티 간의 물리적 연결을 나타나다.net 유형의 변수는 값을 저장할 수 없으며 해당 값은 이를 구동하는 요소에 의해 결정한다. 넷형 변수의 요소를 구동하기 위한 논리 게이트, 연속 할당문(assign) 등이 있다.네트형 변수에 구동 요소가 연결되지 않은 경우 변수는 Z인 고임피던스입니다.Wire net 자료형은 wire type과 tri type이 있으며 가장 많이 사용되는 것은 wire type이다.

parameter  유형

parameter 변수는 실제로 상수이며 Verilog HDL의 parameter 변수로 정의된다. 한 번에 여러 parameter 변수를 정의할 수 있으며 parameter 변수는 쉼표(,)로 구분해야 한다. 각 parameter 변수 정의의 오른쪽은 상수 표현식이어야 한다.

parameter H_FRONT = 11’d11;
parameter H_BACK = 11’d2;

파라미터 데이터는 종종 상태 머신의 상태, 데이터 비트 폭 및 지연 크기 등을 정의하는 데 사용된다. 상수를 나타내기 위해 식별자를 사용하면 프로그램 가독성과 유지보수성을 향상시킬 수 있다. 모듈이 호출될 때 호출된 모듈에 정의된 parameter 변수는 parameter 변수 전달에 의해 변경될 수 있다.

Verilog 연산자

산술 연산자

Verilog의 연산자는 기능에 따라 다음 유형으로 나눈다:

산술 연산자, 관계 연산자, 논리 연산자, 조건 연산자, 비트 연산자, 시프트 연산자,연결 연산자.

연산자 사용법 설명
+ a + b a plus b
- a - b a min b
* a * b a mult b
/ a / b a div b
% a % b a mod b

관계 연산자

연산자 사용법 설명
> a > b a big than b
< a < b a small than b
>= a >= b a big than b or equal to b
<= a <= b a samll than b or equal to b
== a == b a equal to b
!= a != b a not equl to b

Logic 연산자

연산자 사용법 설명
! !a not a
if a is 0,then a is not 1。
&& a && b a and b
if  a and b is all  1,a&&b result will be 1,true
|| a || b a orb
if a or b have one is 1,a||b result is 1,true

조건연산자

연산자 사용법 설명
?: a ? b : c if a is true,choose b,or will choose c

Binary 연산자

연산자 사용법 설명
~ ~a Invert each bit of a
& a & b AND each bit of a with the same bits of b
| a | b OR each bit of a with the same bit of b
^ a ^ b XOR each bit of a with the same bit of b

Shift 연산자

연산자 사용법 설명
<< a << b let a move left b times
>> a >> b let a move right b times

결합 및 반복 연산자

연산자 사용법 설명
{} {a,b} Concatenate the a and b bits as a new signal

연산자 우선 순위 (순위로 표시)

연산자 우선급
!、~ 최고
*、/、%
+、-
<<、>>
<、<=、>、>=
==、!=、===、>==
&
^、^~
|
&&
||
? 최저

많이 사용하는 키워드

키워드 含义
module 모듈 정의 시작
input 입력 포트 정의
output 출력 포트 정의
inout 양방향 포트 정의
parameter 신호의 parameter변수 정의
wire wire 신호 정의
reg reg 신호 정의
always reg 신호 문을 생성하는 키워드
assign wire 신호 문을 생성하는 키워드
begin 명령문 시작 플래그
end 명령문 끝 플래그
edge / posedge / negedge 순차 회로 시작 플래그
case case 명령문시작 플래그
default case 문에 대한 기본 분기 플래그
endcase 사건 진술의 끝
if if / else 문 플래그
else if / else 문 플래그
for for 문 플래그
endmodule 모듈  정의  정지

Verilog 구문

`Timescale

`timescale 명령은 명령 다음에 모듈의 시간 단위와 시간 정밀도를 지정하는 데 사용된다.

‘timescale <시간단위>/<시간정밀도>

주의사항:   '타임스케일'을 사용할 때 앞부분은 " ` "입니다. 키보드의 왼쪽 상단 모서리에서 숫자 키 "1" 앞의 키는 영어로 누를 수 있다. 작은따옴표가 아닙니다', 혼동하지 마십시오 . 잘못된 버튼을 누르면 컴파일 시 문제가 발생하겠다!

사용 요구:  위의 `timescale 를 지키 외에도 다음 3 가지 사항을 준수해야 한다:

  • 시간 정밀도 값은 시간 단위 값보다 클 수 없다.
  • 시간 단위 수 및 시간 정밀도 매개변수 값은 정수여야 하며 유효한 값은 1, 10, 100이다.
  • 단위는 s, ms, us, ns, ps, fs일 수 있다

사용법 예시:

`timescale 1ns/1ps : 모듈의 모든 시간 값이 1ns의 정수배임을 나타내며, 지연 시간은 소수점 3자리의 실수로 표현할 수 있음(시간 정밀도 1ps는 시간 단위 0.001ns, 1ps =10^-3 * 1ns, 즉 지연시간의 최소 분해능은 1000분의 1나노초이므로 소수점 이하 3자리의 실수임).

`timescale 10us/100ns : 모듈의 모든 시간 값이 10us의 정수배임을 나타내며, 지연 시간은 소수점 1자리의 실수로 표현할 수 있음(시간 정밀도 100ns는 시간 단위 0.10us, 100ns) =10^-2 * 10us, 즉 지연시간의 최소 분해능은 100분의 1마이크로초이므로 소수점 이하 2자리의 실수이다.

assign

assign 그 뒤에 신호 이름은 단일 신호 또는 다른 신호 네트워크의 연결일 수 있다. 드라이브 강도 및 지연은 선택 사항이며 실제 하드웨어로 합성하기보다는 데이터 흐름 모델링에 주로 사용되는다. 오른쪽의 표현식이나 신호는 네트에 할당되거나 왼쪽의 네트의 표현식에 할당되는다.

assign <net_expression> = [drive_strength] [delay] 
           <expression of different signals or constant value>

assign 사용하려면 다음 3 가지 사항을 준수해야 한다:

LHS(lvalue)는 항상 와이어 유형의 스칼라 또는 벡터 네트워크이거나 스칼라 또는 벡터 네트워크의 연결이어야 하며 reg 유형의 스칼라 또는 벡터 레지스터가 아니어야 한다. RHS는 스칼라 또는 벡터 레지스터와 함수 호출을 포함할 수 있다. RHS의 피연산자의 값이 변경될 때마다 LHS가 새 값으로 업데이트된다. assign 문은 연속 할당이라고도 하며 항상 활성 상태이다.

assign영향을 빼고 싶다면 deassign구문을 사용할 수 있다.

Explicit assignment & Implicit assignment:

wire mynet=enable&data;    \equiv    wire mynet; = assign mynet = enable & data;

예를 들면: 

wire [1:0] a;
assign a = x & y;       // Explicit assignment
wire [1:0] a = x & y;   // Implicit assignment

와이어형 네트워크에 값을 할당할 때 명시적 연속 할당이라고 하고, 정의 시 연속적으로 할당하면 보이지 않는 연속 할당이라고 하다.

always

1. always@ 뒤에 있는 내용은 민감한 변수아더. always@()의 민감한 변수는, 즉, 이 always 블록의 입력 변수에 따라 합성기에 의해 민감한 변수가 자동으로 추가된다. 즉, 모든 변수는 민감한 목록이므로 스스로 고려할 필요가 없다. 일반적으로 always@(*)는 내부의 문이 조합 논리임을 의미합니다. * 민감한 변수 대신.

2. @가 없으면 특정 조건이 충족될 때까지 실행하지 않고, 한 번 실행한 직후에 다음 번을 실행하고, 계속해서 그 실행을 반복한다는 의미이다. 일반적으로 시계는 다음과 같이 시뮬레이션의 tb 파일에 생성된다.

always #25 clk_50MHz = ~ clk_50MHz;   // 25ns마다 레벨 반전

inital 

초기 명령문 내의 모든 명령문은 초기 블록을 형성한다. 초기 블록은 시뮬레이션 0시부터 실행되며 전체 시뮬레이션 과정에서 한 번만 실행된다.

모듈이 여러 개의 초기 블록을 포함하는 경우 이러한 초기 블록은 시뮬레이션의 0시간부터 동시에 실행되며 각 블록의 실행은 독립적이다.

한 블록에 여러 개의 action 문이 있는 경우 이러한 문을 함께 그룹화해야 하며 일반적으로 begin 및 end 키워드를 사용하여 블록 문에서 이들을 결합한다.

시뮬레이션 중에 무한 반복되는 always 문과 달리, inital 문은 시뮬레이션이 실행되는 동안 한 번만 실행된다.
inital문장의 begin-end  블록은 나열된 순서대로 실행되는 절차 문장으로 구성된다.

inital begin
Block or nonBlocking Statements
end

Non blocking statement

Non-Blocking(Non_Blocking) 할당 모드는 블록이 끝날 때까지 할당 작업을 완료하지 않다. b의 값은 즉시 변경되지 않다. 순차 회로에서 always 블록의 reg 신호는 일반적으로 non-blocking 문을 할당에 사용한다. 이러한 방식의 할당은 즉시 실행되지 않다. 즉, always 블록의 다음 문이 실행된 후 b는 같지 않지만 원래 값을 유지한다. 할당은 항상 블록이 끝난 후에 이루어진다.

module no_blocking (clk, a ,c
                   );
    input  clk;
    input wire a;
    output reg c;
    reg b;

        always @(posedge clk) begin
            b <= a;
            c <= b;
        end
endmodule

Blocking statement

대입문이 실행된 후 블록이 종료되고 대입문이 실행된 직후 b 값이 변경된다. 차단 할당은 다음과 같다:

module blocking (clk, a ,c
                   );
    input  clk;
    input wire a;
    output reg c;
    reg b;

        always @(posedge clk) begin
            b = a;
            c = b;
        end
endmodule

Verilog Blocking 문법 예시

Noblocking statement

`timescale 1ns / 1ps

module inv;

reg a,b,clk;

initial begin
    a = 0;
    b = 1;
    clk = 0;
end

always clk = #5 ~clk;

always @(posedge clk)begin
    a <= b;
    b <= a;
end

endmodule

Blocking statement


网站公告

今日签到

点亮在社区的每一天
去签到