2011-10-28 3 views
4

나는 얼마나 많은 클록 사이클이 있었는지를 카운트하는 Verilog에서 카운터를 생성하려고 시도하고 있으며, 리셋하고 다시 시작합니다.24 비트 카운터 상태 머신

24 개의 D 플립 플롭을 포함하는 다른 모듈과 함께 24 비트 덧셈 모듈을 생성하여 가산기에서 출력되는 사이클 수를 저장합니다.

다음으로 천만 사이클이 지나고 재설정 상태가 될 때까지 카운트 상태에있는 상태 시스템을 갖고 싶습니다.

소리가 나나요? 문제는 상태 시스템을 구현하는 방법을 잘 모르겠습니다.

누구나 나를이 웹 사이트/저서로 안내 할 수 있습니까?

감사

답변

3

당신은 상태 머신이 필요하지 않습니다. 이미 카운터에 상태가 있습니다. 당신이해야 할 일은 그 시점 의사 코드에서

에 당신의 카운터에 당신이 부하 0에서 포장하려는 값을 감지 할 수 있습니다 :

if count == 10000000 then 
    nextCount = 0; 
else 
    nextCount = count + 1; 

... 나 ...

nextCount = count + 1; 
if count == 10000000 then 
    resetCount = 1; 
4

폴 S가 이미 언급했듯이 오버플로 후 카운터를 계속 계산하려면 상태 시스템이 필요하지 않습니다. 당신은 (오타를 포함 할 수 있습니다, 검증되지 않은) 같은 것을 할 수 물론

module overflow_counter (
    clk, 
    reset, 
    enable, 
    ctr_out 
); 

// Port definitions 
input clk, reset, enable; 
output [23:0] ctr_out; 

// Register definitions 
reg [23:0] reg_ctr; 

// Assignments 
assign ctr_out = reg_ctr; 

// Counter behaviour - Asynchronous active-high reset 
initial reg_ctr <= 0; 
always @ (posedge clk or posedge reset) 
begin 
    if (reset)     reg_ctr <= 0; 
    else if (enable) 
    begin 
    if (reg_ctr == 10000000) reg_ctr <= 0; 
    else      reg_ctr <= reg_ctr + 1; 
    end 
end 

endmodule 

, 사용자 정의 모듈 당신이 범람 카운터를 할 때마다 필요가 없습니다 그래서 일반적으로 당신이 매개 변수를 사용하십시오. 나는 너에게 맡길거야;).

[편집] 다음은 FSM을 사용하는 데 도움이되는 몇 가지 문서입니다. 난 그냥 "를 Verilog 상태 머신"에 대한 구글 검색 :

내가 첫 번째 논문을 읽을 수 없습니다, 그래서 내가 그에 대해 언급 할 수 없다. 두 번째는 FSM 코딩의 다양한 스타일을 보여줍니다. 그 중에서도 항상 3 스타일을 차단합니다. 디버깅이 훨씬 쉽기 때문에 (상태 전환과 FSM 출력이 깔끔하게 분리되어 있기 때문에) 필자가 권장하는 3 가지 스타일이 있습니다. 링크가 다운 된 것 같습니다. 여기에 the cached Google result입니다.

2

상태 기계가 너무 까다 롭지 않습니다. localparam을 사용하십시오 (너비와 너비는 잊어 버리지 말고 하나의 비트이기 때문에 여기에 표시되지 않음). 그러면 상태에 대한 레이블을 정의 할 수 있습니다. 그런 다음 두 개의 reg 변수 (state_reg, state_next)를 만듭니다. _reg 변수가 실제 레지스터입니다. _next 변수는 "와이어 레지스터"(조합형 항상 블록 내부에 할당 할 수있는 와이어)입니다. 기억해야 할 두 가지 사항은 combinational always 블록 (그리고 나머지 combinational logic)에서 X_next = X_reg;을 수행하고 sequential always 블록에서 X_reg <= X_next;을 수행하는 것입니다. 특수한 경우를 좋아할 수는 있지만 이러한 간단한 규칙을 고수하면 모든 것이 올바르게 작동합니다. 나는 Verilog가 adders에 대한 훌륭한 지원을하고 있기 때문에 adders와 같은 아주 간단한 것들에 대해서는 인스턴스화를 사용하지 않으려 고한다.

저는 FPGA를 사용하기 때문에 초기 값을 레지스터에 할당하고 재설정 신호를 사용하지 않습니다. 확실하지는 않지만 ASIC 디자인에서는 반대라고 생각합니다.

localparam STATE_RESET = 1'b0, STATE_COUNT = 1'b1; 

reg [23:0] cntr_reg = 24'd0, cntr_next; 
reg state_reg = STATE_COUNT, state_next; 

always @* begin 
    cntr_next = cntr_reg; // statement not required since we handle all cases 
    if (cntr_reg == 24'd10_000_000) 
     cntr_next = 24'd0; 
    else 
     cntr_next = cntr_reg + 24'd1; 
    state_next = state_reg; // statement required since we don't handle all cases 
    case (state_reg) 
     STATE_COUNT: if (cntr_reg == 24'd10_000_000) state_next = STATE_RESET; 
    endcase 
end 

always @(posedge clk) begin 
    cntr_reg <= cntr_next; 
    state_reg <= state_next; 
end 

나는 매우 도움이 될 this book을 발견했다. 이 책에는 VHDL 버전이 있으므로 Rosetta Stone으로 나란히 사용하여 VHDL을 배울 수 있습니다.

+0

나는 귀하의보기에서 국가가 달성 한 것을 보지 못합니다. 그것에 의존하는 것은 없습니다. 이 코드를 FPGA에 넣으려면 신시사이저가 상태 관련 코드를 최적화해야합니다. – Darhuuk

+0

원래 질문에 답하고있었습니다. –

관련 문제