데이터 경로 회로 용 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;
이전의 경우 카운터가 증가하지 않는 이유는 무엇입니까? 내가 놓친 게있어?
분명히 코드가 컴파일되지 않습니다. 에지 - 트리거 (edge-trigger)에서 '카운터'를 바꾸는 것이 효과를 발휘할 수있는 유일한 변화로 막대한 양의 코드를 생략했습니다. 두 경우 모두 'counter'레지스터가 0으로 초기화되었습니다. – iab
우연히 시뮬레이션에서 '루프'가 발생하지 않았습니다. 'counter'변수는 업데이트되지 않았습니다. 그것은 방금 0으로 고정되었습니다. 상수에 대해 'counter'의 값을 비교할 때 루프가 발생하지 않을 것입니다. – iab
충분합니다. 나는 다른 곳에서 비교가 무엇을하는지에 관해 명확하지 않다. 현재 (시뮬레이터) 루프 동작을 확인하기 위해 시뮬레이터에 액세스 할 준비가되지 않았지만 실제로 조합 루프가 첫 번째 예제에서 문제가됩니다. 이것은 기본적으로 '이 와이어 세트는 X와 X + 1을 동시에 나타냅니다'라고 말합니다.이 작업을 수행 할 수있는 하드웨어는 없습니다. Verilog는 명령형 프로그래밍이 아닙니다. 여기에 하드웨어를 설명하고 있습니다. –