FPGA의뢰는 instructables.tistory.com/64 에 댓글주세요.
[verilog 문법@(posedge clk) 의미] :: Active High에 동작시키겠다는 의미이다.
[vhdl usb 모듈] :: ▶LINK 이 제춤을 구매하시면 됩니다.(의뢰 댓글 환영입니다.)
[fpga 프로그래밍 강좌] :: 강좌 문의 환영합니다.
★
(Lecture 01 참고)
module 이름 = 파일명과 일치시킬것 (Compile해서 Error 없나 체크)
Assignments >> Pin Planner 에서 핀 설정
다시 Compile 할것
drivers/usb-blaster 폴더를 찾아서 드라이버를 설치 (▶참고링크)
LED[7] LED[6] LED[5] LED[4] LED[3] LED[2] LED[1] LED[0]
238 237 236 235 234 233 226 225
SW 118,119,120
http://www.newtc.co.kr/dpshop/bbs/board.php?bo_table=m43&wr_id=3
VHDL = Verilog HDL
▼다음 내용들을 한 세트로 기억하면 좋다.
module Half_Adder(sum, c_out, a, b); //모듈이름 Half_Adder(파라미터들)
input a, b; //입력포트 선언
output sum, c_out; //출력포트 선언
wire c_out; //데이터타입 선언
reg sum; //데이터타입 선언(wire, reg, parameter 들이 있다.)
assign c_out <= a&b; //a와b를 &연산하여 c_out에 담는다.
always @ (a or b)
if(a == b)
sum <= 1'b0;
else
sum <= 1'b1;
endmodule //하나의 모듈선언을 끝냈다. ....C언어의 method라고 이해하시면 된다.
Verilog에서 사용하는 데이터형은 red(=레지스터), wire(=와이어), parameter(=파라미터)가 있다.
3.1.1 레지스터
reg sum; //1비트 레지스터
red [7:0] bus; //8비트 레지스터
3.1.2 와이어
wire c_out; //1비트 wire
wire [7:0] data; //8비트 wire
wire msb=data[7]; //data[7]를 msb로 재정의
3.1.3 파라미터
parameter SIZE=16; //정수로 파라미터 정의
reg[SIZE-1:0] A_BUS; //파라미터 값을 이용
parameter S_IDLE=4'b0001; //4비트로 파라미터 정의
3.2 논리/수치 표현
Verilog에서는 논리값을 0,1,x,z로 나타낼 수 있다.
0,1은 각각 논리0,1 이며
x는 알 수 없는 값, z는 하이 임피던스 상태로 값이 인가되지 않음을 의미한다.
ex) data=8'b0000_zzzz //data변수 8 bit LSB에 하이임피던스 Z 인가.
//여기서 b는 Binary이다.
숫자 표현방식
data = 8'b0011_0101; //53(Binary) .... 표기법 주의
data = 8'd53; //53(Decimal)
data = 8'h35; //53(Hex) .... 표기법 주의
4.1 산술연산
덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%)와 같은 기본적인 산술 연산을 지원합니다.
4.2 논리연산
AND(&&), OR(||), NOT(!)
4.2.2 비교연산자
>, >=, <, <=, ==, !=
(크다, 크거나같다, 작다, 작거나같다, 같다, Not Equal)
4.2.3 비트연산자 (=Bitwise Operator) (★논리연산자와 구분할것)
AND(&), OR(|), Invert(~), XOR(^)
a=4'b0101; b=4'b0011; 일때
c = a & b; // c = 4’b0001;
c = a | b; // c = 4’b0111;
c = a ^ b; // c = 4’b0110;
c = ~ a; // c = 4’b1010;
4.2.4 리덕션 연산자
ex) even_parity = ^data[7:0]; //짝수 패리티 검출
all_one_flag = &data[7:0]; //8'hff 일때 1 출력
all_zero_flag = ~|data[7:0]; //8'h00 일때 1 출력(Zero Flag)
(프로젝트생성 >> 컴파일 >> 핀매핑 >> 보드에 다운로드)
www.Altera.com에서 Quartus II Web Edition과 ModelSim을 다운받는다.
(▶바로가기 링크)
OK.
코드작성후 아까 New Project Wizard에서 생성한 폴더에 저장한다.
그리고 컴파일을 하면 Error가 발생할 것이다.
아래 그림처럼 Settings로 들어가서
Formal Verification에서 Tool name을 None으로 바꿔주야한다.
그래야 Compile시 Error가 사라진다.
▲오른쪽에서 4번째 버튼을 누른다.(Programmer)
▲Auto Detect버튼을 누르면 위 그림처럼 Chip이 감지된다.
이 상태에서 File을 더블클릭하고 sof파일을 얹어줘야 Start버튼이 활성화된다.
(File//Device//Checksum//Usercode//.... 이렇게 써있는곳에서 File을 더블클릭)
Mode는 JTAG방식으로 해두고 Start버튼을 눌러줘야 얹을 수 있다.
혹시 Auto Detect가 비활성화 상태라면
USB Blaster가 인식이 안된 상태이다.
장치관리자로 가서
C:\altera\10.1\quartus\drivers\usb-blaster 여기 경로로 지정해주고
나머지 순서는 (▶LINK) 를 참고하면 된다.
참고로...
*.pof는 Active Serial Programming 방식으로 ROM에 저장되서, 전원을 제거해도 코딩이 저장된다.
▼▼▼▼▼▼▼▼▼
module test_led (clk, reset, module_led);
input clk, reset; //입력
output module_led; //출력
reg [31:0] counter;
always @(posedge clk) //Active High
if(!reset) //If reset is not pressed
counter <=0;
else
counter <= counter+1;
assign module_led = counter[23];
endmodule
▲▲▲▲▲▲▲▲▲
Quartus에서는 Ctrl+L 이 Compilation 단툭키이다.
ToolBar에서 Assignments >> Pins에서 핀할당들을 확인한다.
Location은 실제 Board상에 연결되있는 pin number이다.
▼아래와 같이 setting 한다. & Save it.
CLk : PIN_28
RESET : PIN_1
LED : PIN_225
다시 Ctrl+L을 눌러서 Compile 한다.
FPGA에 Download하는 방법에는 2가지가 있다.
1.JTAG방식 : 전원공급중에는 동작하지만 꺼지면 다운로드했던것들이 날아간다.(Volitile)
2.ROM방식 : 속도가 느린 단점이 있지만 전원을 차단해도 Data가 보존된다.
Quartus II Wed Edition은 내장되어있는 시뮬레이터는 파형을 GUI 환경에서 만들 수 있어
편리한 장점이 있다.
정확하지만 매번 합성해야하는 단점이 있다.
ModelSim-Altera는 합성없이 시뮬레이션하는 장점이 있다.(타이밍 정확도는 좀 떨어진다.)
TIP
ModelSim으로 먼저 시뮬레이션을 돌리고, 마지막 테스트 단계에서 Quartus II에서 시뮬레이션을 하길 권한다.
▼▼▼▼▼▼▼▼▼▼
module test_led (clk, reset, led_out);
input clk, reset;
output [7:0] led_out;
wire [7:0] led_out; //데이터 타입은 red, wire, parameter 로 나뉜다.
reg [27:0] counter;
always @(posedge clk)
if(!reset)
counter <= 0;
else
counter <= counter+1;
assign led_out[7:0] = counter[9:2];
endmodule
▲▲▲▲▲▲▲▲▲▲
▼
timescale 1ns/10ps
module tb_test_led;
reg clk,reset;
wire[7:0] led_out;
initial
begin
#0 reset = 0;
#20 reset = 1;
end
initial
begin
#0 clk = 0;
end
always
#5 clk = ~clk
test_led ul
(
.clk(clk),
.reset(reset)
.led_out(led_out);
endmodule
)
▲
로직설계 : 시뮬레이션 단계에서 필요하다.
Verilog HDL로 작성한 기본단위 = 모듈
▼▼▼▼▼
'timescale 1ns/10ps
module tb_test_led; //모듈 선언
reg clk, reset; //Input Signal을 발생시키기위해 clk, reset을 register로 선언
wire[7:0] led_out; //출력신호를 wire형으로 선언
initial //▼reset신호 인가
begin
#0 reset=0;
#20 reset=1;
end
initial //▼clk신호 인가
begin
#0 clk=0;
forever
#5 clk=~clk;
end
test_led u1
(
.clk(clk),
.reset(reset),
.led_out(led_out)
);
endmodule
▲▲▲▲▲
Full Adder설계
LED켜고끄기 (★) Shift Register
FM-CY6S기반
▼▼▼▼▼
module test_led (clk, reset, board_led, module_led);
input clk, reset;
output [7:0] board_led;
output [7:0] module_led;
reg [7:0] board_led;
reg [31:0] clk_count;
always @(posedge clk)
if(!reset)
clk_count <= 0;
else
clk_count <= clk_count + 1;
always @(posedge clk)
if(!reset)
board_led <= 0;
else
board_led <= clk_count[29:22];
assign module_led = ~clk_count[29:22];
endmodule
▲▲▲▲▲
예제 소스 (always 문 사용)
SW pin 87 / LED pin 68 (코드상에선 핀번호 언급이 없다.)
▼▼▼▼▼▼▼▼▼▼
module test_led ( clk, reset, board_sw, board_led );
input clk, reset;
input board_sw;
output board_led;
reg board_led;
always @(posedge clk)
if(!reset)
board_led <= 0;
else
if(board_sw == 1)
board_led <= 1;
else
board_led <= 0;
endmodule
▲▲▲▲▲▲▲▲▲▲
ADC