https://github.com/pyong-1459/Deinterleaver-2022-mod1536
GitHub - pyong-1459/Deinterleaver-2022-mod1536
Contribute to pyong-1459/Deinterleaver-2022-mod1536 development by creating an account on GitHub.
github.com
이번에도 K대 프로젝트로, 예전에 설명한 deinterleaver에서 mod 변수가 2의 승수가 아닌 경우를 구현했다.
이번 벡터 파일은 0~1535 까지의 A~H 총 8개 데이터를 interleave한 결과다.
rule은 아래와 같다.
A: Out(8w+0) = A((w + 0) mod 1536)
B: Out(8w+1) = B((w + 768) mod 1536)
C: Out(8w+2) = C((w + 384) mod 1536)
D: Out(8w+3) = D((w + 1152) mod 1536)
E: Out(8w+4) = E((w + 1344) mod 1536)
F: Out(8w+5) = F((w + 192) mod 1536)
G: Out(8w+6) = G((w + 960) mod 1536)
H: Out(8w+7) = H((w + 576) mod 1536)
이번에 설계한 회로는 interleave 된 데이터를 단일 SRAM에다가 입력하고 읽어오는 동작을 수행한다.
예전에 기본적인 내용은 살펴봤으므로 이번엔 어떻게 mod 1536을 구현했는지를 알려주려고 한다.
우선 1536은 2진수로 11'b110_0000_0000이다.
그리고 interleave 되는 데이터 중 0을 제외하고 가장 작은 index는 192이다. 192는 2진수로 8'b1100_0000이다.
나머지 index들은 전부 192의 배수다.
여기서 발견할 수 있는 규칙성은 아래와 같다.
1. LSB 6bit는 A~H 각각 다 같다.
2. MSB 8bit는 A~H에 대해 아래와 같은 값의 범위 내에 존재한다.
A: 0~23
B: 24~47 (24 + 0~23)
C: 48~71 (48 + 0~23)
D: 72~95 (72 + 0~23)
E: 96~119 (96 + 0~23)
F: 120~143 (120 + 0~23)
G: 144~167 (144 + 0~23)
H: 168~191 (168 + 0~23)
LSB가 6비트이고 데이터는 8가지이므로 LSB는 9비트로 설정할 수 있다. 이 중 하위 3비트는 A~H를 번갈아가면서 SRAM에 쓰고자 만들었고, 상위 6비트는 SRAM에 입력되는 14bit Address중 하위 6비트를 나타내기 위해 쓰인다.
따라서 0~23까지 순환하는 카운터를 이용하여 A~H에 따라 다른 offset을 더하여 Address의 MSB 8bit를 구현할 수 있다.
offset은 1536의 하위 6비트를 제거한 값, 즉 64로 나눈 값인 24의 배수가 된다.
매 클락 주기마다 NWRT는 0과 1로 진동하며, NCE는 카운터가 동작할 때부터 0이 된다.
A~H의 카운터는 AtoH라 이름지었으며 각 카운터를 정해진 값(112~119줄 참고)으로 초기화하기 위해 enb 신호를 넣어주었다.
해당 값들은 14비트 데이터 중 상위 8비트이기 때문에 각기 다른 index(0, 768, 384, 1152, 1344, 192, 960, 576)를 64로 나눈 값이 된다.
LSB는 NWRT 한주기마다 변해야 하므로 NWRT를 트리거로 설정하였으며, AtoH는 LSB가 0으로 초기화될 때마다 1씩 증가하므로 LSB가 최대값일때를 트리거로 설정했다.
테스트벤치는 vector1.txt를 읽어와 사용했으며, 해당 파일은 vector_gen.py에서 생성했다.
시뮬레이션을 돌려보면 deinterleave 된 데이터는 같은 값이 연속으로 8개씩 출력되며 0~1535의 순서대로 나타난다.
'Verilog HDL 설계' 카테고리의 다른 글
Icarus Verilog 사용법 및 유용한 팁 (0) | 2022.09.12 |
---|---|
Single Cycle RISC-V 32I 프로세서 설계 (6) | 2022.07.14 |
Discrete Cosine Transform 구현 (2) | 2022.06.30 |
덧셈과 뺄셈, 그리고 sign extension (0) | 2022.06.02 |
include의 필요성 및 사용법 (0) | 2022.04.12 |