如何在verilog中控制两个不同程序块中的标志?
How to control a flag in two different procedural blocks in verilog?
我想在进入程序块#1 后升起一个标志,并且我想在另一个程序块中将其重置为零。当然,我收到一条错误消息,说该标志是由太多驱动程序驱动的。我该如何克服这个问题?
块1,对sw敏感(FPGA板开关):
always @ (sw)
flag =1;
begin
case (sw)
8'bxxxxxx01: x2= 13'd1249;
8'bxxxxxx10: x2= 13'd2499;
8'bxxxxxx11: x2= 13'd3749;
endcase
end
块2,对CLK敏感:
always @ (posedge CLK)
begin
if (counter2 == x2)
begin
counter2 <=0;
flag=0;
end
else
counter2 <= counter2 +1;
end
假设所有初始化都已完成。
一种方法是设置和重置标志以及侦听这些标志的 FSM。
localparam S_RESET = 2'b0;
localparam S_SET = 1'b1;
reg state;
always @(posedge clk) begin
case ({flag_set, flag_reset})
2'b00 : state <= state;
2'b01 : state <= S_RESET;
2'b10 : state <= S_SET;
2'b11 : state <= S_SET; //Choose priority
endcase
end
但要注意 always @ (sw)
应该写成 always @(*)
即自动敏感列表。这表示硬件的组合块,所有输出都应基于输入(或触发器)。
我希望这能说明:
always @ (sw)
flag =1;
不代表硬件,不可合成。 flag
基于触发模拟器而不是基于输入的值。
我想在进入程序块#1 后升起一个标志,并且我想在另一个程序块中将其重置为零。当然,我收到一条错误消息,说该标志是由太多驱动程序驱动的。我该如何克服这个问题?
块1,对sw敏感(FPGA板开关):
always @ (sw)
flag =1;
begin
case (sw)
8'bxxxxxx01: x2= 13'd1249;
8'bxxxxxx10: x2= 13'd2499;
8'bxxxxxx11: x2= 13'd3749;
endcase
end
块2,对CLK敏感:
always @ (posedge CLK)
begin
if (counter2 == x2)
begin
counter2 <=0;
flag=0;
end
else
counter2 <= counter2 +1;
end
假设所有初始化都已完成。
一种方法是设置和重置标志以及侦听这些标志的 FSM。
localparam S_RESET = 2'b0;
localparam S_SET = 1'b1;
reg state;
always @(posedge clk) begin
case ({flag_set, flag_reset})
2'b00 : state <= state;
2'b01 : state <= S_RESET;
2'b10 : state <= S_SET;
2'b11 : state <= S_SET; //Choose priority
endcase
end
但要注意 always @ (sw)
应该写成 always @(*)
即自动敏感列表。这表示硬件的组合块,所有输出都应基于输入(或触发器)。
我希望这能说明:
always @ (sw)
flag =1;
不代表硬件,不可合成。 flag
基于触发模拟器而不是基于输入的值。