'Studyhard/VHDL'에 해당되는 글 10건

  1. 2010.01.09 VHDL Simulation
  2. 2010.01.09 VHDL Basic End
  3. 2010.01.09 VHDL Basic 6
  4. 2010.01.09 VHDL Basic 5
  5. 2010.01.09 VHDL Basic 4 2
  6. 2010.01.09 VHDL Basic 3
  7. 2010.01.08 VHDL Basic 2
  8. 2010.01.08 VHDL Basic 1
  9. 2010.01.05 [VHDL] Step Motor Test Code 1
  10. 2010.01.05 [VHDL]16Mhz to 1hz
Studyhard/VHDL2010. 1. 9. 02:57
-Quartus 6.0 Simulation 확인하기

File- New- Other Files 선택

Vector Waveform File 선택 


이렇게 생긴 창이 뜨게 된다. 
그럼 왼쪽 Name ,Value at 12.43ns 어쩌고 써있는 아래 하얀 부분에 마우스 오른쪽 버튼을 클릭한다.

그럼 왼쪽 과 같은 창이 하나 뜨게 된다. 여기서는 
 Insert Node of Bus 를 선택한다.










여기서는 OK 버튼 밑에 있는 Node Finder를 선택한다.


그럼 Node Finder 창이 뜨게 된다. 해당 창 위쪽 가운데 보이는 Filter -> Pins all -> 그리고 우측에 보이는 List 버튼을 누르게 되면 그림과 같이 컴파일 완료된 핀이 창에 뜨게 된다.

a 핀이 std_logic_vector (2 downto 0) 형이므로 우측 창에 넘기는 핀은 a 핀 하나면 된다
(a[0],a[1],a[2]) 핀은 선택할 필요가 없다)
 - 우측창에 넘긴다는 의미는 시뮬레이션 창에 추가시킨다는 의미



a, b 핀을 선택하고 가운데 있는 >   화살표 버튼을 누르면 우측으로 a,b 핀이 이동된걸 확인 할 수 있다.
그리고 OK, OK 버튼을 눌러 주면,

다음과 같이 아까 생성한 파일에 a, b 가 추가     된 것을 확인 할 수 있다.










Edit - End Time  
그리고 파형을 보기 좋게 확인 하기 위해서는 End Time 을 설정해 주어야     한다. 보통 16us , 혹은 20us 정도로 설정한다. 





Time 옆에 보이는 1.0 을 20us 로 변화 시켜 주자.. 물론.. 1s 도 가능하다. 하지만 Simulation 이 오래 걸린다. 
궁금하면 해보시길 

그 다음에는 Grid Size를 수정 해준다. 
End Time 이 20us 이기 때문에 1us 로 설정 한다.





설정한 뒤에 확인해 보면 end time 이 20.0us 로 설정 하였지만 보이는 것은 2.0us 까지 이다. 그렇다면!


View 에 Fit in Window 를 선택하거나.

좌측에 보이는 돋보기 아이콘을 선택해 조절해 주면 된다





완성된 VWF 파일이다.  
이제 해 주어야 할 일은 파형을 생생해 주는 일!

우선 파형을 생성할 핀을 선택하면 우측에 있는 Icon들이 활성화 된다. 
 자세히 살펴 보면.. 여러 가지가 있다. ^^ 
 우리는 Clock 을 만들어 주는 것이 목적이기 때문에 왼쪽 아래에 있는 C 를 선택한다. 
 C 는 Count Value 의 약자!  그럼 나머지는? 하나 하나 눌러보면 이해가 갈 것이다.















Count Value 창이 뜨게 된다.

Counting Tab 부분
 
Radix = Data Type 선택
Start Value = 시작할 값 선택
Increment by = 증가 할 값 선택















Timing Tab 부분
 
 Start Time = Count 시작할 시간
 End Time = Count 끝날 시간(End Time 이 20us  로 설정 하였으니 최대 20us)

 Count Every = 1 us 로 설정 
 - > 우리가 Grid size를 us 단위로 설정 하였기 
       때문에 1us 로 설정한다. 

 Multiplied by = Grid 마다 동작 설정
 - > 지금은 1us Grid Size 이고 1 Multiplied 로 설정 되었기 때문에 1us 마다 Count Value 가 바뀐다











완성된 Count Value 화면이다. 
a 가 std_logic_vector (2 downto 0) 이기 때문에 000, 001, 010 형식으로 증가 하는 것을 알 수 있고
a 옆에 놓여진 + 버튼을 누르면 a[2],a[1],a[0] 이 어떻게 변화 되는지 눈으로 직접 확인 하는 것을 알 수 있다. 물론 각 입력핀 하나 하나 세부 설정도 가능할 것이다. 

P.S 
Hard Ware 설계 전에 Simulation을 돌려 파형을 확인 하다는 것은 굉장한 작업이 아닐 수 없다. 실제로 Chip이 나오기 전에 Test 를 거친다면 소모되는 비용을 더욱더 줄일 수 있으며, 우리 같은 공대생들은 Bug 잡는 일이 한층 쉬워 지지 않을 까 생각한다.







Posted by 리얼한놈
Studyhard/VHDL2010. 1. 9. 02:32
- Integer 형을 이용한 10 Counter 를 설계하시오

LIBRARY ieee;  
USE ieee.std_logic_1164.ALL;    
   
ENTITY mod_10_count IS     
PORT(n_cp, n_rd : IN std_logic;
q : BUFFER integer RANGE 0 TO 9);
END mod_10_count ;

ARCHITECTURE arc OF mod_10_count IS
BEGIN
PROCESS (n_cp, n_rd)
BEGIN
IF  (n_rd='0' OR q=9) THEN
q <= 0;
ELSIF (n_cp'EVENT AND n_cp='0') THEN
     q <=q+1;
END IF;
END PROCESS;
END arc;


- 20Mhz 를 1초로 분주시오

library ieee;
use ieee.std_logic_1164.all;

entity divone is
port(clk : in std_logic;
    clk_one : buffer std_logic);
end divone;

architecture arc of divone is
begin
process (clk)
variable cnt : integer range 0 to 1999999;
begin
if (clk'EVENT and clk='1')then
if (cnt=1999999)then
cnt:=0;
clk_one <= not clk_one;
else
cnt:=cnt+1;
end if;
end if;
end process;
end arc; 
   

- 2상 여자 Stepmotor 구동기를 설계하시오 
LIBRARY ieee;  
USE ieee.std_logic_1164.ALL;  

ENTITY step IS
PORT(clk : IN STD_LOGIC;
clock  : buffer std_logic;
q : OUT STD_LOGIC_VECTOR(3 downto 0));
END step;

ARCHITECTURE arc OF step IS
type state_type is (s0, s1, s2, s3);
SIGNAL state: state_type;
BEGIN
process(clk)
variable cnt : integer range 0 to 49999; --49999 적정 
begin
if (clk'EVENT and clk='1') then
if (cnt=49999)then
clock <= not clock;
cnt:=0;
else 
cnt:=cnt+1;
end if;
end if;
end process;
PROCESS (clock)
BEGIN
IF clock'EVENT AND clock = '1' THEN
CASE state IS
WHEN s0 => state <= s1;
WHEN s1 => state <= s2;
WHEN s2 => state <= s3;
WHEN s3 => state <= s0;
END CASE;
END IF;
END PROCESS;

WITH state SELECT
q <= "1100" WHEN s0,
"0110"  WHEN s1,
"0011" WHEN s2,
"1001" WHEN s3;
END arc;


Posted by 리얼한놈
Studyhard/VHDL2010. 1. 9. 02:31
과제
 * JK플립플롭이 Project 폴더 내에 있어야 한다.
library ieee;
use ieee.std_logic_1164.all;

entity upcount is
port( cclk, logic : in std_logic;
     q : buffer std_logic_vector (3 downto 0));
end upcount;

architecture arc of upcount is
component jk_f
port( j, k, clk : in std_logic;
      q, n_q  : buffer std_logic);
end component;
begin
ff3: jk_f port map(j => logic, k => logic, clk =>q(2), q=>q(3));
ff2: jk_f port map(j => logic, k => logic, clk =>q(1), q=>q(2));
ff1: jk_f port map(j => logic, k => logic, clk =>q(0), q=>q(1));
ff0: jk_f port map(j => logic, k => logic, clk =>cclk, q=>q(0));

end arc;


VHDL Basic 6

-상태머신(State Machine)
    -State Machine의 정의
- 순차회로시스템의 원하는 동작을 모델링하는 도구
- 외부 입력과 시스템 클럭에 의해 State가 천이되고, State에 의존되어 출력 값 결정 
- 여러 개의 State로 구성, 복잡한 시스템 설계에 적합 (예 : 마이크로프로세서)

   -State Machine의 종류
-Moore Machine
-Mealy Machine

    # Mealy Machine
출력이 현재상태와 입력값에 의존

# Moore Machine
출력이 현재 상태에만 의존되는 모델


 - 두 모델의 차이점


◯ Moore Machine : 출력회로의 입력이 현재의 상태인 레지스터의 값으로만 결정, 출력의 변화는  Clock과 동기되어 발생. 
◯ Mealy Machine : 출력회로의 입력이 현재 레지스터의 값과 입력값 두 가지를 가짐. 따라서 입력값의 변화가 있게되면 Clock과 동기하지 않더라도 그 출력값은 변화

    - 두 모델의 공통점
◯ 입력과 현재의 상태에 의해 다음 상태 변화

- 설계 예시

   architecture arc of mode is                  --Begin 시작 전에 삽입

type state_type is (stay, ready, action); -- State 머신 상태 설정(3가지 상태) 
signal state : state_type;                -- State_type 을 Signal 로 설정


- Integer 및 Variable 구문
 - Integer 변수
   - 알고 있는 Vector 형과 마찬가지로 사용할 변수의 범위를 지정하는데 사용
   - 벡터형 보다 변수가 차지하는 셀의 수가 더 작다
   - 범위를 좀더 자세히 지정할 수 있다.

   * 설계 예시
    entity Counter is
port ( a : in integer range 0 to 255; -- < = in std_logic_vector(7 downto 0);
     b : out integer range 0 to 255; -- < = out std_logic_vector(7 donwto 0);
    end counter ;

      범위를 실수형으로 지정함으로써 좀더 자세한 선언이 가능함을 알 수 있다.
 
 -Variable 구문 
  - Process 내에서만 사용 되며, 내적 변수이다
  - 합성 보다는 중간 연산 단계에서 주로 이용된다.
  - Variable에서 사용되는 대입기호는   :=    
  
   
  * 설계 예시
   Process(clk, clear, load)
Variable cnt : integer range 0 to 255;
begin
    if(조건) then
cnt := 0;

  
 *Variable은 내적 변수이기 때문에 Process 가 끝나면 그 값을 잊어버린다. 때문에 값을 보존 시키기 위해선
  Signal에 최종 값을 대입시켜야 한다. 



 
과제 
- Integer 형을 이용한 10 Counter 를 설계하시오
- 20Mhz 를 1초로 분주시오
- 2상 여자 Stepmotor 구동기를 설계하시오 

Posted by 리얼한놈
Studyhard/VHDL2010. 1. 9. 02:23
JK 플립플롭

LIBRARY ieee;  
USE ieee.std_logic_1164.ALL;   
-
ENTITY ex IS
PORT(n_cp, j, k   : IN    std_logic;
         q        : BUFFER std_logic);
END ex;

ARCHITECTURE arc OF ex IS
SIGNAL jk : std_logic_vector (1 DOWNTO 0);
BEGIN
jk<=j&k;
PROCESS (n_cp, j, k)
BEGIN
IF (n_cp'EVENT AND n_cp= '0') THEN        -- Negative edge trigger
CASE jk IS
WHEN "00" => q <= q; -- Hold
WHEN "01" => q <= '0'; -- Reset
WHEN "10" => q <= '1'; -- Set
WHEN "11" => q <= NOT q; -- Toggle
WHEN OTHERS => q <= q;
END CASE;
END IF; 
END PROCESS;
END arc;

* 다른 플립플롭도 설계 후 시뮬레이션을 확인하길 바랍니다. ^ ^

VHDL Basic 5

 - 비동기식 상승 카운터
   비동기식 상승 카운터는 동기식처럼 클럭을 공통으로 사용하지 않고 앞쪽에 있는 플립플롭의 출력이 뒤쪽에 있는 플립플롭의 클럭으로 사용된다. 위 회로는 하강모서리 트리거 방식이므로 클럭이 1에서 0으로 떨어지는 순간 동작하게 된다.


- 비동기식 하강 카운터
   상승 카운터와 반대로 역순으로 카운트되는 것을 말한다. 매 클럭 수 마다 1씩 감소한다

- 비동기식 MOD-N 카운터
  mod-N 카운터는 N개의 카운터 순서를 반복하는 카운터를 말한다. 10진 카운터는 mod-10, 12진 카운터는 mod-12, 4비트 2진 카운터는 mod-16 이다.
  
  EX) MOD -6 카운터

 - 과제 
JK 플립 플롭을 이용하여 상승 카운터, 하강 카운터를 만들어 본다. 

설계 예시 (Shift Register)

 - JK플립플롭읠 4개로 직렬 연결하여 구성, 처음 JK 플립플롭에 J=1,K=0 을 넣고, Clock은 4개에 동시에 집어 넣는다. 다음 JK플립플롭은 이전 플립플롭의 출력 Q, /Q를 각각 J,K에 넣어준다. 그리고 Waveform 파일을 확인하면 차례로 Shift 되는 걸 확인할 수 있다.

Posted by 리얼한놈
Studyhard/VHDL2010. 1. 9. 02:12
4 비트 전가산기 설계
 - 1비트 가산기
library ieee;
use ieee.std_logic_1164.all;

entity ADD is
port( a,b,c: in std_logic;
sum,cout : out std_logic);
end ADD;

architecture arc of ADD is
begin
sum <= (a xor b)xor c ;
cout <= (a and b) or ((a xor b) and c);
end arc;

 * 4비트 전 가산기 설계하기 전에 위의 1비트 가산기가 Project 폴더 안에 있어야 한다.

 - 4비트 전가산기
library ieee;
use ieee.std_logic_1164.all;

entity FA4 is
port(a, b :in std_logic_vector(3 downto 0);
cin : in std_logic;
sum : out std_logic_vector(3 downto 0);
cout: buffer std_logic_vector(2 downto 0);
carry: out std_logic);
end FA4;

architecture arc of FA4 is
 component ADD port( a,b,c: in std_logic;
sum,cout : out std_logic);
 end component;

begin
f0: ADD port map(a=>a(0),b=>b(0),c=>cin,cout=>cout(0),sum=>sum(0));
f1: ADD port map(a=>a(1),b=>b(1),c=>cout(0),cout=>cout(1),sum=>sum(1));
f2: ADD port map(a=>a(2),b=>b(2),c=>cout(1),cout=>cout(2),sum=>sum(2));
f3: ADD port map(a=>a(3),b=>b(3),c=>cout(2),cout=>carry,sum=>sum(3));
end arc;

 - 시뮬레이션 파형은 각자 확인해 보도록 한다.


VHDL Basic 4

- Clock Pulse 로 동작하기 
  - 일반적으로 if 구문을 쓸 때, 
if (A=1) then      < = 이런 식으로 Cording한다.
     그럼, Clock Pulse는 어떻게 Cording 할 수 있을까?

if(clock'EVENT and clock ='1') then   <= Rising Edge Trigger

if(clock'EVENT and clock ='0') then   <= Falling Edge Trigger 

     위의 보기처럼 Clock 과 동기화 시킬 경우 선언된 if 문 안에 원하는 Source를 Cording 하면 된다.

* 단, 비동기와 동기가 겹칠 경우 
ex) if(A=1) then
   elsif(clock'EVENT and clock='1')then
   elsif(B = 0) then

동기화된 EVENT를 먼저 코딩해주고 비동기 EVENT 를 아래쪽에 코딩하자



-래치 (Latch) 및 플립플롭(Flip Flop) 설계
 - 기본 개념
   • 안정 상태
- 회로의 외부로부터 입력을 가하지 않는 한 본래의 상태를 유지
   • 두 가지 안정 상태
- Q = 1, /Q = 0 상태 혹은 그 반대인 상태
   • 래치
- 레벨 트리거에 의해서 동작, 1상태인 동안 입력의 변화를 출력에 반영
   • 플립플롭
- 엣지 트리거(Edge Trigger)에 의해서 동작, 클럭 펄스가 나타나기 바로 이전의 입력이
 출력에 반영되어 다음 클럭 펄스가 나타날 때까지 그 상태를 유지함
   • 비동기 동작
- 입력 신호의 변화가 일어 나면 그에 따라 동작 하는 것
   • 동기식 동작
- 클럭 펄스라는 시간적인 신호로 모든 플립플롭이 펄스에 동기가 되어 동작을 하는 것

* 비동기와 동기식 동작의 차이점을 잘 이해하도록 한다.

○ S-R 플립플롭
그림 - S-R 플립플롭

- 펄스입력은 다른 2개의 입력에 대한 인에이블 신호의 역할을 한다.
  뒷 부분의 두 NAND 게이트 출력은 CP 입력이 0에 머물러 있는 한 논리 값 1을 갖는다. 
  이것이 기본 플립플롭의 정지 조건이다.

표 - S-R FF 의 진리표

○ D 래치 및 D 플립 플롭
 - D 래치(Latch)

그림 - D 래치.

- D래치는 제어 신호가 0 일 때 과거의 값을 가지고 오고, 과거의 값이 없으면 X(무변화)이다.
   제어신호가 1일 때, 1인 동안에 입력 값에 의해서 결과 값이 변화 한다.



 - D 플립플롭(Flip Flop)

 - D 래치와는 달리 클럭의 상승이나 하강일 때 입력값에 의해 출력 값이 정해진다

○ J- K 플립플롭
그림 - J-K 플립플롭

- J K 플립플롭은 SR 플립플롭에서의 비결정 상태를 명백히 구분해 준다. 입력 J,K는 플립플롭을 각각 셋하고 클리어학 위하여 S,R처럼 동작한다. J 입력은 셋, K 입력은 리셋을 위한 것이다. 


○ T 플립플롭

 - T 플립플롭은 J-K 플립플롭을 단일 입력 형태로 고쳐 놓은 것이다. T라는 이름은 플립플롭의 토글, 즉 그의 상태를 반전(보수화)시킬 수 있는데 기인한다.


- 과제
 - 각 래치, 플립플롭을 VHDL 언어로 코딩해본다.

Posted by 리얼한놈
Studyhard/VHDL2010. 1. 9. 01:57
(1) 7segment Decoder 동작을 하는 7447 IC를 설계

http://www.alldatasheet.com 에서 확인한 74ls47 BCD-to-SEGMENT Truth Table 이다 

library ieee;
use ieee.std_logic_1164.all;

entity segment is
port( s : in std_logic_vector(3 downto 0);
 o : out std_logic_vector(6 downto 0));
end segment;

architecture arc of segment is
begin
process (s)
begin
case s is
when "0000" => o <="0000001";
when "0001" => o <="1001111";
when "0010" => o <="0010010";
when "0011" => o <="0000110";
when "0100" => o <="1001100";
when "0101" => o <="0100100";
when "0110" => o <="1100000";
when "0111" => o <="0001111";
when "1000" => o <="0000000";
when "1001" => o <="0001100";
end case;
end process;
end arc;

Truth Table 을 참고하여 SEGMENT 에 0 - 9 까지 출력이 가능한 BCD TO SEGMENT DECODER 를 설계하였다. DECODER 설계와 마찬가지로 ENCODER 설계도 어렵지 않으니, 각자 DATA SHEET 를 참고하여 만들어 보기 바란다.

(2) MUX 와 DEMUX 를 각각 설계
MUX = > MULTIPLEXER 회로에서 입력되는 신호 중 어느 하나의 입력신호를 선택하여 출력회로에 실어 주 는 기능을 수행하는 데이터 선택 논리회로
DEMUX = > DEMULTIPLEXER, MULTIPLEXER의 정반대의 역할을 하는 논리회로

MUX 설계
library ieee;
use ieee.std_logic_1164.all;

entity Mux_4to1 is
port (a : in std_logic_vector(3 downto 0);
 Data : out std_logic;
 s : in std_logic_vector(1 downto 0));
end Mux_4to1;

architecture arc of Mux_4to1 is
begin
with s select
Data <= a(0) when "00",
       a(1) when "01",
       a(2) when "10",
       a(3) when "11",
'0' when others;
end arc;

위의 소스와 같이 MUX 는 SELECT 로 출력이 바뀌는 것을 알 수 있다. 




DEMUX 설계
library ieee;
use ieee.std_logic_1164.all;
 

entity Demux_1to4 is
port(a : in std_logic;
y : out std_logic_vector(3 downto 0);
sel : in std_logic_vector(1 downto 0));
end Demux_1to4;

architecture arc of Demux_1to4 is
begin
process (sel)
begin
y<="0000";
case sel is
when "00" => y(0)<=a;
when "01" => y(1)<=a;
when "10" => y(2)<=a;
when "11" => y(3)<=a;
when others=> y<="0000";
end case;
end process;
end arc;


VHDL Basic 3

우리가 Hardware 를 만들 때, 나중에 쓰기 위해 모듈을 만들거나, 사서 쓰는 경우가 있다. 모듈의 장점은 나중에 어디다 써도 분해 하지 않고 쓸 수 있다는 것이다. VHDL 언어도 이와 마찬 가지로 Component 라는 기능을 가지고 있다. 예를 들어, 디지털 시계를 만들 때, 초를 세는 부분, Segment 디스플레이 부분, Stopwatch 부분 등 따로 따로 분리해서 만들어 놓고 Component 로 합치면 디지털 시계가 만들어 지는 것이다. 

Component 
 - Component 로 합성할 Source 는 Main Source 와 같은 경로로 저장 되어 있어야 한다.
 - Architecture 아래에 놓여진다.
  ex)
architecture arc of x is 
component (모듈 부분 entity name) port ( a : in std_logic;
  d : out std_logic);
end component; 
* 모듈에서 port 가 a, b, c  가 입력이고 d 가 출력인데, 그중 a, d 만 필요하다면, 위와 같이 코딩 해주면 된다.

 - begin 후에 Main 부분의 포트와 Component 의 포트를 서로 연결해 주기만 하면 된다.
  ex)
begin
u0 : (모듈 부분 entity name) port map(모듈 포트 = > 연결 포트, 모듈 포트 => 연결 포트);
end arc;
* 단지 연결해 줄 뿐이다.  =>  ◀ 이 표시가 있다고 해서 대입이라는 의미가 절대 아니다
* 한 모듈을 여러 번 쓸 수 가 있다.


과제
library ieee;
use ieee.std_logic_1164.all;

entity ADD is
port( a,b,c: in std_logic;
sum,cout : out std_logic);
end ADD;

architecture arc of ADD is
begin
sum <= (a xor b)xor c ;
cout <= (a and b) or ((a xor b) and c);
end arc;

위 소스는 1비트 전가산기 소스이다. 다음을 참고하여 4비트 전가산기를 설계하라.



Posted by 리얼한놈
Studyhard/VHDL2010. 1. 8. 00:30
AND, OR, NAND, NOR, XOR, XNOR 설계 예시

library ieee;
use ieee.std_logic_1164.all;

entity AAAA is
port(a, b : in std_logic;
    x  : out std_logic_vector(5 downto 0));
end AAAA;

architecture arc of AAAA is
begin
x(0) <= a and b;
x(1) <= a or b;
x(2) <= a nand b;
x(3) <= a nor b;
x(4) <= a xor b;
x(5) <= a xnor b;
end arc;
x : out std_logic_vector (5 downto 0);  <- ????

C 언어에서 배열과 같은 의미로 이해하면 빠를 듯 싶다. 
std_logic 형으로 여러개를 설계 하는 것보다, 같은 형태의 출력 핀이면 std_logic_vector 형이 간편하다.
입력도 마찬가지로 vector 형으로 정의가 가능하다

(5 downto 0) < =   000000     (왼쪽 첫 번째 비트가 5번, 오른쪽 마지막 비트가 0번)
(0 downto 5) < =   000000     (왼쪽 첫 번째 비트가 0번, 오른쪽 마지막 비트가 5번)  




VHDL Basic 2


VHDL 은 C 와 마찬가지로 조건문이 가능하다.

(1) IF ELSE 문 (괄호 안에 조건)
- IF (            ) THEN
- IF (  )THEN
 ELSIF(   ) THEN     < = 조건이 들어갈땐 ELSIF 
- IF (  ) THEN
 ELSE < = 조건이 없을 땐 ELSE 
* 마지막엔 항상 END IF 로 마무리를 해주는 센스!

(2) CASE 문
- CASE ( 대상   )   IS
WHEN " 상태  "   = > 출력 <=  값
WHEN OTHERS   = > 출력 <=  값
* 마지막엔 END CASE;

(3) FOR LOOP 문
- FOR I IN 0 TO 7 LOOP
Y(I) <= A(I) AND B(I);

(4) SELECT 문
WITH 대상 SELECT
출력 <= "값" WHEN 상태,
"값"    WHEN 상태,
"값" WHEN 상태,
"값" WHEN 상태;
* 마지막엔 END SELECT;
* VHDL에서 모든 조건문은 architecture 안에 process 문에 쓰여 져야 한다.
- 예
architecture arc of KITEL is
begin
process(a)   -- architecture 안에 process는 여러 개가 와도 된다.
begin   -- process 시작
if (a ="0")then   -- 조건문의 대상은 process(대상 ) 에 정의 되어야한다  
b <= '1';  -- 한 비트일 때는 ‘0’    2개 이상일 때는 “00”  
elsif(a ="1")then    
b <= '0';  -- 마땅히 조건이 없으면 NULL; 처리를 하여도 무방하다.
end if;
end process;              -- process 끝, process 가 여러개일 때는 병렬로 동시에 실행된다
end arc;  -- process 안에서는 순차 architecture안의 process는 병렬처리
과제
(1) 7segment Decoder 동작을 하는 7447 IC를 설계
(2) MUX 와 DEMUX 를 각각 설계













 

Posted by 리얼한놈
Studyhard/VHDL2010. 1. 8. 00:28
VHDL Basic 1
(1) 
 - 범용 IC : 일반적으로 쓰는 IC
 - 주문형 IC(ASIC): Application Specified Integrated Circuit
                          - 완전 : 개발비 ↑, 개발기간 ↑, LSI 급
                          - 반주문 : CAD설계, VLSI 급 => 완전형에 비해 칩면적이 더 크다

(2) 
 - PLD : Programmable Logic Device
          - 논리 기능을 직접 만들어 쓸 수 있는 IC
          - PROM : Programmable Read Only Memory : 한개의 Decoder, 이차원 OR
          - PLA : Programmable Logic Array : 입력 = AND 설계, 출력 OR설계
          - PAL : Programmable Array Logic : AND 설계, OR 고정, PLA 에 비해 속도↑
          - SPLD : Simple Programmable Logic Device : PAL 형식, GATE 200EA
          - CPLD : Complex Programmable Logic Device : 빠른 성능, 정확한 Timing 예측 
          - FPGA : Field Programmable Gate Array : GATE 수가 많다
CPLD 내부구조
FPGA 내부구조

- FPGA는 CPLD 에 비해 속도가 느리지만, GATE가 더 많다

(3) 칩 제조사
 - ALTERA : MAX, Flex, Apex
 - Xlinx : Virtex FPGA, Spartan
 - Vantis : Actel, Atmel, QuickLogic

(4)
VHDL 이란?
 - Very High speed integrated circuit Hardware Description Language 의 약자
 - 1981. 6~1993년 IEEE 제정
 - CAD 업계 및 IEEE 표준 언어
 - 칩의 집적화에 따라 VHDL 의 중요성 대두 (TR 수 : 486=100만개, 586=310만개, 686=55만개)

VHDL 이전?
 - AHPL(A Hareware Programming Language)
 - CDL(Computer Design Language)
 - C 언어
 - IDL (Interative Design Language)
 - ISPS(Instruction Set Processor Specification)
 - TDL(TEGAS HDL or Texas Instrument HDL)
 - UDL / I (Unfied Design Language for IC)
 - Verilog HDL
 - ZEUS
 - HILO

VHDL 특징
 - 전체적인 설계 비용↓, 쉬운 정보교환, 대규모 설계용이, 재사용이 쉬움
 - 미국 정부는 Hardware 문서화에 VHDL 사용
 - 유럽 연합에서도 채택

문제점
 - 설계 자체를 위한 것들을 위해서는 적합하지 않다
 - 정확한 Timing, 임계 경로의 계산이 어려움
 - 합성도구에 대한 지원 부족
 - 설계 도구들 간의 호환성 결여
 - Hardware Engineer 가 Software 설계 기법에 익숙치 못함
 - 아날로그 시스템 모델링의 어려움 => CAD 업체의 노력으로 극복 중

(5) VHDL 의 표현 방법
 동작적 모델링, 자료흐름 모델링, 구조적 모델링
   동작적 모델링 구조적 모델링 
 칩  알고리즘 MP, RAM, ROM 
 회로  미분 방정식 TR, R, L, C 
 게이트  부울 게이트 
 시스템 설계 명세  컴퓨터, 디스크 
 레지스터 RTL  ALU, 카운터, 레지스터 

(6)VHDL Language 의 특징
 - 대, 소문자 구별 X
 - 주석 은 --
 - Line 의 끝은 ; 
 - Space와 Tab으로 낱말 구분
 - Data Type 변형 용이

(7) VHDL 프로그래밍

AAAA.VHD

library ieee;      -- C언어의 Header File이라 생각하면 됨
use ieee.std_logic_1164.all; --ieee의 std_logic_1164.를 쓰겠다는 의미
   -- use ieee.std_logic_signed.all 도 있으며 다양함 

entity AAAA is             -- Entity 선언 다음에 오는 이름은 파일명과 같아야 한다
port (a, b : in std_logic;    -- 다르게 하고 싶다면
c : out std_logic);  -- Assignment-> Device-> General-> Top-level entity를 바꿔야 한다 
end AAAA;                 

architecture arc of AAAA is  -- arc 부분은 마음대로 쓸 수 있다.(ex :sample , ex 등) 
begin
c <= a and b;
end arc;

--> 사용할 Quartus 6.0은 ALTERA 사에서 WEB EDITION으로 무료로 제공하고 있다.
--> Project 시작시 저장 할 폴더를 귀찮더라도 폴더별로 정리를 하면 나중에 편하므로 폴더별로 저장할 것을 권장한다 



과제 
 AND, OR, NAND, NOR, XOR, XNOR 입력 2개 출력 6개로 설계 하고 시뮬레이션 확인
  


 







Posted by 리얼한놈
Studyhard/VHDL2010. 1. 5. 00:46

library ieee;     
use ieee.std_logic_1164.all;

entity revstep is
     port(clk        : in std_logic;
            reverse : in std_logic;
            q          : out std_logic_vector(3 downto 0));
end revstep;

 

architecture arc of revstep is
  type state_type is (s0, s1, s2, s3);
  signal state  : state_type;

  signal clock : std_logic;
begin
     process(clk)
       variable cnt : integer range 0 to 49999; --16Mhz, Step Motor Voltage 9V 에서
    begin                                                 -- 5999 최고 속도, 49999 적정 판단
              if (clk'EVENT and clk='1') then    -- Votage 가 더 높아지면 최고 속도가 
                        if (cnt=49999)then             --  더 높아질 것이라고 판단됨
                            clock <= not clock;
                            cnt:=0;
                        else 
                            cnt:=cnt+1;
                        end if;
              end if;
    end process;
  
    process (clock)   -- signal 로 clock 을 설정 해 줌,process 가능
        begin
    IF (clock'EVENT and clock = '1') then
            case state is
                    when s0 => state <= s1;
                    when s1 => state <= s2;
                    when s2 => state <= s3;
                    when s3 => state <= s0;
            end case;
   end if;
   end process;

 

    process(reverse)--reverse 입력에 따른 스텝 모터 Direction 조절
        begin
       if(reverse='0')then
               case state is
                         when s0=>q<="1100";
                         when s1=>q<="0110";
                         when s2=>q<="0011";
                         when s3=>q<="1001";
               end case;
 

       else   
               case state is
                         when s0=>q<="1100";
                         when s1=>q<="1001";
                         when s2=>q<="0011";
                         when s3=>q<="0110";
               end case;
       end if;
 
   
   end process;
END arc;

--------------------------

스텝 모터를 테스트 하기 위한 부분이다.

 

스텝 모터 드라이버는 7026 을 썼고..

 

2상 여자 방식을 썼다..

 

AB/A/B

 

테스트 시에는 스텝 모터가 한 방향으로 무한정 돌아가고..

 

reverse 버튼이 눌렸을 경우 반대 방향으로 돌아가는 걸 확인 할 수 있었다.

Posted by 리얼한놈
Studyhard/VHDL2010. 1. 5. 00:45

library ieee;
use ieee.std_logic_1164.all;

entity divone is
   port(clk : in std_logic;
          clk_one : buffer std_logic);
end divone;

 

architecture arc of divone is
begin
    process (clk)
        variable cnt : integer range 0 to 7999999;
        begin
        if (clk'EVENT and clk='1')then
             if (cnt=7999999)then
             cnt:=0;
             clk_one <= not clk_one;
             else
             cnt:=cnt+1;
             end if;
         end if;
 end process;

end arc;

 

---

보드에 16Mhz 오실레이터를 1분주 하여 1hz 를 만들어 보았다.

 

테스트 보드에서 확인 해 본 결과 정확히 1초 마다 깜빡이는 걸 알 수 있었다.

 

근데 왜 7999999 일까?

 

0 부터 7999999 이기 때문(카운트는 8000000)이다. 그리고

 

오실레이터는 16Mhz 즉 16000000 이기 때문에

 

1Hz 라는 _______--------   신호를 만들기 위해서는

 

16000000 의 절반인 8000000 를 반은 Low 신호, 반은 High 신호로 주어야

 

정확한 Clock 이 나오게 된다

 

Posted by 리얼한놈