오랜만에 하는 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를 찾은 거!)
알아두면 실전에서 매우 도움될껄? ㅎㅎ 아님 말고~
안녕~
'임베디드 하드웨어 > FPGA' 카테고리의 다른 글
[FPGA] 이젠 하다하다 FPGA까지 하는구나.. (0) | 2023.09.19 |
---|