我正在合成一个数字模块,我需要一个带有2个异步复位的D-Flip-Flop。 (原因是我将使用可用时钟驱动一次复位,我将使用第二次复位我的数字模块的所有寄存器) 我准备了以下代码:
module dff_2rst(q,qn,clk,d, rst,clear);
input clk,d, rst, clear ;
output q,qn;
reg q,qn;
always @(posedge clk or posedge rst or posedge clear) //asynchronous reset
begin
(* full_case, parallel_case *)
case({rst, clear})
2'b00: begin
q <= d;
qn<=~d;
end
default: begin
q <= 1'b0;
qn <=1'b1;
end
endcase
end
endmodule
但是我收到以下错误:
The statements in this 'always' block are outside the scope of the synthesis policy. Only an 'if' statement is allowed at the top level in this always block. (ELAB-302)
*** Presto compilation terminated with 1 errors. ***
我也试过
if(~rst & ~clear)
但我也有错误。
您是否有想法更正我的代码?非常感谢!
答案 0 :(得分:1)
在Verilog RTL中编写异步复位,设置(清除)触发器的标准方法是:
always @(posedge clk or posedge rst or posedge clear) begin
if (rst) begin
// Aysnc Reset
q <= 'b0 ;
end
else if (clear) begin
// Async Clear
q <= 'b0 ;
end
else begin
// Sync logic here
q <= d;
end
end
assign qn = ~n;
qn的小技巧要求它是一根导线,目前定义为一个寄存器。 reg q,qn;
应为reg q;
对于更干净的代码,新的标题类型更清晰,避免重复:
module dff_2rst(
input clk,
input d,
input rst,
input clear,
output reg q,
output qn );
答案 1 :(得分:0)
谢谢你,摩根。你的代码对我很有启发。我无法使用
assign qn=~q;
因为我收到了错误:
qn is not a valid left-hand side of a continuous assignment.
但是我以下面的方式修改了你的代码并且它有效:
module dff_2rst(q,qn,clk,d, rst,clear);
input clk,d, rst, clear ;
output q,qn;
reg q,qn;
always @(posedge clk or posedge rst or posedge clear) //asynchronous reset
//
begin
if (rst) begin
// Aysnc Reset
q <= 'b0 ;
qn<= 'b1 ;
end
else if (clear) begin
// Async Clear
q <= 'b0 ;
qn<= 'b1 ;
end
else begin
// Sync logic here
q <= d;
qn<= ~d;
end
end
endmodule