Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

임베디드 하드웨어/FPGA

[FPGA] non-blocking assignment

방피터 2023. 10. 23. 21:59

오랜만에 하는 FPGA라 기억이 가물가물~ 해 ㅋㅋ 

사실 HDL은 문법이 매~~~우 간단해. 설명하기 민망할 정도랄까?

그런데 내가 생각해도 약간 이해가 필요한 부분이 있어.

바로 non-blocking/block assignment야.

이 이미지를 상상하면 더 헤깔린다!

"<=" : non-blocking assignment

"=": blocking assignment

 

간단한 예를 들어보자구.

case(state_count)
    2'b00: begin
        state_count <= 2'b01;
        if(trig == 1) begin
            state_count <= 2'b10;
        end
    end
    2'b01: begin
        ...
    end
    2'b10: begin
        ...
    end
    ...
    .
    .
endcase

2'b00 state를 보면 trig가 1이면

state_count에는 2'b01이 할당될까? 아니면 2'b10이 할당될까?

non-blocking assignment는 현 단계의 마지막에 업데이트 된다고 보면 돼.

그러므로 trig가 1일 때 결국은 state_count에는 2'b10이 할당될거야.

너무 당연한가? ㅋㅋㅋ

 

자 그럼! 아래와 같은 애들은 어떨까?ㅋㅋ

always @ (posedge(clk) or negedge(nrst))
begin
	pre_busy <= busy;
    if(pre_busy == 0 && busy == 1) begin
    	state_count <= state_count+ 1;
    end
    case(state_count)
    	2'b00:
        ...
        ...
        .
        .
    endcase
end

위 코드에서 pre_busy <= busy;가 있고 바로 그 다음 줄에 그 둘을 비교하고 있는데 ㅋㅋ

아마 일반 프로그래밍 언어에 익숙한 사람들은

이게 도대체 뭐야??🤬 라는 생각이 먼저 들거야 ㅋㅋ

 

위에서 설명했듯이 non-blocking assignment는 현 시간 단계의 끝에서 업데이트 될거야.

그러니까 pre_busy에 busy를 담긴 할건데 이 클럭의 끝에서 할당할거야.

pre_busy는 이전 시간 단계의 busy 값을 가지고 있으니까

그 값을 비교할 수 있는 거지.

 

이런식으로 non-blocking assignment의 특성을 이용해서

어떤 시그널의 edge를 찾기도 한다는 거!!

(위의 경우에는 busy의 rising edge를 찾은 거!)

알아두면 실전에서 매우 도움될껄? ㅎㅎ 아님 말고~

 

안녕~

반응형