Verilog 2复位D触发器:合成错误
我正在做一个数字块的合成,我需要一个带2个异步复位的D触发器。 (原因是我将使用一个可用时钟驱动一个重置,并使用第二个重置来重置我的数字块的所有寄存器) 我编写了以下代码:Verilog 2复位D触发器:合成错误,verilog,synthesis,register-transfer-level,Verilog,Synthesis,Register Transfer Level,我正在做一个数字块的合成,我需要一个带2个异步复位的D触发器。 (原因是我将使用一个可用时钟驱动一个重置,并使用第二个重置来重置我的数字块的所有寄存器) 我编写了以下代码: 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)
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
我也试过了
if(~rst & ~clear)
但我也有错误
你有办法更正我的代码吗?非常感谢 在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;
谢谢你,摩根。你的代码鼓舞了我。我不能用它
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
模块dff_2rst(q、qn、clk、d、rst、clear);
输入时钟、d、rst、清除;
输出q,qn;
reg q,qn;
始终@(posedge clk或posedge rst或posedge clear)//异步重置
//
开始
如果(rst)开始
//Aysnc复位
q不定义为reg,保留为导线。reg q,qn
应该是reg q代码>我尝试过,但是我得到了错误分配到'qn'需要它是一个寄存器。(VER-952)
@Morgan,我明白了:我只使用reg q代码>如果我将您的代码与分配一起使用
。我可以问你为什么它比我的版本好吗?简单地说,更少的代码行意味着更容易维护,更少的bug。通过一个简单的倒置,它可以防止您在三种情况中的任何一种情况下输入错误。
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