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

时间:2014-12-11 10:41:04

标签: 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         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

但它没有运行,我认为这段代码中存在很多逻辑错误,请帮忙吗? :)

1 个答案:

答案 0 :(得分:5)

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;

到:

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 

fire是1位,fire_state是3位。

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