Module 用于烟雾探测器和蜂鸣器的Verilog模块

Module 用于烟雾探测器和蜂鸣器的Verilog模块,module,verilog,fpga,intel-fpga,Module,Verilog,Fpga,Intel Fpga,我有Altera DE2-115 FPGA,我尝试自学Verilog。我决定做一个烟雾探测器,每当它闻到烟味时,蜂鸣器就会响,烟雾探测器就会输出一个数字信号 这是我的审判: module fire(flag,clock,reset,fire,fire_state,firealarm); input clock, reset, flag, fire; output [2:0] fire_state; output firealarm; wire

我有Altera DE2-115 FPGA,我尝试自学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
但是它没有运行,我认为这段代码中有很多逻辑错误,有什么帮助吗

endmodule是一个单词,您需要删除空格

现在几乎所有模拟器都支持verilog-2001或更高版本,因此我鼓励使用现代端口风格的ANSI,而不是旧的verilog 1995风格

您的端口列表来自:

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;
致:

我已经将每个端口放置在一个新的具有it方向的行上,这使得维护代码更加容易,也使得代码更可读,从而最大限度地减少了连接中的输入错误

您已经多次使用此语法标记?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位,火灾状态为3位

always @ (posedge clock) begin
  fire_state <= {2'b0, fire};
end
endmodule是一个单词,需要删除空格

现在几乎所有模拟器都支持verilog-2001或更高版本,因此我鼓励使用现代端口风格的ANSI,而不是旧的verilog 1995风格

您的端口列表来自:

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;
致:

我已经将每个端口放置在一个新的具有it方向的行上,这使得维护代码更加容易,也使得代码更可读,从而最大限度地减少了连接中的输入错误

您已经多次使用此语法标记?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位,火灾状态为3位

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