, FSM

2014-11-13 7 views
0

Verilog 코드를 쓰는 사람은 알테라의 싸이 클론 II FPGA 보드에 프로그램 될, 나는 키 스위치의 언론에서 활성화해야 always 블록이 있습니다, FSM

reg START; 

... 
... 

always @ (negedge key[3]) begin 
    if (START != 1) START = 1; 
end 

필자는 유한 상태 컴퓨터 용 프로그램을 작성하고 있으며이 키를 누르면 사용자가 프로그램을 사용하기 시작하고 초기 상태에서 다음 상태로 이동해야 함을 나타냅니다. 레지스터의 초기화가 합성 가능하지 않기 때문에 START이 0에서 시작한다고 가정 할 수 없습니다.

일단 보드를 프로그래밍하고 전원을 켜면이 always 블록이 이미 한 번 실행 된 후에 키를 누릅니다. key[3]에 할당 프로그램 실행시 START의 값에 대한 검사를 수행했으며 이미 1입니다. 키가 키를 누를 때만 부정적인면에 있기 때문에 이것이 일어나는 이유를 알 수 없습니다. 이전 상황에서 항상 같은 조건의 블록을 사용 했으므로 문제가 없으므로 초기화가 START과 관련이 있다고 가정합니다.

답변

1

initial의 synthesizability은 당신이 코딩 대상에 따라 달라 주목해야한다.
예를 들어 시뮬레이터를 코딩하면 initial이 멋지게 작동합니다. 타겟이 FPGA 인 경우 툴 (귀하의 경우에는 quartus)은 회로도와 그 안에있는 모든 트리거의 초기 상태를 완벽하게 제어 할 수 있습니다. 실제로 FPGA에 펌웨어를 업로드하면 모든 트리거가 알려진 상태로 설정되고 quartus는 initial을 구문 분석하여 각 트리거의 상태를 파생시킵니다. 반대로, 타겟이 베어 실리콘이라면 모든 트리거는 트랜지스터의 무리 일 뿐이며 전원이 켜지면 상태가 완전히 정해지지 않으므로 전원이 켜진 상태를 제어하는 ​​유일한 방법은 일부 유형의 리셋을 적용하는 것입니다. 이 같은 :

always @(posedge clk, negedge rst_n) 
if(!rst_n) 
    START <= 1'b0; // no start condition upon reset 
else if(some_condition) 
    START <= 1'b1; 

코드에 또 다른 점은 스위치에서 입력을 구문 분석 할 때이 같은 설계의 시계 먼저 재 동기화를 수행해야한다는 것입니다 :

reg start_r, start_rr; 
always @(posedge clk) 
begin 
    start_r <= START; 
    start_rr <= start_r; 
end 
// now use start_rr instead of START 

재 동기화가 준 안정 피하기 위해 핵심 요소입니다 상태를 동기식 설계에 적용하십시오.

두 번째 요점은 스위치가 여러 번 트립되는 것을 허용하지 않는 한 정비사 스위치의 모든 입력을 디 바운싱하는 것이 좋습니다.

Ryan McClure가 묻는 원래 문제로 돌아갑니다. 시작시 initial START가없는 원래 코드는 시작시 정의되지 않고 '1'상태로만 이동할 수 있음을 알 수 있습니다. 따라서 신디사이저는 START가 항상 일정하다고 가정하고 항상 '1'로 설정합니다.

1

"초기"블록을 사용하여 신호의 시작 값을 설정해야합니다. START 값과 key [3] 값을 설정해야합니다.

initial begin 
    START = 1'b0; 
    key[3] = 1'b1; 
end 

당신은하지 시작은 0

에서 시작하지만 이것은 사실이 아니다 가정 내가 할 수있는,

레지스터의 초기화가 합성이 아니므을했다! 위의 방법으로 디자인의 모든 신호에 기본값을 설정할 수 있습니다. 이 값은 펌웨어의 비트 스트림과이 매우 값이있는 신호 시작에 포함됩니다.

환호

+0

흠, 교수님이 합성 할 수 없기 때문에 초기 블록을 사용하지 말라고 명시 적으로 말씀하셨습니다 ... 시뮬레이션에서만 작동합니다. 나는 그것을 쏜다! –

+0

@Ryan McClure 나는 이니셜이 합성 불가능하다고 가정했지만, 오늘날 툴은 자일링스와 알테라 툴을 위해 비트 스트림에서 디폴트 값으로 사용한다. 이 값은 구성시 설정됩니다. – grorel

+0

FPGA의 기본 설정에'initial'이 사용됩니다. ASIC의 경우 비동기 재설정이 일반적으로 사용되기 때문에 재설정은 전원 켜기 재설정 모듈에서 수행됩니다. – Morgan