2012-12-29 5 views
3

데이터 경로 회로 용 FSM 컨트롤러를 구현 중입니다. 컨트롤러는 내부적으로 카운터를 증가시킵니다. 아래 프로그램을 시뮬레이션 할 때 카운터는 업데이트되지 않았습니다.Verilog에서 카운터 변수 증가 : 조합 또는 순차

reg[3:0] counter; 

//incrementing counter in combinational block 
counter = counter + 4'b1; 

는하지만, Verilog Best Practice - Incrementing a variable에 기재된 바와 같이, counter_next를 추가 변수를 생성하고 만 순차 블록 카운터 증가에, 카운터가 증가 얻는다.

reg[3:0] counter, counter_next; 

//sequential block 
always @(posedge clk) 
    counter <= counter_next; 

//combinational block 
counter_next = counter + 4'b1; 

이전의 경우 카운터가 증가하지 않는 이유는 무엇입니까? 내가 놓친 게있어?

답변

9

확인. 나는 컴파일하지 않아야하므로 첫 번째 예제에서 일부 코드를 남겨 두었다고 가정합니다. 그러나 나는 당신을 위해 그 문제를 어떻게 든 설명 할 수 있다고 생각합니다. 다음과 같습니다 블록에서

:이 문제가

always @(*) begin // or always @(counter) 
    counter = counter + 4'b1; 
end 

.

1) 카운터가 초기화되지 않습니다. 모든 'reg'유형 변수는 시뮬레이션 시간 시작시 X이므로 X에 1을 더하면 X가됩니다.

2) 이것은 조합 루프로 간주됩니다. 블록은 '카운터'의 변화에 ​​민감합니다. 따라서 '카운터'가 0으로 초기화되었다고 가정해도 시뮬레이터는 '카운터'를 업데이트하고 시뮬레이션 시간은 결코 앞당길 수 없습니다. 즉

always block executes -> counter = 1 
counter has changed 
always block executes -> counter = 2 
counter has changed 
and so on... 

$ display 문을 넣으면이 루프가 발생할 수 있습니다. 그렇지 않으면 시뮬레이터가 멈춰서 파도가 기록되지 않습니다.

두 번째 예제가 작동하는 이유는 조합 루프를 위반하는 플립 플롭을 가지고 있기 때문입니다. 각 클럭 에지에서 'counter'는 'counter_next'의 현재 값으로 업데이트됩니다. 그런 다음 조합 블록은 'counter_next'의 새 버전을 계산하기 위해 한 번만 (한 번만) 실행됩니다.

완전성을 위해 재설정 절이나 초기 명령문을 통해 '카운터'초기화가 아직 부족합니다.

reg [3:0] counter; 
reg [3:0] counter_next; 

always @(*) begin 
    counter_next = counter + 1; 
end 

always @(posedge clk or negedge rst_l) begin 
    if (!rst_l) 
     counter <= 4'b0; 
    else 
     counter <= counter_next; 
end 
+0

분명히 코드가 컴파일되지 않습니다. 에지 - 트리거 (edge-trigger)에서 '카운터'를 바꾸는 것이 효과를 발휘할 수있는 유일한 변화로 막대한 양의 코드를 생략했습니다. 두 경우 모두 'counter'레지스터가 0으로 초기화되었습니다. – iab

+0

우연히 시뮬레이션에서 '루프'가 발생하지 않았습니다. 'counter'변수는 업데이트되지 않았습니다. 그것은 방금 0으로 고정되었습니다. 상수에 대해 'counter'의 값을 비교할 때 루프가 발생하지 않을 것입니다. – iab

+1

충분합니다. 나는 다른 곳에서 비교가 무엇을하는지에 관해 명확하지 않다. 현재 (시뮬레이터) 루프 동작을 확인하기 위해 시뮬레이터에 액세스 할 준비가되지 않았지만 실제로 조합 루프가 첫 번째 예제에서 문제가됩니다. 이것은 기본적으로 '이 와이어 세트는 X와 X + 1을 동시에 나타냅니다'라고 말합니다.이 작업을 수행 할 수있는 하드웨어는 없습니다. Verilog는 명령형 프로그래밍이 아닙니다. 여기에 하드웨어를 설명하고 있습니다. –