본문 바로가기

분류 전체보기

(24)
간단한 Deinterleaver Interleaving은 연속적인 데이터를 섞어주는 것을 의미한다. Interleaver를 쓰는 이유는 무선 데이터 전송 시에 연속적인 에러가 발생하는 경우 데이터를 섞음으로써 시간 상이나 주파수 상에서 에러를 분리하기 위해서다. 아래의 예시처럼 burst error가 생기는 경우 에러를 분산시키는 효과가 있다. 에러가 분산되면 에러를 정정(error correcting)하기 쉬워진다. 5g나 lte에서도 interleaver를 사용한다. Deinterleaving은 interleaved data를 다시 순서대로 정렬해주는 것이다. 오늘은 Verilog로 Deinterleaver를 만드는 법을 다뤄보고자 한다. 2048개의 데이터를 4개의 묶음으로 interleaving하는 것은 아래와 같이 표현할 수 ..
D latch, Master-Slave D flip-flop 구현 (gate level) D latch는 논리회로로는 아래와 같은 회로도처럼 구현할 수 있다. 진리표의 경우 아래와 같으며, E는 CLK으로 취급할 수 있다. CLK로 취급하는 이유는 나중에 설명할 Master-Slave에서 E를 CLK로 사용하기 때문이다. 두 경우 전부 다 구현해보겠다. module dlatch1( // nand only input D, CLK, output Q, Q_ ); wire R, S; nand na0(S, D, CLK); nand na1(R, S, CLK); nand na2(Q, Q_, S); nand na3(Q_, Q, R); endmodule module dlatch2( // and, or, not input D, CLK, output Q, Q_ ); wire R, S; and a0(S, ~D, ..
8bit Binary to BCD Double dabble 이라는 알고리즘이 있다. Double dabble 알고리즘은 아래와 같은 과정을 반복하여 2진수를 10진수로 변환한다. 1. 입력된 2진수를 1bit left shift한다. 2. 입력의 비트 크기만큼 shift를 하게 되면, 1, 10, 100, 1000, ... 의 column에 있는 숫자들로 BCD 코드를 출력. 그 외의 경우 과정 3을 진행한다. 3. 각 column의 값이 5 이상일 경우 각 column에 3을 더해준다. 4. 과정 1부터 다시 실행한다. 알고리즘 설명은 여기까지 하고, 이제 해당 알고리즘을 베릴로그 상에서 구현하는 방법을 생각해보자. 1) 우선 left shift를 했을 때 값을 hold 할 register가 필요해 보인다. 따라서 register를 컨..
코드 작성을 위한 몇가지 팁(1) 이때까지 회로설계를 하면서 편하게 그리고 팀원과 같이 프로젝트를 진행할때 썼던 팁을 써본다. 1. always @ (*) 사용 자제 앞선 글에서 언급했듯이 always @ (*)을 통해 회로를 설계를 하는 것은 좋지 않다. always문 안에서는 reg 변수만이 쓰일 수 있기 때문이다. reg 변수는 특성상 값을 hold하게 되는데 if else나 case문 같은 조건문을 사용할 때 예외경우를 명확하게 정의하지 않으면 값을 hold하게 된다. module mux_example( input [1:0] in0, in1, in2, input [1:0] sel, output reg [1:0] out ); always @ (*) begin if (sel == 2'b00) begin out = in0; end el..
MUX 4-to-1 MUX를 예시로 구현했다. 4-to-1 MUX는 2bit select 변수 값에 따라 in0, in1, in2, in3 중 하나를 선택하여 출력으로 내보내는 회로이다. 일반적으로 select의 2진수 값이 0, 1, 2, 3일 경우 각각 in0, in1, in2, in3를 선택하게 된다. 순서대로 case, if를 이용한 설계와 조건 연산자 ? : 를 이용한 설계 예시다. module mux0( input [1:0] in0, in1, in2, in3, // bit size can be changed input [1:0] select, output [1:0] out ); reg [1:0] mux_out; assign out = mux_out; always @ (*) begin // always..
Clock frequency divider Clock frequency divider는 클락 주파수(clock frequency)를 나누는, 즉 기본 클락 주기의 2, 3, 4... 등의 배수의 클락을 만들어내는 회로다. 이미지 출처는 아래에 적어뒀다. https://theorycircuit.com/frequency-divider-circuit/ 주파수를 나누기 위해서는 카운터가 필요하다. 아래와 같이 구현이 가능하다. module clk_divide( input clk, rst, output reg clk_2, clk_4, clk_6 ); reg [1:0] count; reg [1:0] count2; reg enb; // assign clk_out = count[3]; always @ (posedge clk) begin if (rst) begi..
Counter RTL(Register Transfer Level) 상에서 일반적인 Counter는 0에서부터 설계자가 정한 한계까지 클락 edge마다 1씩 증가하는 회로다. 예전에 합성해봤을때 아마 가산기, MUX, Flip-flop을 썼던걸로 기억한다. 간단한 2의 승수 카운터는 아래와 같이 구현할 수 있다. module counter1( input clk, rst, output [3:0] cnt ); reg [3:0] count; assign cnt = count; always @ (posedge clk or posedge rst) begin if (rst) begin count
Verilog HDL 문법 소개 베릴로그 문법은 아래의 문서를 따른다. 구글에 verilog standard라고 치면 첫번째로 뜨는 문서다. www.eg.bucknell.edu/~csci320/2016-fall/wp-content/uploads/2015/08/verilog-std-1364-2005.pdf 목차별로 중요한 것들만 알아보자. 3.5 Numbers 3.5.1 Integer constants Example 1 비트수가 정해지지 않은 상수를 어떻게 표시하느냐를 나타낸다. 8진수 10진수 16진수로 나타낼 수 있다. 비트 수를 표시하지 않고 상수로 표시하는 것은 베릴로그 설계에서 추천하는 바는 아니다. 왜냐하면 10진수의 경우 예시처럼 659라고 표시한다면 합성(synthesis) 툴에서는 32비트짜리 상수 659로 인식한다. 비..