[컴퓨터구조] PCI Bus
by 너나나교수님 설명 들으면서 적은거라 틀릴 수 있습니다!!!!
PCI : Peripheral Component Interconnection
Address bus와 data bus를 따로 두지 않고 버스를 하나만 두되 addres와 data가 번갈아가면서 사용(time multiplexing)
Arbitration : bus에 두개 이상의 device가 동작하려고 할때 순서를 정해주는 것!!!
동시에 데이터를 보내면 충돌 일어나니까!!!!!
master(=initiator)이 bus를 요청 -> 승인되면 I/O read/write 결정(Address phase와 one or mor data phases가 결합된 형태로)
그니까 그냥 PCI는 버스다!! PCI Read Timing Diagram를 보면서 이해해보자!!!
clock은 rising edge와 falling edge가 있는데 (비율은 50대 50) rising하고 falling 하는게 한클럭!!
rising edge에서는 sampling을 함(저기 점선부분)
이 기간에는 모든 버스에 연결된 device들이 버스상에 무슨 정보가 오고가는지를 모니터링 하는 시간(버스의 값들을 읽어들이는 시기)
falling edge에서는 변화가 일어난다!! 버스상의 signal에 변화가 일어난다!! 즉 action을 취하는 타이밍 -> 이걸 assert라고 부름(버스에 1이나 0같은 어떤 값을 싣는 행위) 무슨 값을 줄때는 falling edge에 줘야한다!! falling edge에서 내가 무슨 값을 주면 그걸 반 cycle 뒤에 모든 device들이 sampling을 하게됨(rising edge일때) 그래서 한 사이클 안에 assert와 sampling이 반복적으로 일어날 수 있게 설계돼있다!!!!!
잘 보면 FRAME 뒤에 #이 붙어있는데 이건 bar가 붙은거랑 똑같음!! negation의 의미(값이 뒤집혔다)
버스에서 바나 #이 붙었다는 것은 active low라는것! signal이 0으로 떨어진것을 assert했다고 생각 #이 안붙어있으면 값이 올라갔을때 assert 된것
그래서 frame은 쭉 assert 돼있다가 transaction이 끝나면 철회(deassert)된다
AD는 저렇게 아래위로 선이 다 그어져있는데(high도 아니고 low도 아님) address건 data건 32bit데 각각의 라인을 볼때 어떤 line은 high일 수 있고 어떤 line은 low일 수 있으니까 저렇게 표현!! 101010 이런 combination이니까 여튼 뭔가 assert 돼있다는 뜻이다!! 밑에 C/BE 저거도 똑같다 그냥 command데 저건 4비트다!!
IRDY랑 TRDY, DEVSEL도 다 #이 붙어있다 -> 마찬가지로 값이 떨어졌을때 assert 값을 올리면 deassert(철회)
대충 diagram해석하는 법을 알아봤고 이제 저 signal에 대해 알아보자!!
일단 clk은 initiator가 계속 주는것-> 모든 버스를 사용하는 device들은 clock에 연동돼야함
frame은 initiator가 transaction을 유지하기 위해 사용하는 control signal! 내가 데이터를 보내거나 받는 행위를 완료할 때 까지 계속 이거를 붙들고 있음 -> 내가 frame을 assert 하고 있는 동안에는 다른 initiator 사용 못한다!! 내가 버스의 사용권을 가지고 있음을 나타냄!!
이것에 대응하는 target device의 시그널 -> DEVSEL : 선택된 device가 내가 initiator에 대응해서 transation을 이끌고 가고있는 counter part라는걸 나타냄! 내가 initiator한테 데이터를 주거나 받거나 그런 행위를 하는 친구다!! 라는것!!
그래서 transaction은 frame과 devsel에 의해 유지됨!! 다른 어떤 target이나 initiator이 개입하지 못하도록 transaction 기간을 보장해주는것
AD는 address와 data가 time multiplexing 되고있는것
C/BE는 command/byte enable의 약자!! 4비트로 돼있음 그러니까 command를 줄 때 이 4bit 라인을 통해 16개의 서로 다른 command를 줄수 있고 command를 주고나면 이 라인은 32비트(4바이트)를 각 바이트를 4바이트를 다 읽을껀지 아니면 그중에 한 바이트만 읽을껀지를 지정하는데 사용!! encoding안함
IRDY, TRDY는 pair(initiation ready, target ready)!! 얘네는 하나의 데이터를 주고받기 위해 IRDY와 TRDY가 서로 handshaking하는것 -> IRDY가 "내가 데이터를 보낼께!!" 하면 TRDY가 "알겠어!!"하는 이렇게 서로 조율하는거라고 보면 된다!! 그래서 매 데이터가 갈때마다 이 둘이 서로 주고받는걸 조율함.
이게 그림에 대한 설명이고 이제 이 example이 어떻게 돌아가는지 보자!!
위에 필기가 너무 드러워서 깨끗한 diagram으로 준비했따!!
a는 initiator에서 frame을 assert하는 순간이다. falling edge에서 assert 한다!! 이 transaction은 내가 소유하고 있다는걸 알려줌
그리고 동시에 일어나는게 바로 address를 주는것이다!! 그리고 command도 동시에 준다!! frame을 assert하면서 target device의 주소와 read라고 하는 command를 준다.(이 diagram이 read하는 diagram이고 AD에 DATA-1, 2, 3 다 read 해야함)
반cycle 뒤에 b시점에 sampling에 들어가면 frame이 assert된것도 알거고 address에 자기 주소가 있으니까 target이 transaction이 시작됐고 나한테 뭐 하라고 하는구나!! 라는걸 알게됨, 그리고 command를 보면 나더러 어떻게해라는지 알게된다(데이터를 읽어라는지 쓰라는지)-> 데이터를 읽겠다!! 그래서 initator가 target한테 데이터를 달라고 한다(읽어라고)
이제 c로 가면 새로운 assert가 발생한다. (두번째 cycle의 falling 시점) 이 initiator에 이미 command는 전달했으니까 두번째 시점에 내가읽을 byte구성을 알려준다!! 그리고 여기서 turnaround cycle이 발생한다.
지금 initiator가 bus를 driving해서 address를 띄웠는데(실었는데) 데이터는 target이 줘야한다(read니까 initiator가 데이터를 읽어야함) 그래서 bus를 driving 하는 주체가 initiator에서 target으로 바뀐다!! 이제 target이 bus를 driving 해서 data를 실을 차례가 됐다!!!! address와 data가 같은 버스를 사용해서 일어나는 현상.
그래서 turnaround cycle은 버스를 driving하는 주체가 바뀌기 때문에 한 cycle정도 여유가 필요하다는 뜻!!
그리고 아까 b시점에서 주소를 sampling 했는데 반사이클 뒤에 데이터를 끄집어내기에는 시간이 부족하다. 그래서 turnaround cycle 줌 (write면 필요없음)
만약 read가 아니라 write였다면 turnaround cycle 없이 address뒤에 바로 data를 보냈을 것이다!! 주체를 바꿀 필요가 없으니까 연이어서 데이터를 실었을 것이다.
initiator은 읽을 준비가 됐다는 뜻에서 IRDY 신호를 준다. 타겟은 그거보다 한 cycle뒤에 데이터를 버스에 실으면서 target ready(TRDY)를 준다(turnaround cycle이 끝나고 d 시점에서 target이 데이터를 버스에 실으면서) 또 동시에 DEVSEL을 준다. 이렇게 주면 initiator 입장에서 반 사이클 뒤에 sampling을 통해서 첫번째 데이터를 읽어가고 TRDY와 DEVSEL이 assert됐다는 것을 알게됨.
아무 문제가 없으면 IRDY와 TRDY가 assert된 상황에서 두번째 데이터와 세번째 데이터가 연이어 들어오면서 끝날 수 있음!! 근데 여기는 한번 꼬았다!!!
f시점에서 TRDY에 무슨 문제가 생겼는지 다음 데이터를 바로 못줘서 기다려달라고 deassert함 -> 그러면 clk 5에 rising edge 시점에 initiator가 보게됨! 아 타겟이 지금 시간이 필요하구나를 알게 돼서 clk 5에서는 데이터 안읽음. 그러고 한사이클 뒤에 target이 다시 assert하면서 두번째 데이터를 실음 -> 그걸 반사이클 뒤에 clk 6의 rising edge 시점에서 알게되고 initiator가 데이터를 읽어감-> 그러고 반사이클 뒤에 이번엔 IRDY가 deassert함 근데 traget은 bus에 실어서 그냥 가만히 머물러있음 그래서 clk7에서는 transactin가 일어나지 않고 h시점에 initiator가 frame을 철회(deassert) 하면서 IRDY를 줌 -> 이제 마지막이니까 다른 애들이 버스 사용해라고 frame 철회함 -> 그 철회는 clk 8에 일어나고 transactin이 완전히 종료됨!!!
블로그의 정보
공부 기록
너나나