题解 | #异步复位同步释放#
异步复位同步释放
http://www.nowcoder.com/practice/9b892b6f75954267b4574b042f8a8d6a
关于波形读有个问题: 如果同步释放代码这样写
//异步复位,同步释放
always @(posedge clk, negedge rst_n) begin
if(!rst_n) begin
rstn_reg <= 1'b0;
rstn_reg_1 <= 1'b0;
end
else begin
rstn_reg <= 1'b1;
rstn_reg_1 <= rstn_reg;
end
end
在波形图
红色方框处是不是输出dout <= d 等于1 啊
所以同步释放应该这样写
//异步复位,同步释放
always @(posedge clk, negedge rst_n) begin
if(!rst_n) begin
rstn_reg <= 1'b0;
rstn_reg_1 <= 1'b0;
end
else begin
rstn_reg <= rst_n;
rstn_reg_1 <= rstn_reg;
end
end
整体代码
`timescale 1ns/1ns
module ali16(
input clk,
input rst_n,
input d,
output reg dout
);
reg rstn_reg, rstn_reg_1;
//异步复位,同步释放
always @(posedge clk, negedge rst_n) begin
if(!rst_n) begin
rstn_reg <= 1'b0;
rstn_reg_1 <= 1'b0;
end
else begin
rstn_reg <= rst_n;
rstn_reg_1 <= rstn_reg;
end
end
//同步释放
// always @(posedge clk) begin
// rstn_reg_1 <= rstn_reg;
// end
//赋值
always @(posedge clk, negedge rstn_reg_1) begin
if(!rstn_reg_1) begin
dout <= 1'b0;
end
else
dout <= d;
end
//*************code***********//
//*************code***********//
endmodule