Kar*_*der 1 verilog module 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
Run Code Online (Sandbox Code Playgroud)
但它没有运行,我认为这段代码中有很多逻辑错误,请问有什么帮助吗?:)
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;
Run Code Online (Sandbox Code Playgroud)
至 :
module fire(
input clock,
input reset,
input flag,
input fire,
output reg [2:0] fire_state,
output firealarm
);
Run Code Online (Sandbox Code Playgroud)
我已经将每个端口放在一个新的方向上,这使得维护代码变得更加容易,它也使它更具可读性,从而最大限度地减少连接中拼写错误的可能性.
你已经使用了这个语法很多(flag?0:1),你使用布尔值来选择一个布尔值,没有必要这样做,并使它更难阅读.如果你需要反转它,那么是一个按位反转(~).但是,目前尚不清楚你使用的是什么标志.对于比较和分配,你应该包括宽度.
assign firealarm = (fire_state == 3'b1)? (~flag) : 1'b0;
Run Code Online (Sandbox Code Playgroud)
这也可以在组合总是块中写出:
always @* begin
if (fire_state==3'b001) begin
firealaram = ~flag;
else begin
firealaram = 1'b0;
end
end
Run Code Online (Sandbox Code Playgroud)
fire是1位,fire_state是3位.
always @ (posedge clock) begin
fire_state <= {2'b0, fire};
end
Run Code Online (Sandbox Code Playgroud)