verilog编程中,异步复位程序中,复位信号和时钟信号都是以沿作为敏感信号.
always @(posedge clk,posedge rst_p)
begin
if rst_p='1' then
count <= 4'd0;
else
count <= count+'1';
end
在这个程序中,综合工具是如何判断哪一个是复位信号,哪一个是时钟信号的?是通过判断在哪个信号下给定固定值吗?
如果程序改成:
always @(posedge clk,posedge rst_p)
begin
if rst_p='1' then
count <= count+'1';
else
count <= 4'd0;
end
这样哪个是时钟信号呢?生成的电路又会是怎样的呢?
你这个问题提得很好!
我是这样理解你这个问题。
正常情况,复位信号边沿只来一次,时钟边沿周期来的。所以第一种写法是标准写法。编译器默认根据前面的标准认为,复位信号RST_P,Clk是时钟信号。
如果第二种情况,任然是复位信号RST_P,时钟信号CLK。
这与D触发器的电路结构相关,D触发器复位或置位信号优先级最高,时钟触发是数据从输入到输出。
前面两种写法都是符合D触发器这个标准,所以编译器默认RST_P 复位信号,CLK时钟信号。编译器不会因为输出决定电路结构。
验证结构如下:
第一种写法:
编写的VERILOG程序
module test2(clk,rst_p,count);
input clk ;
input rst_p;
output count;
reg[3:0] count;
always @(posedge clk or posedge rst_p)
begin
if (rst_p==1)
count<=4'd0;
else
count <=count+1;
end
endmodule
通过RTL VIEWER查看结果如图:
修改上面的第一种写法变为第二种写法:
module test2(clk,rst_p,count);
input clk ;
input rst_p;
output count;
reg[3:0] count;
always @(posedge clk or posedge rst_p)
begin
if (rst_p==1)
count <=count+1;
else
count<=4'd0;
end
endmodule
第二种写法综合后结果:
从上面的图中可以看到,结果!谁对谁错一目了然了。