1. 목적
지금까지 배운 Verilog에 대한 지식을 활용하여 여러 가지 순차회로를 설계함
2. 기초지식
- 여러 가지 순차회로에 대한 동작 이해
레지스터
레지스터는 n-bit 데이터를 저장하는 기억소자이다. 클럭에 동기가 되어 이루어지며 제어신호로 비동기 제어 신호인 reset, 동기 신호인 load가 있는데 동작은 이러하다
reset load CLK Qi
0 x x 0
1 0 ↑ Qi
1 1 ↑ Di
카운터
매 클럭마다 정해진 손서에 따라서 상태값이 변하는 레지스터를 말한다. 클럭에 따라 변하면 동기식 카운터 그렇지 않으면 비 동기식 카운터라고 한다.
이번 숙제의 경우 아래의 동작을 해야한다.
reset load enable 동작
1 x x reset (출력 0)
0 1 x parallel load
0 0 1 count (증가)
0 0 0 변화없음
parallel load는 병렬 로드로 기존 값에 상관 없이 data값을 그대로 출력하는 것을 말하고 count는 주어진 진수에 맞추어 reset0이고 load0 enable1일 때 증가한다.
제어신도 모두가 0일 때는 변화 없다.
- 동기 제어신호와 비동기 제어신호에 대한 이해
보통은 clock이 상승에지이냐 하강에지이냐에 따라서 출력값들이 영향을 받도록 설계를 한다. 컨트롤이 편하기 때문이다. 카운터를 예로들어 설명하겠다. 카운터의 모든 상태가 클럭에 따라서만 변하면 이것은 동기식 카운터 그렇지 않으면 비 동기식 카운터라고 한다. 여기서 나오는 비동기 제어신호는 clock의 영향을 받지 않고 또 다른 제어신호가 상태에 영향을 준다는 것을 의미한다.
`차이`
clock이…(생략)
3. 지식에 대한 자료
4. 실습 내용
(1) 다음과 같은 입출력 신호를 갖는 N-진 counter를 설계하고 동작을 검증하시오. 여기서N은 기본값이 16인 parameter로 지정하여 바꾸어서 재사용 가능하도록 하시오.
(2) 앞에서 설계한 카운터를 사용하여 60진 카운터를 구성하고 동작을 확인하시오. (10진 카운터와 6진 카운터 사용)
|
[size-1:0]data;
output [size-1:0]qout;
output tc;
reg [size-1:0]qout;
always @ (posedge clk) begin
if(reset)qout`=4`b0;
else if(load) qout`=data;
else if (en) qout `= qout +1;
end
assign tc = (qout 4`b1111);
endmodule
※위의 2개의 module들은 한 프로젝트 안에 서로 다른 파일로 각각 작성하였다.
(2) 앞에서 설계한 카운터를 사용하여 60진 카운터를 구성하고 동작을 확인하시오. (10진 카운터와 6진 카운터 사용)
4.2 레지스터 파일과 FIFO 설계
(1) 지정된 write 레지스터에 값을 쓰고, 지정된 read 레지스터의 값을 읽는 것을 동시에 수행할 수 있는 8개의 8비트 레지스터를 포함한 레지스터 파일을 설계하고 동작을 확인하시오.
(2) (도전문제) 앞에서 설계한 레지스터 파일을 사용하여 다음과 같은 FIFO를 설계하고 동작을 확인하시오.
module FIFO(clk, reset, read, write, din, dout, empty, full);
- read가 1이면 FIFO의 맨앞의 레지스터 값을 dout으로 출력하고 FIFO 맨앞 위치 이동
- write가 1이면 FIFO의 맨뒤의 레지스터에 din을 입력하고 FIFO 맨뒤 위치 이동
- read와 write가 동시에 1이면 두 동작이 동시에 수행됨
- FIFO가 비어있으면 empty를 1로 출력, 꽉찼으면 full을 1로 출력함