Create 8 D flip-flops with active high asynchronous reset. All DFFs should be triggered by the positive edge of clk.
要求创建一个异步清零端的D触发器
module top_module (
input clk,
input areset, // active high asynchronous reset
input [7:0] d,
output [7:0] q
);
always @(posedge clk or posedge areset)begin
if(areset)
q <= 8'd0;
else
q <= d;
end
endmodule
这题会有下面这种错误,但是我自己不是很能理解:
module top_module (
input clk,
input areset, // active high asynchronous reset
input [7:0] d,
output [7:0] q
);
always @(posedge clk or posedge areset)begin
if(!areset)
q <= d;
else
q <= 8'd0;
end
endmodule
会报错:
cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct
这里我只能发表一下自己的观点(此观点有待验证):
1、这里的代码描述的是一个时序逻辑电路,敏感信息表里面有posedge clk 和 posedge areset两个信号。但是我们知道模块的边沿敏感时钟信号只能有一个,那么如何区分哪一个是时钟信号?规定是这样的:我们把clk作为时钟信号,那么在always过程语句里面就不可以出现clk这个信号了,上面的代码可以看出来,clk是时钟信号;
2、那么剩下的posedge areset怎么说呢?用always描述的时序电路中,除了时钟信号之外,其他信号敏感事件列表的信号需要在过程语句里面进行说明(always结构中如果带if语句的需要说明,不带if语句也可不说明),就是必须把areset放到if()里面,如此题的 if(areset) ;
3、放在if里面还要注意一件事情,就是如果敏感事件列表里面写的是posedge areset,那么if里面的if(areset)必须是1;如果是nagedge areset,那么if里面就必须是if(!areset),必须是0。所以上面之所以报错,就是因为本题的敏感事件列表里面事posedge areset,if里面的条件语句必须是和上升沿posedge对应的1,不然就会报错。