오늘은 Up/Down Sampling과 Serial to Parallel and Parallel to Serial을 해보자.
첫번째 예제를 만들어보자.
이렇게 연결하고 Counter Limit 블럭의 Upper limit을 10으로, Gateway In을 fix 8 0 로 해두자.
시뮬레이션 돌리면 이렇게 나온다.
시뮬레이션 Stop time을 30으로 해서 돌린거다.
다음은 Gateway In과 Out 사이에 Down Sample과 Up Sample을 넣고 돌려보자.
먼저 Down Sample
샘플링 레이트가 2로 기본 설정되어있어서 두번에 한번 샘플링을 한다.
Up Sample은 에러가 난다.
"시스템 제너레이터 토큰의 period 설정이 적절치 않다. 1에서 1/2로 바꾸기 바람"
이렇게 친절히 알려주는군.
바꾸고 돌려보자.
헛 이게 머냐?
Up Sample 앞뒤 신호를 확인해보자.
이거 먼 의미가 있는 짓거린가 모르겠네...
getting_started_training을 계속 해야되나 말아야되나
시간낭비하는거 같기도 하고...
Serial-to-Parallel 시스템 만들어보자.
이렇게 만들고 Counter Limited의 Upper limit를 1로, Serial to Parallel의 설정을 Least significant word first, Unsigned, Number of bits를 8로, Binary point를 0으로 설정하자.
Serial to Parallel의 설정 중 Least significant word first를 Most significant word first로 바꾸고 돌려보자.
Counter Limited 블럭에서는 0 1 0 1을 끝없이 쏟아낸다. 이걸 Serial to Parallel이 받아서 8비트의 unsigned 정수로 바꿔준다. 0101 0101 -> 85로
Most significant word first로 해야 제대로 출력이 되네. 당연하게도.
자 슬슬 지겨워진다. 이짓거리도...
2016년 2월 5일 금요일
2016년 2월 3일 수요일
Xilinx System Generator -- 07. Lab 4 - System Control
이번 예제는 MCode를 이용해서 FSM을 만드는거다.
MCode는 Xilinx Blockset의 Index 라이브러리에 있다.
오른쪽 클릭해서 Help 함 읽어보자.
=======================================================
MCode
Xilinx Blockset의 Control Logic, Math, 그리고 Index 라이브러리에서 찾을 수 있다.
MCode 블럭은 시뮬링크내에서 매트랩 함수를 실행하기 위해 사용한다.
블럭에 표시된 파라미터는 M-펑션 네임이다. 실제로 MCode 블럭을 더블클릭하면
MATLAB fuction에 xImax가 기본으로 연결이 되어있다. Edit M-File...로 편집하거나 Browse...로 아예 다른 파일로 변경도 가능한 모양이다.
이 블럭은 시뮬링크로 시뮬레이션시 출력을 계산하는 M-code를 실행한다.
하드웨어 제너레이트시 동일한 기능을 하는 VHDL이나 Verilog로 변환된다.
...
그외 매우 내용이 길지만 지금은 읽어봐도 무슨 내용인지 잘 모르니까 여기까지...
=======================================================
검색해보니까 주로 FSM을 만들기 위해 쓰는 블럭인거같다.
일단 블럭 불러 올려서 시스템을 만들어보자.
이렇게...
M-code는 아래와 같이 만들자.
state variable을 선언하는 부분
persistent state, state = xl_state(0,{xlUnsigned, 3, 0}); 은 persistent로 선언되어야 하고 첫번째 인자는 초기값, 두번째 인자는 정밀도라고 한다.
근데 두번째 인자는 정확히 멀 말하는건지 모르것네...state가 0에서 4까지니까 3비트라는거 말고는...
Repeating Sequencer Stair는 아래와 같이
값을 넣어주면 된다.
시뮬레이션 Stop time을 20으로 입력하고 시뮬레이션 돌려보자.
오케이 잘 나온다.
MCode는 Xilinx Blockset의 Index 라이브러리에 있다.
오른쪽 클릭해서 Help 함 읽어보자.
=======================================================
MCode
Xilinx Blockset의 Control Logic, Math, 그리고 Index 라이브러리에서 찾을 수 있다.
MCode 블럭은 시뮬링크내에서 매트랩 함수를 실행하기 위해 사용한다.
블럭에 표시된 파라미터는 M-펑션 네임이다. 실제로 MCode 블럭을 더블클릭하면
MATLAB fuction에 xImax가 기본으로 연결이 되어있다. Edit M-File...로 편집하거나 Browse...로 아예 다른 파일로 변경도 가능한 모양이다.
이 블럭은 시뮬링크로 시뮬레이션시 출력을 계산하는 M-code를 실행한다.
하드웨어 제너레이트시 동일한 기능을 하는 VHDL이나 Verilog로 변환된다.
...
그외 매우 내용이 길지만 지금은 읽어봐도 무슨 내용인지 잘 모르니까 여기까지...
=======================================================
검색해보니까 주로 FSM을 만들기 위해 쓰는 블럭인거같다.
일단 블럭 불러 올려서 시스템을 만들어보자.
이렇게...
M-code는 아래와 같이 만들자.
function matched = state_machine(din) persistent state, state = xl_state(0,{xlUnsigned, 3, 0}); switch state case 0 if din == 1 state = 1; else state = 0; end matched = 0; case 1 if din == 0 state = 2; else state = 0; end matched = 0; case 2 if din == 1 state = 3; else state = 0; end matched = 0; case 3 if din == 1 state = 4; else state = 2; end matched = 0; case 4 if din == 0; state = 0; else state = 1; end matched = 1; otherwise state = 0; matched = 0; end
state variable을 선언하는 부분
persistent state, state = xl_state(0,{xlUnsigned, 3, 0}); 은 persistent로 선언되어야 하고 첫번째 인자는 초기값, 두번째 인자는 정밀도라고 한다.
근데 두번째 인자는 정확히 멀 말하는건지 모르것네...state가 0에서 4까지니까 3비트라는거 말고는...
Repeating Sequencer Stair는 아래와 같이
값을 넣어주면 된다.
시뮬레이션 Stop time을 20으로 입력하고 시뮬레이션 돌려보자.
오케이 잘 나온다.
2016년 2월 2일 화요일
Xilinx System Generator -- 06. Lab 3 - Signal Routing
오늘도 간단한 예제를 실행해보자.
실제 Xilinx Blockset사이에 신호가 어떻게 넘어가는지 확인해봅시다.
만들어볼 첫번째 시스템은
자 시작해보자.
시뮬링크 source 블럭셋에서 Constant 불러와서Contant Value를 .5로 하고
자일링스 블럭셋에서 Gateway In 불러와서 Num of bits : 8, Bin of bits : 6으로
Gateway Out과 System Generator token, Display도 불러와서 아래와 같이 연결하자.
0.5를 signed xx.xx xxxx 이진수로 받으면 00.10 0000 으로 입력된다. 고대로 출력하면 0.5로 출력됨.
다음은 이걸 만들어보자.
아까 만들어놓은 시스템에서 Constant Value를 ,007813으로 바꾸고
Gateway In을 Num of bits : 12, Bin of bits : 12로 바꾸면 된다.
0.007813을 signed .xxxx xxxx xxxx 이진수로 받으면 .0000 0010 0000으로 입력된다. 고대로 출력하면 0.007813으로 출력됨. 실제로 .0000 0010 0000은 0,0078125지만 Display의 포맷을 short으로 해서 0.007813으로 출력된다. 포맷을 long로 바꾸면 원래값으로 출력된다.
마지막으로 만들건 이거다.
자일링스 블럭셋에서 Convert를 불러와서 Num of bits : 8, Bin of bits : 0으로
Reinterpret 불러와서 Signed, Output Binary Point : 0로 해서 연결해주자.
첫번째 시스템과 비슷한데, 일단 00.10 0000로 입력받고
Convert에서 Quantizaton 설정이 Truncate다. 표현가능한 소수 자리보다 오른쪽에 있는값은 버린다는건데 표현가능한 소수가 0이니까 소수값을 없애버린다. 걍 0이 출력되는거지.
Reinterpret는 입력받은 이진수는 손대지 않고 값의 형태를 실수에서 정수로 바꿔버린다. 설정을 그렇게 했으니까. 0010 0000로 걍 32가 출력되는거지.
이번 실습은 심플해서 좋네.
실제 Xilinx Blockset사이에 신호가 어떻게 넘어가는지 확인해봅시다.
만들어볼 첫번째 시스템은
자 시작해보자.
시뮬링크 source 블럭셋에서 Constant 불러와서Contant Value를 .5로 하고
자일링스 블럭셋에서 Gateway In 불러와서 Num of bits : 8, Bin of bits : 6으로
Gateway Out과 System Generator token, Display도 불러와서 아래와 같이 연결하자.
0.5를 signed xx.xx xxxx 이진수로 받으면 00.10 0000 으로 입력된다. 고대로 출력하면 0.5로 출력됨.
다음은 이걸 만들어보자.
아까 만들어놓은 시스템에서 Constant Value를 ,007813으로 바꾸고
Gateway In을 Num of bits : 12, Bin of bits : 12로 바꾸면 된다.
0.007813을 signed .xxxx xxxx xxxx 이진수로 받으면 .0000 0010 0000으로 입력된다. 고대로 출력하면 0.007813으로 출력됨. 실제로 .0000 0010 0000은 0,0078125지만 Display의 포맷을 short으로 해서 0.007813으로 출력된다. 포맷을 long로 바꾸면 원래값으로 출력된다.
마지막으로 만들건 이거다.
자일링스 블럭셋에서 Convert를 불러와서 Num of bits : 8, Bin of bits : 0으로
Reinterpret 불러와서 Signed, Output Binary Point : 0로 해서 연결해주자.
첫번째 시스템과 비슷한데, 일단 00.10 0000로 입력받고
Convert에서 Quantizaton 설정이 Truncate다. 표현가능한 소수 자리보다 오른쪽에 있는값은 버린다는건데 표현가능한 소수가 0이니까 소수값을 없애버린다. 걍 0이 출력되는거지.
Reinterpret는 입력받은 이진수는 손대지 않고 값의 형태를 실수에서 정수로 바꿔버린다. 설정을 그렇게 했으니까. 0010 0000로 걍 32가 출력되는거지.
이번 실습은 심플해서 좋네.
Xilinx System Generator -- 05. System Generator Compilation Types
There are different ways in which System Generator can compile your design into an equivalent, often lower-level, representation. The way in which a design is compiled depends on settings in the System Generator dialog box. The support of different compilation types provides you the freedom to choose a suitable representation for your design's environment.
For example, an HDL or NGC netlist is an appropriate representation when your design is used as a component in a larger system. If, on the other hand, the complete system is modeled inside System Generator, you may choose to compile your design into an FPGA configuration bitstream. Sometimes you may want to compile your design into an equivalent high-level module that performs a specific function in applications external to System Generator (e.g., ModelSim hardware co-simulation).
시스템 제너레이터를 컴파일하는 몇가지 방식이 있다. 시스템 제너레이터 다이얼로그 박스에서 설정할 수 있는데 디자인 환경에 따른 적합한 방식을 선택할 수 있다.
예를들어, HDL이나 NGC 넷리스트는 대형 시스템의 일부인 컴포넌트 개발에 적합하다. 반대로 전체 시스템을 개발하려고 할때는 비트스트림을 선택할 수 있다. 시스템 제너레이터 외부의 어플리케이션과 연동되는 특정 기능을 수행하는 고수준의 모듈 개발에 적합한 방식도 있다. (ModelSim hardware co-simulation)
System Generator token을 더블클릭하면 보이는 이부분이다.
용도별 차이가 있는데
1. 시스템의 일부분 설계
2. 전체 시스템 설계
3. softcore 포함 설계
4. 하드웨어 연동 시뮬레이션
5. 타이밍, 파워 분석
등이 있는거같다.
- HDL Netlist Compilation
-> 대형 시스템의 일부 컴포넌트 설계시 사용. HDL을 만들어주는거 같다.
- NGC Netlist Compilation
-> 대형 시스템의 일부 컴포넌트 설계시 사용. NGC를 만들어주는거 같다.
- Bitstream Compilation
-> 전체 시스템을 설계시 사용. 걍 다 만듬.
- EDK Export Tool
-> 마이크로블레이즈 블럭 사용시 쓰는거 같은데...
- Hardware Co-Simulation Compilation
-> 타겟 보드와 시뮬링크가 통신하면서 시뮬레이션 한다는거 같은데...
- Timing and Power Analysis Compilation
-> 이건 논외로 치자 머리아프다...
난 심히 Hardware Co-Simulation을 해보고 싶은데 방법을 모르겠다. 아직은
For example, an HDL or NGC netlist is an appropriate representation when your design is used as a component in a larger system. If, on the other hand, the complete system is modeled inside System Generator, you may choose to compile your design into an FPGA configuration bitstream. Sometimes you may want to compile your design into an equivalent high-level module that performs a specific function in applications external to System Generator (e.g., ModelSim hardware co-simulation).
시스템 제너레이터를 컴파일하는 몇가지 방식이 있다. 시스템 제너레이터 다이얼로그 박스에서 설정할 수 있는데 디자인 환경에 따른 적합한 방식을 선택할 수 있다.
예를들어, HDL이나 NGC 넷리스트는 대형 시스템의 일부인 컴포넌트 개발에 적합하다. 반대로 전체 시스템을 개발하려고 할때는 비트스트림을 선택할 수 있다. 시스템 제너레이터 외부의 어플리케이션과 연동되는 특정 기능을 수행하는 고수준의 모듈 개발에 적합한 방식도 있다. (ModelSim hardware co-simulation)
System Generator token을 더블클릭하면 보이는 이부분이다.
용도별 차이가 있는데
1. 시스템의 일부분 설계
2. 전체 시스템 설계
3. softcore 포함 설계
4. 하드웨어 연동 시뮬레이션
5. 타이밍, 파워 분석
등이 있는거같다.
- HDL Netlist Compilation
-> 대형 시스템의 일부 컴포넌트 설계시 사용. HDL을 만들어주는거 같다.
- NGC Netlist Compilation
-> 대형 시스템의 일부 컴포넌트 설계시 사용. NGC를 만들어주는거 같다.
- Bitstream Compilation
-> 전체 시스템을 설계시 사용. 걍 다 만듬.
- EDK Export Tool
-> 마이크로블레이즈 블럭 사용시 쓰는거 같은데...
- Hardware Co-Simulation Compilation
-> 타겟 보드와 시뮬링크가 통신하면서 시뮬레이션 한다는거 같은데...
- Timing and Power Analysis Compilation
-> 이건 논외로 치자 머리아프다...
난 심히 Hardware Co-Simulation을 해보고 싶은데 방법을 모르겠다. 아직은
2016년 1월 29일 금요일
Xilinx System Generator -- 04. Lab 2 - Design Creation Basics
오늘은 Lab 2다.
C:\Xilinx\14.7\ISE_DS\ISE\sysgen\examples\getting_started_training\lab2\lab2.mdl 파일을 열어보자.
일반 시뮬링크 블럭셋과 시스템 제너레이터 블럭셋의 출력신호 비교를 위해서 시뮬링크 모델을 살짝 수정하자.
C:\Xilinx\14.7\ISE_DS\ISE\sysgen\examples\getting_started_training\lab2\lab2.mdl 파일을 열어보자.
설정 변경없이 시뮬레이션을 돌려서 파형을 확인해보자.
일단 여기까진 별거없음. 일반적인 시뮬링크 시뮬레이션인데 이걸 자일링스 블럭을 사용해서 똑같이 만들어보자.
FPGA 블럭의 시작과 끝에 Gateway In/Gateway Out이 있어야 한다는것과 Xilinx System Generator token이 꼭 있어야 한다는걸 생각하면서 아래와 같이 만들어보자. 블럭의 기본설정은 변경하지 않아도 된다.
자일링스 블럭의 출력을 확인해보면
이런식으로 discrete 신호 파형이 나온다.
그리고 위쪽 Scope 파형을 보자구.
확실히 출력이 다르다.
다음은 이렇게 만들어 보란다.
Compare the result from the executable spec vs. the Xilinx implementation using a Subtractor from the "Simulink/Math Operations" library.
executable spec이 일반 시뮬링크 블럭셋을 사용한거고
Xilinx implementation이 시스템 제너레이터 블럭셋을 사용했다는 의미인거 같은데...
출력 파형 함 보자.
1번 파형 : executable spec(일반 시뮬링크 블럭 사용)
2번 파형 : Xilinx implementation(시스템 제너레이터 블럭 사용)
3번 파형 : 1 - 2(1번 파형을 discrete 샘플링한 오차값)
머 이런식을 나온다.
Add 뒤에 Unit Delay를 3개 연결해서 테스트를 해보자.
이런식으로...
파형을 확인해보면
먼 상황인지 파악이 안되는데...
그럼 시그널을 모조리 확인해보자.
Unit Delay 단계별 파형을 확인해보면...
Unit Delay는 one sample period 신호 지연 출력이다. 더불어 discrete sampling까지...
3 unit delay를 해야 Xilinx implementation 출력과 비슷해진다. 자일링스 블럭 내부 전달 지연과 관계있는듯.
자 다음은 합성을 해보자. 문서대로 진행하면 에러가 난다는걸 기억해두고 진행하자.
중간 부분의 System Generator Token을 더블클릭하면 이런 창이 뜬다.
Generate 눌러보자.
아 아니 아직 누르지 말고...
보통 Xilinx ISE 라이센스 파일은 C:\.Xilinx 폴더에 위치한다.
이걸 C:\Xilinx 폴더로 복사해라.
그다은 Xilinx ISE를 실행시켜서 Help의 Manage License를 실행해서XILINXD_LICENSE_FILE 항목을 C:\Xilinx\Xilinx.lic으로 설정하고 옆에 Set 버튼을 눌러라.
이거 하고나서 난 시원하게 재부팅을 했다.
이제 드디어 Generate를 눌러보자.
이게 나오면 성공했다는거다.
원래 Generate를 누르면 Gateway In 관련 fatal error이 뜨는데 이게 라이센스 파일 위치 관련 문제다. 이것에 대한 error report는 아래와 같다.
=======================================================
Description
While generating a netlist, a "Fatal Internal Error" occurs, reported by a simple model (eg constant).
This issue does not occur every time.
After the error is received I cannot generate a netlist or run Hardware Cosim for a very simple design.
Restarting Matlab will sometimes fix the issue.
What is the cause of this problem?
Solution
This issue only affects 64bit Sysgen.
Sysgen encounters problems with the license file when it is located under C:\.Xilinx.
Sysgen encounters problems with the license file when it is located under C:\.Xilinx.
It can be fixed by leaving C:\.Xilinx empty, saving Xilinx.lic to a different location (for example C:\Xilinx_license\Xilinx.lic), and pointing to it by using the environment variable XILINXD_LICENSE_FILE
=======================================================
매트랩은 기본적으로 파일 패스에 매우 엄격한거같다. 파일의 경로 중 특수문자로 시작되거나 한글이거나 겁나게 길거나 하는 폴더명이 있으면 심각한 에로사항이 발생하는거 같으니 명심해두고 폴더명은 무조건 영문으로 심플하게 만들자. 머 이건 Matlab만의 문제는 아니지.
다음 단계로 넘어가보자.
시스템 제너레이터 토큰 포함해서 Gateway In과 Gateway Out 사이의 컴포넌트를 선택한 후 Create Subsystem from Selection을 해라.
이렇게 바뀐다.
만들어진 서브시스템을 복사해서 아래와 같이 만들어라.
이렇게 되면 각 서브시스템마다 시스템 제너레이터 토큰을 가지게 된다. 시스템 제너레이터 토큰은 해당 연동된 서브시스템의 top-level entity를 생성하므로 FPGA 두개를 의미하거나 하나의 FPGA에 두개의 블럭이 있다는것을 의미한다.
Subsystem을 더블클릭해보자.
이걸 Xilinx DSP48 2.1 매크로 블럭을 사용해서 이렇게 바꿔라.
DSP48 이건 먼가...계산을 겁나 빠르게 해줄거같은 느낌이 드는데!!! 이름이 DSP니까!!!
DSP48 Macro 2.1의 c 포트는 입력 범위가 a, b와 다르다.
Gateway In2 더블클릭해서 이 부분을 바꿔주자.
Display 탭의 Signals & Ports에서 Port Data Types와 Signal Dimensions를 활성화시키면
오...보기 좋군...
이 다음은 DSP48 Macro 2.1을 더블 클릭해서 Pipiline Options로 가보자.
Pipeline Options를 Expert로 바꾸고 아래와 같이 세팅해라.
Subsystem과 Subsystem1 내부의 System Generator Token을 둘 다 제거하고 상위 시스템에 System Generator Token을 추가한다.
그리고 시뮬레이션 돌리고 파형 함 보자.
5번 파형이 DSP48 매크로블럭을 적용한거고 6번 파형이 그렇지 않은거다. 파형상으로는 약간 다르긴 하다.
System Generator Token을 더블클릭해서 Bitstream을 Generate 해보자.
ISE에서 합성할때 콘솔에 출력되는 로그들이 주루루룩 나오면서 합성이 진행된다.
한참 합성하다가 pin loc 관련 에러가 뜬다...
아...
피드 구독하기:
글 (Atom)