以一个同步加法器为例,使用verilog实现:
module adder(
input clk_sys,
input rst_n,
input a,
input b,
output reg c
);
always @(posedge clk_sys or negedge rst_n) begin
if(!rst_n)
c <= 0;
else
c <= a+b;
end
endmodule
对应的RTL电路是:
(使用quartus 编译环境)
仔细看上图,发现该电路和verilog描述的有点区别,verilog把加法放在时序逻辑里实现,而实际电路却是两个分开的。
我们再用verilog把上面的电路描述一遍:
module adder(
input clk_sys,
input rst_n,
input a,
input b,
output reg c
);
wire c_w;
assign c_w = a + b;
always @(posedge clk_sys or negedge rst_n) begin
if(!rst_n)
c <= 0;
else
c <= c_w;
end
endmodule
然后再编译综合一次,看一下RTL电路:
和描述的完全一致。
得到的结论是:
FPGA内部单元电路只有D触发器是时序电路,其余的都是组合电路(如加法器),不存在“同步时序加法器”的单元电路。
所以记住一点,任何需要运算的地方都放在组合电路里实现,任何需要clk同步时序的地方都只包含一个D触发器的延迟操作。