2014-12-11 6 views
1

나는 Altera DE2-115 FPGA를 가지고 있으며 Verilog를 스스로 배우려고합니다. 나는 연기 감지기를 만들기로 결심했다. 그리고 연기가 나면 언제나 부저음이 울린다. (연기 감지기는 디지털 신호을 출력한다.)연기 감지기 및 부저 용 Verilog 모듈

module fire(flag,clock,reset,fire,fire_state,firealarm); 
    input  clock, reset, flag, fire; 
    output [2:0] fire_state; 
    output  firealarm; 

    wire   fire; 
    reg [2:0] fire_state; 

    assign firealarm = (fire_state == 1) ? (flag ? 0 : 1) : 0; 

    always @ (posedge clock) 
    fire_state<= fire ? 1: 0; 

end module 

하지만이 실행되지 않습니다 내가 논리 오류의 많은이 코드에 있다고 생각, 도움하십시오 여기

내 재판입니까? :)

답변

5

endmodule은 하나의 단어이므로 공백을 제거해야합니다.

요즘 거의 모든 시뮬레이터는 verilog-2001 이상을 지원하므로 이전의 verilog 1995 스타일이 아닌 현대 포트 스타일 (ANSI)의 사용을 권장합니다.

module fire(flag,clock,reset,fire,fire_state,firealarm); 
input clock, reset, flag, fire; 
output [2:0] fire_state; 
output firealarm; wire fire;reg[2:0] fire_state; 

에 :

module fire(
    input   clock, 
    input   reset, 
    input   flag, 
    input   fire, 
    output reg [2:0] fire_state, 
    output   firealarm 
); 

내가 방향과 새 줄에 각 포트에 놓여있다, 이것은 훨씬 쉽게도, 그것을 코드를 유지할 수

귀하의 포트 목록에서 간다 더 읽기 쉽게 만들어 연결에 오타가 생길 가능성을 최소화합니다.

이 구문을 많이 사용 (flag?0:1) 한 경우 부울을 사용하여 부울을 선택하면 필요가없고 읽을 수 없게됩니다. 그것을 뒤집을 필요가 있다면 비트 반전 (~)입니다. 그러나 당신이 깃발을 사용하고있는 것이 명확하지 않습니다. 너비와 너비를 포함해야한다.

assign firealarm = (fire_state == 3'b1)? (~flag) : 1'b0; 

또한 조합에서 항상 블록을 작성할 수 있습니다 :

always @* begin 
    if (fire_state==3'b001) begin 
    firealaram = ~flag; 
    else begin 
    firealaram = 1'b0; 
    end 
end 

화재는 1 비트, fire_state 3 비트입니다.

always @ (posedge clock) begin 
    fire_state <= {2'b0, fire}; 
end