blocking vs non-blocking

VHDL 2015. 11. 9. 16:39

<= : non-blocking( seqeuntial logic : output이 input과 state에 영향받음 )

 = : blocking ( combinational logic : output은 input에만 영향받음 )

'VHDL' 카테고리의 다른 글

AMBA - SoC안에서 IP끼리의 Bus 규격  (0) 2014.12.04
dinonsil 회로도  (0) 2014.12.04
multi-driver error  (0) 2014.12.03
디논실 project woring notes  (0) 2014.10.31
기본 component  (0) 2014.10.30
Posted by bogus919
,

recipes.egloos.com/4991780

SoC를 보니, IP를 이용해서 Chip을 만들어 내는 구나.. 하네요. 그러면 Chip 내부에 IP만 늘어 놓으면 되느냐. 하면 안되겠죠. 집안에 TV랑 Home Theater를 사다 놓고, 따로따로 늘어만 놓으면 같이 동작하는 게 아니니까, 최소한 전선으로 연결은 해야겠죠.

 

SoC내부에 IP들을 전선으로 연결하는 방법은 Bus를 이용하는 것이지요. - Bus도 뭐 여러 Device가 공유하는 전선이니까 별반 다를 건 없겠지요 - 이 Bus들을 어떻게 연결하고, IP끼리 서로 어떻게 통신 할 것이냐를 약속한 것이 AMBA에요.  AMBA (Advanced Microcontroller Bus Architecture)는 영어로 한마디 정의를 하자면SoC Target On-chip bus protocol라고 할 수 있겠네요.

 

역시나 ARM에서 주도하는 Bus 규격이지요. 아무래도 ARM을 SoC에 CPU로 채택하면, ARM의 성능을 최대화 하는 게 좋기 때문에 ARM社가 세상에 Open해 놓은 규격이라 할 수 있겠사옵니다.

 

MCU내부에서 보게 되면, Bus의 통신 방식을 잘 이해 할 수 있고, 지켜줄 수 있는 것이 필요하게 되는데, 이것을 Bus Interface라고 부르고요, 이 Bus Interface는 Bus위에 Data를 어떻게 전송할 거냐, 어떻게 받을 거냐를 잘 control해주는 interface에요.

 

AMBA에서는 이런 Bus Interface가 3가지 종류로 나뉘어요. 그것이 바로, AHB, ASB, APB인데요. AHB는 Advanced High Performance Bus이고요, ASB는 Advanced System Bus이고요, APB는 Advanced Peripheral Bus에요. 헥헥.

 

AMBA는 이렇듯 3가지 Bus 규약 (Protocol)을 약속해 놓았구요. 흔히들 AMBA는 3가지로 구성된다는 말은 이런 뜻인 거죠. AMBA가 3가지로 구성되어 있다고 해서 Bus하나에 모든 Protocol을 지원하는 건 아니고, 어떤 Bus interface에 물려 있느냐에 따라 다른 거죠.

 

예를 들어, AHB Bus라고 함은 특별 난 게 아니고, AHB Protocol을 지원하는 Bus interface에 물린 Bus라고 해석하시면 됩니다.

 

뭐 일단 많이 사용되는 Schematic을 하나 보면 좀 더 나으리라는 신념에, 유명한 그림 하나를 선보이겠습니다

 

.

 

 
 

이건 MCU의 내부에 여러 가지 IP들이 AHB, APB Bus로 연결되어 있는 그림이에요. AHB는 이름이 high performance니까, Burst Mode (이빠이 한방에 팍 쏘는)의 Data 전송에 이용되고요, APB는 나름 빠르지 않은 전송속도를 필요로 하는 주변장치들 (Peripheral)등에 연결되어 있어요. 중간에 Bridge는 AHB와 APB의 속도하고, Protocol이 틀리니까,

그걸 연결해 주는 다리와 같은 역할이고요. 그러니까 220V하고 110V를 변환해 주는 트랜스와 비슷한 거라고 보심 틀림없지요. 여기에서 잠깐, 왜 AHB, APB로 회로를 나누느냐 하면, 효율성 문제이지요. AHB로 연결된 녀석들은 APB보다 훨씬 빠르니까, AHB로 모든 IP를 연결해 두게 되면, 빠른 녀석들 끼리 서로 통신을 하다가 중간에 저속의 IP에게 뭔가를 부탁하고 시키게 되었을 때, 저속의 IP가 응답을 해줄 때까지, 고속의 IP들이 Bus를 쓰지 못하고 놀게 되지요. 그러니까, 빠른 넘들 끼리는 빠른 넘들 끼리 놀게 해주고, 그 와중에 느린 넘에게 일을 시킬 때는 Bridge에게 날려놓고. 여기에 왜 ASB는 안 보이느냐? 원래의 AMBA는 ASB와 APB 두 개의 Protocol만 있었지요. 그래서 AHB자리에 ASB가 들어가야 정상인 거에요. 하지만, AMBA도 진화해야 하는 까닭에, Multiplex Bus 기반의 AHB를 발표하였지요. 그러다 보니, ASB가 들어가야 할 자리에 AHB가 떡 하니 자리 잡은 거지요. ASB로도 충분하면 ASB가 있어도 되어요. AHB가 Multiplex Bus기반이라는 말은 Multiplex Bus가 주소라인과 제어라인 그리고 데이터라인까지 모두 공유를 하고, 처음에 주소를 먼저 쏴준 후 데이터를 드르륵 쏴주는 형식의 Burst 데이터 전송 기법을 사용하여, 더욱 좋은 성능을 낼 수 있게 해주었지요. ASB는 주소, 제어, 데이터 라인이 모두 서로 분리되어 있고, 양방향 Bus 구조이고요, Address와 Data를 번갈아서 쏴주도록 Design되었기 때문에 Burst로 Data를 전송하기 어려운 측면이 있어요. 이렇게 AHB, ASB만 그려 놓으면 다냐? 그건 또 아니죠. 이런 AMBA Bus system을 구성하는 요소에는 IP, Decoder가 있어야겠고요. 각 IP는 Master도 되고, Slave도 됩니다. Master라는 녀석은 Slave에게 Read나 Write 요청을 할 수가 있고요, Slave는 그 요청을 받아 들여서 Read/ Write를 직접 하게 되고요, 이런 명령에 대해서 성공/실패/Wait 등의 상태를 master에게 다시 report하게 되지요.

Master는 Data를 Bus에 흘리고자 하는 주체인 게고요, Slave는 그걸 받아서 일을 해야 하는 노예죠. 자, 그러면 Master랑 Slave만 있으면 서로 통신이 가능하느냐! 하면, 그건 또 아니죠. 아~ 자꾸 자꾸 아니래.

Master와 Slave는 복잡한 Bus System에 의해서 얽혀 있어요. 그러다 보니, 이런 Bus System을 정리할 신호등이 필요하게 된 거죠. 그게 아비터 (Arbter)라는 넘 인데요. 이 넘은 Bus를 누가 쓸 건지에 대해서 결정권을 가지고 있지요. Arbiter한테 허락 못 받으면 Bus 못써요. 여기서부터 좀 어렵고, 지루할 수 있는데, 이걸 잘 봐두면 모든 Device control은 이것과 같다고 생각하면 되니까, 잘 봐두세요. Memory Control이나, Peripheral Device의 Control은 모두 이와 비슷하다 구요

 

 

 
 

Arbiter가 대빵 자리를 차지하고 있고요 Master와 Slave는 AMBA System에서 16개까지 붙을 수 있습니다요. 그래서 Master 0~15, Slave 0~15 이렇게 달려 있고요. 여기에 Master와 Slave의 길을 제대로 뚫어주는 Decoder가 있습니다요. Decoder는 접근하려는 주소를 보고서, Slave에 Chip Selection과 비스므리한 HSEL 신호를 날려주지요. 야~ 너 누가 너한테 Data를 준단다~ 하고 말이죠. 각 신호의 뒤에 붙은 x는 0~15번을 나타내요. 여러 개의 신호 선이 있다는 뜻이죠.

자, 그러면, 순서를 한번 볼까요?

① 뭔가 하고 싶은 Master는 Arbiter에게 나.. 버스 써도 될까..? 하고 HBUSREQ 신호를 날립니다.

② 이때, Arbiter는 다른 넘이 쓰고 있으면 허가를 안 해주고, 써도 되면 허가를 해주지요. 그 신호가 HGRANT에요. 너 써.. 하고 선심을 쓰죠.

③ 그러면 Master는 내가 이제 쓴다~ 하고 Arbiter에게 HLOCKx 신호를 날려줍니다. 이제부터는 Arbiter가 누군가가 Bus를 쓰고 있군 하면서 메모를 해 놓는 거죠. 동시에 Master들이 서로 쓰겠다고 날리면, 보통 Arbiter의 Policy에 따라 다른데 Priority가 높은 Master에게 Bus 사용 허가권을 날려주지요.

⑤ 허가를 얻은 Master는 접근하고자 하는 Slave의 주소에 HADDR을 날립니다. 그러면 Decoder가 그걸 보고서 HSELx 신호를 해당 Slave에 날려줍니다. 해당 Slave는 동작 활성화가 되는거져.

⑥ 그런 다음에 Write하겠다는 HWRITE 신호를 High로 Slave에 날려요. (Low면 READ라는 의미에욧!)

⑦ 그런 후에, Slave는 HREADY신호를 이용해서 READY가 되면 READY되었다고 알려줘요.

⑧ 그런 후에 HWDATA 선에다가 Data를 날려주는 거지요.

    (HRDATA Bus를 통해서 READ도 할 수 있거등요 참~ 쉽죠? 잉)

뭐, 간단하죠? 이게 Bus 동작의 전모에요. 자, 그럼 이 내용을 좀더 유식한 그림으로 함 볼까요? 어디 가서 잘난 척은 해야죠.

앞에서 Arbiter가 동작하는 순간은 이미 결판 났다고 하고요, ⑥ ~ ⑧ 사이의 Timing Diagram들을 좀 보시죠. 이렇게 Bus쓰는 동안에 Data를 주고 받는 과정을 또 유식한 말로 Transaction이라 불러요.

 

 

 

으하핫. 보시면 아시겠지만, Address를 날리는 과정을 Address Phase라고 부르고, Data Phase라고 불러요. 가만히 보면 Address Phase와 Data Phase라는 뭐 있어 보이는 말이 위에 있네요. Address Phase가 Slave에게 주소를 날리는 과정이고요, Data Phase가 Data가 왔다 갔다 하는 과정인 게죠. 근데 여기에 보면 wait이라는 용어가 나옵니다. wait은 아무래도 Slave가 Master보다 느린 Device인 경우가 많으니까, 그런 경우에 나 아직 준비 안되었어요... 하고 HREAY 신호를 Low로 깔아 버리는 거죠. 이게 wait state라는 건데요, wait sate동안에는 Slave가 준비 동작을 하는 거에요. Master야 기다려라~ 그거죠. 그래서 HREADY가 High인 동안에만 Data를 쓰거나 읽는 거죠 머. 위의 그림에서는 control 신호가 HWRITE 신호라고 봐야겠네요? 여기에 덧붙여서, Master와 Slave사이에 control 신호에는 HTRANS[1:0], HBURST [2:0] 등의 control pin이 더 있는데요, 이 녀석들은 Burst Transfer를 어떤 식으로 할 거냐를 알려줘요. 일단은 HTRANS 신호가 어떤 것들을 표현 하는지 볼까요?

 

 

 

 

어랏 이것만 봐서는 먼 소린지 잘 모르겠지요. 연속된 주소의 Data를 주르르륵 전송할 때 아~주 유용하답니다. 이런걸 Burst Transfer라고 부르고요! 또, Diagram 하나 볼게요. Data를 보낼 때, HADDR이 0x20에서부터 0x2C까지 연속되지요? 그러면 HADDR이 시작 되는 0x20에서 NONSEQ와 주소를 날려주시고요, 한번 Busy 때려주시고요. 그 다음부터는 wait이 아닌 경우에는 SEQ와 주소가 자동으로 늘어나면서 계속 연달아서 날려 주시는 거죠. wait은 Slave의 사정이니까 wait이 걸리면 기다려 주는 게 Master의 매너죠. 아래에 표시되어 있는 Busy는 Slave쪽에서의 Wait state와 마찬가지로, Master가 준비 안되었을 때 Busy를 날려주고 잠시 기다려라 라고 알려줄 수 있는 신호죠.

 

 

 

Burst Transfer의 장점은 무엇이냐! 원래는 하나의 Address phase + 하나의 Data Phase로서 하나의 Transaction이 끝나는 게 정석인데, 하나 이상의 연속된 Data를 쫘르륵 쓸 수 있다는 장점이 있지요. 자동으로 늘어나는 주소와 함께..

- 보통의 NOR같은 메모리의 경우에 Burst mode라는 게 있는데 이걸 이용하게 되면, 연속된 주소라면 Address의 하위 Address pin만 계속 변한다는 특징이 있으니까, 상위 주소는 그대로 두고, 하위 Address pin만 깔짝 깔짝 움직여 주면, Data가 연속적으로 딸려 올라온다는 장점이 있지요. 뭐, 여하튼 그림 보니까 INCR이라는 HBURST[2:0]라는 신호도 있네요? 요 녀석은 BURST에도 여러 가지 종류가 있다! 뭐 그런 거에요. 이런Burst의 종류에는 머머 있나 함 보시죠.

 

 

 

 

오, 꽤나 여러 가지 구색을 갖춰두었네요. 가만히 보니까 INCR이랑 WRAP계열 두 가지로 나뉘는 거 같죠? 각각의 특징이나 한번씩 살펴 보시져 머. WRAP 계열은 뒤에 붙어 있는 숫자가 Address Boundary에요. 그러니까, 예를 들어서, WRAP4의 경우에는 주소가 4의 배수로 Boundary를 이루고요, 그 범위 안에서 Burst를 할 수 있는 거에요. 그리고 INCR도 마찬가지로 뒤에 붙어 있는 숫자가 Address Boundary인데요, 요 안에서만 Burst될 수 있는 거지요. 뭐, Address boundary라는 어려운 말로 하긴 했는데, 그 숫자 만큼씩 burst로 쓴다고 보시면 되요. 그런데, 문제는 HSIZE를 보니 Word네요. 그러면 Word 4개씩이 Burst 라고 보시면 되요. Word 4개씩이면 32bit ARM에서는4byte*4=16byte= 0x10byte고요,0x30 보다 크거나 같고, 0x40보다 작은 size=2> 0x30~0x40의 범위가 되겠네요. 일단은 4 beat wrapping burst를 보면,

 

 

 

주소를 잘 보세요. 0x38 0x3C 다음에 0x40으로 안가고, 0x30, 0x34로 돌아왔죠.  이런 식으로 주소가 wrapping되어 그 내부에서만 burst로 사용됩니다. 요게 WRAP 4이고요, 만약에 Wrap type의 Burst를 쓰게 되면 Boudary를 넘어가지 못하고 다시 처음으로 돌아오니까, Random 주소에서부터 시작하면 곤란한 경향이 있지요. 그러니까 대부분 Boundary 처음에서부터 Wrap 크기 만큼 Burst를 사용하는 걸 권장 합니다요. 실은 WRAP type의 Burst를 사용하는 System을 보지 못해서, 어디에 유용 할 까는 저에게는 영원한 숙제라고나 할까요. 후~ 그리고, Word 단위의 Burst라면 Address의 A[1:0]=00 이어야 하는 건 아시겠지요? 마찬가지로 half word (2byte)라면 A[0] = 0 이어야겠죠. A[1:0] = 10 이라면 4byte align 아니니까, burst 안되겠죠?

 

뭐 그럼 INCR4는요? INCR은 무작정~ 주소 increase이고요, Burst 개수에만 관계 된답니다.  0x30, 0x34, 0x38, 0x3C 이렇게 Data를 쓰는 거지요. 아 멀리도 왔네요. 재미있지도 않은 많은 그림들을 왜 이렇게 많이 보면서 왔느냐! 우리가 배운 것은 Timing Diagram보는 법하고요, Device들의 동작원리가 여기에 다 숨어 있어요. 나중에 보면 알겠지만, 대부분의 Device의 동작원리는 여기서 벗어나지 않아요. 다~ 똑같아요 똑같아.

 

참고로, AHB, ASB, APB외에 AXI라는 AMBA 3.0 Spec도 나왔어요. Advanced eXtensible Interface)라고 부르는데요, AXI는 Burst기반으로 이루어져있고, Write Response channel이 추가되어 있고요. Read / Write가 동시에 가능해요. 시작 주소만으로도 Burst Transfer가 가능하게 되었지요. 고속 동작이 가능하도록 설계된 이 Bus는 ARM11이상의 Core를 사용하는 MCU의 backbone bus로 사용되고 있어요.

 

사족으로 이런 AMBA System덕에 SoC할 때 IP를 갖다 끼우기만 하면 계속 SoC를 확장할 수 있는 구조로 만들 수 있겠죠!


'VHDL' 카테고리의 다른 글

blocking vs non-blocking  (0) 2015.11.09
dinonsil 회로도  (0) 2014.12.04
multi-driver error  (0) 2014.12.03
디논실 project woring notes  (0) 2014.10.31
기본 component  (0) 2014.10.30
Posted by bogus919
,

dinonsil 회로도

VHDL 2014. 12. 4. 01:19






'VHDL' 카테고리의 다른 글

blocking vs non-blocking  (0) 2015.11.09
AMBA - SoC안에서 IP끼리의 Bus 규격  (0) 2014.12.04
multi-driver error  (0) 2014.12.03
디논실 project woring notes  (0) 2014.10.31
기본 component  (0) 2014.10.30
Posted by bogus919
,

multi-driver error

VHDL 2014. 12. 3. 14:52

Error (10028): Can't resolve multiple constant drivers for net "ad_cnt[15]" at AD_PCI.v(199)
Error (10029): Constant driver at AD_PCI.v(132)
Error (10028): Can't resolve multiple constant drivers for net "ad_cnt[14]" at AD_PCI.v(199)




서로 분리된 always 문을 사용하여 동일 변수에 값을 써주게 되면 multi-driver error를

발생합니다.

따라서 한개의 always문 안에서 값을 변경하도록 지정해주면 해결됩니다.

multi-driver error를 수정한 소스를 첨부합니다.

합성된 회로가 latch회로를 많이 사용하셨네요

 


'VHDL' 카테고리의 다른 글

AMBA - SoC안에서 IP끼리의 Bus 규격  (0) 2014.12.04
dinonsil 회로도  (0) 2014.12.04
디논실 project woring notes  (0) 2014.10.31
기본 component  (0) 2014.10.30
GODI_PC based function generator_working notes  (0) 2014.10.27
Posted by bogus919
,

디논실 project woring notes

VHDL 2014. 10. 31. 01:20

1. 2014 10월 31일 


디지털실험텀프제안서 - 복사본.hwp


- 프로젝트 제안서 씀, 만들 수 있을지는 모름ㅎㅎㅎㅎㅎ

'VHDL' 카테고리의 다른 글

dinonsil 회로도  (0) 2014.12.04
multi-driver error  (0) 2014.12.03
기본 component  (0) 2014.10.30
GODI_PC based function generator_working notes  (0) 2014.10.27
8254 datasheet  (0) 2014.10.27
Posted by bogus919
,

기본 component

VHDL 2014. 10. 30. 22:22

    -- 1. 8254

    -- 기본코드 그대로 쓰면됨

    -- PC에서 address 2bit 가져와서 cs로, wen 가져와서 wr신호로,

    -- system clock 입력받고, 분주해서 out0으로 내보냄

    component TOP_8254

Port ( m_clk0    : in  STD_LOGIC;

      m_clk1    : in  STD_LOGIC;

      m_clk2    : in  STD_LOGIC;

      m_clk_ctr : in  STD_LOGIC;

      m_reset   : in STD_LOGIC;

      m_data    : in  STD_LOGIC_VECTOR (7 downto 0);

      m_gate0   : in  STD_LOGIC;

      m_gate1   : in  STD_LOGIC;

      m_gate2   : in  STD_LOGIC;

      m_addr    : in  STD_LOGIC_VECTOR (1 downto 0);

      m_cs_b    : in  STD_LOGIC;

      m_wr_b    : in  STD_LOGIC;

      m_out0    : out  STD_LOGIC;

      m_out1    : out  STD_LOGIC;

      m_out2    : out  STD_LOGIC);

    end component;


    -- 0. data address counter

    -- 강의 다시 들어야함

    -- Controller signal generator 안에 RAM0, RAM1 을 위한 counter가 각각 존재

    -- component로 추가해서 쓰는듯 

    component data_addr_CNT  

Port( d_din : in STD_LOGIC_VECTOR(10 downto 0);

     d_en : in STD_LOGIC;

     d_clk : in STD_LOGIC;


     d_state_da4 : in std_logic; 

     d_reset : in STD_LOGIC; 

     d_dend : out STD_LOGIC);


    end component;


    -- 2. Address Decoder

    -- input address를 가지고, 내부에서 지지고 볶아서

    -- 각 모드를 선택할 수 있도록 1bit signal을 내보냄 

    -- 빠진거 추가해야 할 듯

    component Address_Decoder

port(addr : in std_logic_vector(8 downto 0); -- input address

    pcs_addr : out std_logic; -- 8254 setting

    pc_RAM0_addr : out std_logic; -- PC mode, RAM0

    pc_RAM1_addr : out std_logic; -- PC mode, RAM1

    da_Data_Transfer_addr : out std_logic; -- DA mode, Data Transfer mode

    da_RAM1_start_addr : out std_logic; -- DA mode, RAM1 start address

    ad_RAM0_addr : out std_logic); -- AD mode, RAM0 start address

    end component;


    -- 3. Data Bus Buffer

    -- en 신호로 버스 방향 설정

    -- PC와 데이터 입출력 하는 부분

    -- latch에서 받아서 PC로, PC에서 받아서 latch로

    component Data_Bus_Buffer

Port ( buffer_en : in STD_LOGIC;

      data_in : in STD_LOGIC_VECTOR (7 downto 0);

      data_out : out STD_LOGIC_VECTOR (7 downto 0));

    end component;


    -- 4. Latch

    -- input, output을 Latch로 clock 동기화시킨 후 보내야 안정적

    -- PC와 입출력 할 때, ADC에서 입력 받을 때, DAC로 출력할때

    component latch

Port ( clk : in STD_LOGIC;

      lat_reset : in STD_LOGIC;

      lat_en : in STD_LOGIC;

      lat_in : in STD_LOGIC_VECTOR (7 downto 0);

      lat_out : out STD_LOGIC_VECTOR (7 downto 0));

    end component;


    -- 5. MUX

    -- MUX0 : RAM0에 쓸건데, PC로부터 받는건지, ADC로부터 받는건지

    -- MUX1 : RAM1에 쓸건데, 필터의 출력, RAM0의 출력, MUX0의 출력 중 선택

    -- MUX2 : DAC로 내보낼건데, RAM0에서 받거나 RAM1에서 받음

    component MUX

Port ( MUX_en : in STD_LOGIC;

      MUX_din1 : in STD_LOGIC_VECTOR (7 downto 0);

      MUX_din2 : in STD_LOGIC_VECTOR (7 downto 0);

      MUX_out : out STD_LOGIC_VECTOR (7 downto 0));

    end component;


    -- 6. RAM0, RAM1

    -- write enable 들어오면 data in으로 들어온 data를 입력 address에다가 씀

    -- read enable 들어오면 입력 address에 있는 데이터를 data out으로 내보냄 

    component dual_port_simple_ram

port (clka : IN STD_LOGIC;

     ena : IN STD_LOGIC;

     wea : IN STD_LOGIC_VECTOR(0 DOWNTO 0);

     addra : IN STD_LOGIC_VECTOR(10 DOWNTO 0);

     dina : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

     clkb : IN STD_LOGIC;

     enb : IN STD_LOGIC;

     addrb : IN STD_LOGIC_VECTOR(10 DOWNTO 0);

     doutb : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

    end component;


    -- 7. Control Signal Generator

    -- 시발 노답...... 

    component Controller 

port( m_reset_b : in std_logic;

     m_clk : in std_logic;

     led_da : out std_logic;

     led_ad : out std_logic;

     state_pc1_rd : out std_logic;

     m_ren : in std_logic;

     m_wen : in std_logic;

     pcs_addr : in std_logic;

     pc_ram0_addr : in std_logic;


     state_da4 : out std_logic;

     state_dt : out std_logic;


     st_da : out std_logic;

     pc_ram1_addr : in std_logic;

     ad_ram0_addr : in std_logic;

     da_data_transfer_addr : in std_logic; 

     da_ram1_start_addr : in std_logic; 

     m_ready : out std_logic;

     latch_data0_en : out std_logic;

     latch_data1_en : out std_logic;

     latch_data2_en : out std_logic;

     latch_data3_en : out std_logic;

     ram_cs0 : out std_logic_vector(0 downto 0);

     ram_cs1 : out std_logic_vector(0 downto 0);

     MUX0 : out std_logic;

     ram0_wen : out std_logic;

     ram0_ren : out std_logic;

     ram1_wen : out std_logic;

     ram1_ren : out std_logic;

     buffer_en : out std_logic;

     m_address_ram0 : out std_logic_vector (10 downto 0);

     m_address_ram1 : out std_logic_vector (10 downto 0);

     m_address_ram2 : out std_logic_vector (10 downto 0);

     m_address_ram3 : out std_logic_vector (10 downto 0);

     m_d_en : out std_logic;

     dend : in std_logic;


     st_idle : out std_logic);


    end component;



'VHDL' 카테고리의 다른 글

multi-driver error  (0) 2014.12.03
디논실 project woring notes  (0) 2014.10.31
GODI_PC based function generator_working notes  (0) 2014.10.27
8254 datasheet  (0) 2014.10.27
Blocking and Nonblocking statements  (0) 2014.10.09
Posted by bogus919
,

1. 대충 보니까

8254를 써서 clock 을 원하는 주파수로 분주하는 fuction generator를 만드는듯



2. mode3 동작


- 프로젝트에서는 mode3를 사용해서 square wave를 생성하는데

데이터시트를 보니 mode3는 mode2와 비슷하게 rate generator 역할을 한다.

clock의 duty cycle만 다른듯?

(data sheet의 mode definition 참고할 것.)


- GATE는 무시하란다



- mode3 동작

divide-by-N counter 와 같이 동작

initial count의 반이 되면 OUT이 나오는듯?

위 그림에서 LSB가 initial count인 듯

(LSB 4, 5일때 2에서 count expired - 5일때는 2되고 1clock 지나서)


a) even counts

- initial count load(OUT은 initially high)

- 매 clock마다 값이 2씩 감소,

- count가 끝나면(initial count의 반) OUT이 바뀜(toggle)

- 다시 initial count reloaded

- 반복


b) odd counts

- initial count load N-1(even), (OUT은 initially high)

- 매 clock마다 count 2씩 감소

- count가 끝나고 한 clock 있다가 OUT이 LOW로 됨

- 다시 initial count reloaded

- 매 clock마다 count 2씩 감소

- count 끝나면 바로 OUT이 HIGH로 됨

- 다시 reloaded

- 반복


----------2014_11_1_SAT-----------



3. 8254

아하하하하ㅏㅇ항하앟ㅇ하

8254 코드는 주어진단다 하하하ㅏ 시발

나는 CONTROL SIGNAL GENERATOR를 통해서 8254에 쓰이는

control signal만 만들면 된단다


4. PCFG TOP 파일도 주어진다. 

그냥 뭐 별거는 없고 input, output만 정의해놓은 거임

여기다가는 각 component의 proto type과, 

각 component들에 사용할 signal들을 정의해주면 된다.


5. Address Decoder

PC로부터 9bits address를 입력받게 된다.

address decoder에서 그 주소를 입력받은 후, 

각 component에 해당하는 address를 입력받았을 때, 그 component를 사용할 수 있도록

1 bit signal을 내보내주면 된다. 이 signal이 CS역할을 하는 것 같다


simulation 결과,

input address에 따라서 각 output signal들이 잘 나오는듯

clk은 필요없는거 같다.




6. Data Bus Buffer

PC로부터 데이터를 입력받을때, PC로 데이터를 보낼때 같은 BUS를 이용하므로

tri buffer를 이용한 control이 필요하다

enable은 active low로 동작하며

enable이 0이면 latch에서 나온 데이터가 PC로 들어가고,

1이 되면 Hi-Z로 만들어서, PC에서 또 다른 latch나 8254로 데이터를 보낼 수 있도록 한다.

- 지금 top에서 signal 연결을 제대로 안했는데, latch의 output을 buffer의 input으로 연결해줘야함



흠 근데 각 component 말고 top에서 시뮬해봐야 할텐데, TOP simul할 때 어떻게 component들의

signal을 보는지 잘몰겠당...



7. LATCH

data를 입력받을 때나 출력할 떄, clock과의 동기화를 위해 latch를 거친다

(enable 있고, clock이 1일 때만 입력이 출력으로 전달된다, edge triggered 가 아닌 level sensitve로 동작, 

clock low이면 이전 값이 그대로 유지됨)

PC로부터 data 입력, PC로 data 출력, ADC로부터 data 입력, DAC로 data 출력

총 네개의 latch가 사용되며, 모두 같은 clock과 reset을 갖지만

input data, output data, enable은 모두 따로따로임

모든 enable 신호는 모두 control signal generator에서 만들어 보내준다.





8. internal / primary signal

 

   -- signal

    -- 각 component들의 output signal만을 internal signal로 정의해준다, input은 할 필요없다.

    -- ex) latch의 enable은 internal signal로 선언해줄 필요 없고,

    --     control signal generator에서 나오기 때문에 여기서 나온 output을 internal signal로 선언해준 후

    --     latch의 input에 연결만 해주면 된다

    -- 선언해준 internal output signal 들은 사용되는 component들의 primary input으로 연결해준다


9. with - select

with s select y <= d0 when s = '1',
d1 when s = '0';
"00" when others;
 
이거를 쓰려면 마지막에 others가 꼭 필요하다



10. MUX_2_TO_1

RAM0로 들어가는 mux, DAC와 PC로 나가는 mux 두개가 있다

설명서에는 각각 input, output mux라는데 그게 그거 아닌가...

input mux는 PC 데이터와 ADC 데이터로부터 선택, output mux는 RAM0와 RAM1 으로부터 선택

암튼 테스트 결과 이상 없음




11. MUX_3_TO_1

input이 3개다, input 3개이므로 select signal은 2bit, control signal generator에서 잘 맞춰야한다

filter에서 들어오는거, RAM0에서 들어오는거, input MUX에서 들어오는거

이 중에서 select해서 output은 RAM1로 들어간다




12. DUAL_PORT_RAM

RAM0, RAM1

simulation은 아직 못해봄



13. ERRORERROR



모듈을 선언해놓고, architecture에 아무것도 없으면 위와 같은 error가 뜨게 된다

아무 쓰잘데기 없는 명령이라도 하나 집어넣으면 에러 안뜸


-----------2014_11_ 9_SUN-------------------


14. 8254

8254 클락나옴!!

테스트벤치에서 어드레스랑 wen, ren등 다른 signal은 잘나오는데 이상하게 data가 자꾸 안나온다 했더니

버퍼를 통해서 8254에 넣어주니 데이터가 잘들어온다



위와 같이 어드레스, 데이터 wen등 나온다 control register에 한번, counter에 두번 데이터를 쓰고 나면

8254에서 시스템 clock이 8분주된 clock이 나오게 된다. 

주의할점은, 어드레스가 나오자마자 데이터를 바로 쓰는게 아니라, 

어드레스와 cmd_data가 나온 후에, controller에서 ready signal을 띄워주면

그제서야 wen과 data가 나오게 된다, 그 전까지는 data가 high-z 로 되어있는 것을 볼 수 있다



8254 세팅을 안해도 처음에 느린 clock이 나오다가 세팅하는 과정에서 이상한 모냥이 잠깐 나오고


세번의 데이터를 쓰는 세팅 과정이 끝나면 위와 같이 8분주된 clock이 나오게 된다


테스트벤치에서는 ready신호를 controller에서 받아야 어드레스와 데이터를 보내준다.

일단은 걍 가라로 뜨게 해줌

스테이트를 통해서 ready 신호가 나오게 해줘야한다



15. address counter

ram0에 여러번 따로따로 쓰더라도

카운트는 계속 마냥 증가? 리셋 들어오기 전까지는?




'VHDL' 카테고리의 다른 글

multi-driver error  (0) 2014.12.03
디논실 project woring notes  (0) 2014.10.31
기본 component  (0) 2014.10.30
8254 datasheet  (0) 2014.10.27
Blocking and Nonblocking statements  (0) 2014.10.09
Posted by bogus919
,

8254 datasheet

VHDL 2014. 10. 27. 10:05


8254_datasheet.pdf


데이터시트엔 모든게 들어있지

읽기가 좆같지만

이게 머여 시벌

'VHDL' 카테고리의 다른 글

multi-driver error  (0) 2014.12.03
디논실 project woring notes  (0) 2014.10.31
기본 component  (0) 2014.10.30
GODI_PC based function generator_working notes  (0) 2014.10.27
Blocking and Nonblocking statements  (0) 2014.10.09
Posted by bogus919
,

2줄 요약

' = ' (Blocking assignment) : sequential 

' <= ' (Non-blocking assignment) : concurrent(combinational)




../images/main/bullet_green_ball.gifBlocking and Nonblocking Statements
  

space.gif

Blocking Statements: A blocking statement must be executed before the execution of the statements that follow it in a sequential block. In the example below the first time statement to get executed is a = b followed by

  

space.gif

../images/tidbits/blocki11.gif
  

space.gif

Nonblocking Statements: Nonblocking statements allow you to schedule assignments without blocking the procedural flow. You can use the nonblocking procedural statement whenever you want to make several register assignments within the same time step without regard to order or dependence upon each other. It means that nonblocking statements resemble actual hardware more than blocking assignments.

  

space.gif


  1 module block_nonblock();
  2 reg a, b, c, d , e, f ;
  3 
  4 // Blocking assignments
  5 initial begin
  6   a = #10 1'b1;// The simulator assigns 1 to a at time 10
  7   b = #20 1'b0;// The simulator assigns 0 to b at time 30
  8   c = #40 1'b1;// The simulator assigns 1 to c at time 70
  9 end
 10 
 11 // Nonblocking assignments
 12 initial begin
 13   d <=  #10  1'b1;// The simulator assigns 1 to d at time 10
 14   e <=  #20  1'b0;// The simulator assigns 0 to e at time 20
 15   f  <=  #40  1'b1;// The simulator assigns 1 to f at time 40
 16 end
 17   
 18 endmodule
You could download file block_nonblock.v here
  

space.gif

  

space.gif

 ../images/main/bulllet_4dots_orange.gifExample - Blocking
  

space.gif


  1 module blocking (clk,a,c);
  2 input clk;
  3 input a;
  4 output c;
  5  
  6 wire clk;
  7 wire a;
  8 reg c;
  9 reg b;
 10   
 11 always @ (posedge clk )
 12 begin
 13  b = a;
 14  c = b;
 15 end
 16    
 17 endmodule
You could download file blocking.v here
  

space.gif

Synthesis Output

  

space.gif

../images/tidbits/blocki2.gif
  

space.gif

 ../images/main/bulllet_4dots_orange.gifExample - Nonblocking
  

space.gif


  1 module nonblocking (clk,a,c);
  2 input clk;
  3 input a;
  4 output c;
  5  
  6 wire clk;
  7 wire a;
  8 reg c;
  9 reg b;
 10   
 11 always @ (posedge clk )
 12 begin
 13   b <= a;
 14   c <= b;
 15 end
 16    
 17 endmodule
You could download file nonblocking.v here
  

space.gif

Synthesis Output

  

space.gif

../images/tidbits/blocki1.gif


'VHDL' 카테고리의 다른 글

multi-driver error  (0) 2014.12.03
디논실 project woring notes  (0) 2014.10.31
기본 component  (0) 2014.10.30
GODI_PC based function generator_working notes  (0) 2014.10.27
8254 datasheet  (0) 2014.10.27
Posted by bogus919
,