'디지털 논리 회로'에 해당되는 글 4건

  1. 2010/02/06 Altera SignalTap II embedded Logic Analyzer Tutorial
  2. 2009/12/29 Verilog HDL 입문하기
  3. 2008/03/01 캐리 저장 가산기(Carry Save Adder)
  4. 2008/01/30 산술연산 알고리즘
크리에이티브 커먼즈 라이선스
Creative Commons License
 회사에서는 자일링스사의 FPGA를 쓰는데.....자일링스에는 ChipScope라는게 있다. 몇일전에 어떻게 사용하지는 배웠는데....이게 뭐하는 거냐면 일종의 Logic Analyzer다. FPGA에서 내 디자인이 동작할 때 FPGA 내부의 특정 신호를 샘플링해서 PC에서 볼 수 있도록 뿌려준다. 그러니까 내부 시그널을 밖에서 볼 수 있도록 해준다 이거다능. 써보니까 정말 조터라능. 그런데 난 집에서는 알테라 FPGA를 가지고 논다. -_-;;
 
 좀 찾아보니까 알테라 FPGA에도 그것고 똑같은게 있떠라능. 그게 SignalTap II 다. 

 동작원리는 잘 모르겠지만....대충 이런거 같다. FPGA 내부의 여분의 공간에 logic analyzer 로직과 block ram을 추가해주고(툴이 해준다) FPGA에서 동작할때 trigger에 맞춰서 block ram에 샘플링된 데이타를 담아두고 JTAG으로 PC에 쏴주는거 같다.

 아님말구 -_-;

 아무튼 SignalTap II 를 어떻게 사용하는지 좀 보자능. 쉽다. 원래 하던데로 쿼터스로 프로젝트를 만들고....아래 코드를 복붙하자(8비트 카운터다). FPGA에서 돌려야 되니까...Device 설정이랑 Pin assignment 까지 다 해주고 Sysnthesis 까지만 돌리자.
 
module signal_trap(
		out      ,  // Output of the counter
		data     ,  // Parallel load for the counter
		load     ,  // Parallel load enable
		enable   ,  // Enable counting
		clk      ,  // clock input
		reset       // reset input
);

//----------Output Ports--------------
output [7:0] out;

//------------Input Ports-------------- 
input [7:0] data;
input load, enable, clk, reset;


//------------Internal Variables--------
reg [7:0] out;


//-------------Code Starts Here-------
always @(posedge clk) begin
	if (reset) begin
		out <= 8'b0 ;
	end else if (load) begin
		out <= data;
	end else if (enable) begin
		out <= out + 1;
	end
end	

endmodule  

 그 담에 Tools 메뉴에서 SignalTap II Logic Analyzer 를 눌른다. 그럼 다음 그림과 같은 화면이 뜰탠데....일단 보드에 전원을 넣고 PC와 연결을 한다. 우상단의 JTAG chain configuration에서 Hardware를 적당히 선택한다. 내 경우에는 USB-Blaster다. (그런데 따른거 쓰는 사람도 있나여? 뿌우 'ㅅ')



 그 다음 밑에 Signal configuration에서 Clock를 설정해 준다. 이 클럭으로 데이타를 샘플링하게 된다. 디자인에 사용하는 메인 클락으로 고르자. 그러니까 clk를 고르자는 말이다. 그다음 sample depth를 적당히 골라주자. 설정한 클럭이 sample depth 횟수만큼 뛸 동안 설정한 데이터를 샘플링하게 된다. 너무 많이 잡아서 내부 블럭램 사이즈를 넘어가 버리면 합성이 안된다. 적당히 하자.



 그 다음 trigger를 설정하자.  샘플링을 시작할 조건을 설정하는 거다. 우리는 enable이 high가 됐을 때로 설정하자능. 그리고 샘플링할 시그널도 설정한다. 뭐 다른거 볼꺼있나. counter의 출력 out를 설정하도록 하자능. Data enable이랑 Trigger enable를 아래 그림처럼 적당히 설정해주고...Signal Tap II 프로젝트를 저장한다. 



 그다음 쿼터스 화면으로 돌아가서 컴파일을 다시 한다. 그런데...나는 라이센스가 incremental compilation를 지원하지 않아서 컴파일이 안된다네 읭읭 -_-;;;;



 아무튼 컴파일이 되는 사람들은 생성된 sof로 fpga 프로그래밍을 해서 카운터를 FPGA에서 돌리자. 다시 Signal Tap II로 돌아가서 Run Analysis를 누른다. 그 다음 enable를 할당해 놓은 스위치를 high로 올리면 샘플링이 시작된다. Data 탭을 누르면 샘플링된 데이타를 볼 수 있다. 난 볼 수 없었따 -_-;;




 설정을 좀 만지만 될꺼 같은데.....읭읭 ㅠ.ㅠ


ps.
포스팅후에 검색을 좀 해보니까

SignalTap can tap two different types of signals, post-fitting and pre-shynthesis. Tapping post-fitting signals requires incremental compilation, which is not available in the Web edition.

Make sure the nodes you add to your STP file are pre-synthesis signals. You use the Node Finder filter to select "Signal Tap II: pre-synthesis".

이런말이 있다. 그래서  "Signal Tap II: pre-synthesis"에 있는 시그널만 탭핑하도록 해도 컴파일 못한다구 징징된다.

잘 만지니까 됐다.

저작자 표시 비영리 동일 조건 변경 허락
Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License
 
 요즘 틈틈히 베릴로그를 공부하고 있는데.....공부하는 동안에는 짤막짤막한 코드를 많이 짠다능. 이걸 일일히 쿼터스로 프로젝트 만들고 코딩하고 시뮬레이션 하기도 귀찬고 베릴로그는 icarus 라는 매우 좋은 오픈소스 시뮬레이터가 있기 떄문에 그걸 많이 쓰고 있삼.

 이 문서는 윈도우 환경에서 icarus verilog simulator를 사용할 수 있도록 환경을 꾸미는 방법을 설명하고 있삼. C 처음 배우는 사람이 빌드환경을 어떻게 꾸며야 되는지 궁금해하듯 hdl을 처음 배우는 사람은 어떻게 hdl 코드를 돌려볼 수 있는 환경을 꾸며야 되는지가 궁금할꺼삼. 내 생각에는 그러타는 얘기임.

 설치해야 될것은 총 세가지삼.

1. Icarus Verilog Simulator
2. GTKWave
3. Verilog Syntax Highlight가 되는 Editor

 3번 같은 경우에는 나는 VIM을 쓴다능. 각자 알아서 하도록 하고.....1번과 2번의 설치하고 환경변수를 설정하는 순서로 진행하자능. 1번과 2번은 모두 리눅스에서 돌아가는 바이너리가 배포될탠데...리눅스 사용자는 알아서 설치하삼.

 
 1. Icarus Verilog Simulator 설치

 
 저곳에서 가장 최신의 안정 버젼을 받아서 설치하자. 설치 과정중에 환경변수를 설정할지 말지 고르라고 하는데 지 멋대로 내 시스템의 환경변수를 만지면 기분나쁘니까 설정하지 말도로 하자능. 나는 아래와 같은 위치에 설치했심.

C:\iverilog

기본으로 설치되는 패스일꺼삼.


2. GTKWave 설치


 저곳에서 win32용 바이러를 받고 DLL이랑 TCL/TK 8.5 라이브러리도 받으삼. 다운받는 gtkwave.exe.gz는 gtkwave.exe로 이름만 바꾸면 된다능. 압축을 푸는게 아님 -_-;;;

 나머지 두개도 압축을 풀어서 나오는 파일들이랑 gtkwave.exe를 아래 폴더로 복사하라능.

C:\iverilog\bin


3. 환경변수 설정하기

C:\iverilog\bin

 위의 위치에 set_path.bat라는 파일을 하나 만들고 아래 내용을 복붙하삼.

@call :icarus_setup
@call :prompt_setup

@goto end

:icarus_setup
@echo Setting environment for Icarus Verilog Simulator
@set PATH=%PATH%;C:\iverilog\bin
@exit /B 0

:prompt_setup
@rem 자신만의 프롬프트 설정을 이곳에 적자. 아래는 내 설정임. 긔찬으면 안해도 상관없다.
@rem PROMPT $P$_$+$S$G$S
@exit /B 0

명령 프롬프트의 바로가긔를 하나 만든다음에 그 바로가긔 속성을 아래처럼 고쳐주자능.


 바로가긔를 더블클릭했을 때 아래와 비슷한 화면이 나오면 OK삼 >_<.



4. Verilog HDL 코드 작성해보기

 먼져 DUT Design Under Test 의 코드를 짜보자능. 일단은 보구 배긔라능. 파일이름은 add.v이고 적당한 자리에 생성하면 되심.


 ㅎㅎ 됐고, Testbench의 코드를 짜자능. 파일이름은 testbench.v이고 add.v랑 같은 위치에 만들면 되삼.


!!!  testbench.v 의 맨 마지막에 endmodule 가 안 찍혔심. add.v를 참고에서 한줄 적어주라능.  !!!

 우리가 작성성 DUT인 add 모듈에 여러가지 인풋을 넣어보고 어떤 아웃풋이 나오는지 시뮬레이션 해보는 거라능. testbench의 역활은 그거라능. 일단 콘솔창에 다음 명령어를 쳐서 컴파일을 하고

iverilog testbench.v -o testbench

 문제없이 컴파일이 되면 다음 명령어를 사용해서 실행하면 되삼. 그러면 결과가 화면에 나온다능.

vvp testbench

 아마 이런 화면이 나올꺼라능.


 아래 명령어를 쳐서 gtkwave를 실행시키면 wave form을 볼 수 있다능. gtkwave 사용법은 별로 어렵지 않으니 알아서 익히도록 하자능.

gtkwave wave.vcd



 끝이삼. 이제 당신도 베릴로그 hdl 사용자가 되었다능. 매우 축하한다능. 이젠 베릴로그 책을 사더 보던지 인터넷에서 튜토리얼 문서를 찾아서 보구 배우면 되는거심. 이카루스 베릴로그는 커맨드라인 명령어만 제공하니까..make 툴등을 사용해서 자동화된 빌드 환경을 꾸면 더욱 좋을꺼삼.
저작자 표시 비영리 동일 조건 변경 허락
Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License
캐리 저장 가산기는 한번에 2 개가 아닌 3 개의 숫자를 더할 수 있다. 그러나 CSA는 하나의 결과를 출력하는 것이 아니라 합과 한 조의 캐리 비트들을 출력한다. 아래 그림에서 Si는 비트 Xi, Yi, Zi 의 2진 합이고, Ci+1은 이 합에 의해 생성된 캐리이다. 최종합을 구하기 위해서는 C와 S를 가산기를 사용해 더해야 한다. 캐리 저장 가산기는 캐리 비트들이 가신기를 통해 전파되지 않음으로,  병렬 가산기보다 빠르다.

사용자 삽입 이미지

사용자 삽입 이미지



CSA에서 출력되는 캐리 C는 합 S의 왼쪽으로 한자리 쉬프트되어 나타나는 데 유의하자. 그 이유는 Si를 산출하는 가산기도 Ci+1을 산출하기 때문이다. 마지막 수치예제로 포스트를 마친다.


CSA 입력 CSA 출력
X = 0111 S = 1110
Y = 1011 C = 00110
Z = 0010

Final Sum = 01110(S) + 00110(C) = 10110
부호 확장된 S와 C를 더해서 최종합을 구했음에 유의하자

Posted by DMW
TAG csa, 가산기
크리에이티브 커먼즈 라이선스
Creative Commons License
쉬프트-더하기 알고리즘
C : 캐리
U, V : 곱셈 결과의 상위, 사위 비트들
X : 피승수
Y : 승수

C = 0, U = 0;
FOR i = n DOWNTO 0 DO
    IF Y0 == 1 THEN CU = U + X
    CUV를 오른쪽으로 선형 시프트 시킨다.
    Y를 오른쪽으로 순환 시프트 시킨다.
END


쉬프트-더하기 알고리즘 RTL코드
Y 레지스터를 없에고 V로 대신한다.
   1 : U <- 0, i <- n
V02 : CU <- U + X
   2 : i <- i - 1
   2 : shr(CUV)
Z'3 : GOTO 2
 Z3 : FINISH <- 1


Booth 알고리즘
U = 0; Y-1 = 0;
FOR i = n DOWNTO 0 DO
    IF Y0(Y-1)' THEN U = U + X' + 1
    IF Y0'(Y-1) THEN U = U + X
    UV를 오른쪽으로 산술 시프트 시킨다.
    Y를 오른쪽으로 순환 시프트시키고 Y0를 Y-1에 복사한다.
END


RTL 코드
            1 : U <- 0, Y-1 <- 0, i <- n
Y0(Y-1)'2 : U <- U + X' + 1
Y0'(Y-1)2 : U <- U + X
            2 : i <- i - 1
            3 : ashr(UV), cir(Y), Y-1 <- Y0
         Z'3 : GOTO 2
          Z3 : FINISH <- 1


간소화 버젼
 덧셈과 뻴셈의 간소화

    (Y0 xor Y-1) 2 : U <- U + (X xor Y0) + Y0
    X xor Y0는 X의 각 비트를 Y0와 xor 한다는 것을 의미함.
    RTL 코드
                      1 : U <- 0, Y-1 <- 0, i <- n
    (Y0 xor Y-1) 2 : U <- U + (X xor Y0) + Y0
                      2 : i <- i - 1
                      3 : ashr(UV), cir(Y), Y-1 <- Y0
                   Z'3 : GOTO 2
                    Z3 : FINISH <- 1


  여기에서 Y레지스터를 없에고 승수를 V에 저장하도록 해서 더욱 간소화 할 수 있다.
Posted by DMW
TAG algorithm