如何在没有 # 的情况下对 Verilog 中的延迟建模?那个可以合成
How to Model a delay in Verilog without # ? That can be synthesized
我想创建一个与门,它在延迟 10 纳秒后得到结果,我的时钟是 500 ps。我将如何在不使用 # delays 的情况下延迟作业?
我试图制作一个递增的计数器,但如何对其建模,以便它仅在我的输入更改时启动。在评估和分配第一个输出之前,输入也不会改变。初始计数器为 0,假设延迟为 3'b111,所以我希望计数器从 1 变为 3'b111,然后将其分配给 y。与门的输入是 a 和 b。
always@(posedge clk)begin
if (!reset) begin y <=0; counter <=0; end
else begin
counter <= counter +1'b1;
if(counter==delay)begin
y <= a & b;
counter <=0;
end
end
好吧,如果您的时钟周期是 500 ps,那么您将需要计数到更高的值才能达到 10ns。我重写了你的代码,还添加了一个测试平台供你尝试。有点马虎,我一般写vhdl,不会写verilog。希望这个帮助ps.
//Module
module count_and (
input clk,
input reset,
input a,
input b,
output reg y,
output reg [4:0] counter
);
reg ready;
always@(posedge clk)begin
if (!reset) begin
y <=0;
counter <=0;
ready <= 0;
end
else if (ready == 1'b1) begin
counter <= counter +1'b1;
if (counter==5'b10011) begin
y <= a & b;
counter <=0;
ready <= 0; //turn it off after passing to y
end
end
end
always @(a,b) begin
ready <= 1'b1;
end
endmodule
//TestBench
`timescale 1ps/1ps
module tb_count ();
reg a,b;
reg clk;
reg reset;
wire [4:0] counter;
wire y;
initial begin
clk = 1'b1;
reset = 1'b0;
a = 1'b0;
b = 1'b0;
end
always begin
reset <= #50 1'b1;
clk = #250 ~clk;
a <= #1000 1'b1;
b <= #1000 1'b1;
end
count_and count_and_inst (
.clk(clk),
.reset(reset),
.a(a),
.b(b),
.y(y),
.counter(counter)
);
endmodule
我想创建一个与门,它在延迟 10 纳秒后得到结果,我的时钟是 500 ps。我将如何在不使用 # delays 的情况下延迟作业?
我试图制作一个递增的计数器,但如何对其建模,以便它仅在我的输入更改时启动。在评估和分配第一个输出之前,输入也不会改变。初始计数器为 0,假设延迟为 3'b111,所以我希望计数器从 1 变为 3'b111,然后将其分配给 y。与门的输入是 a 和 b。
always@(posedge clk)begin
if (!reset) begin y <=0; counter <=0; end
else begin
counter <= counter +1'b1;
if(counter==delay)begin
y <= a & b;
counter <=0;
end
end
好吧,如果您的时钟周期是 500 ps,那么您将需要计数到更高的值才能达到 10ns。我重写了你的代码,还添加了一个测试平台供你尝试。有点马虎,我一般写vhdl,不会写verilog。希望这个帮助ps.
//Module
module count_and (
input clk,
input reset,
input a,
input b,
output reg y,
output reg [4:0] counter
);
reg ready;
always@(posedge clk)begin
if (!reset) begin
y <=0;
counter <=0;
ready <= 0;
end
else if (ready == 1'b1) begin
counter <= counter +1'b1;
if (counter==5'b10011) begin
y <= a & b;
counter <=0;
ready <= 0; //turn it off after passing to y
end
end
end
always @(a,b) begin
ready <= 1'b1;
end
endmodule
//TestBench
`timescale 1ps/1ps
module tb_count ();
reg a,b;
reg clk;
reg reset;
wire [4:0] counter;
wire y;
initial begin
clk = 1'b1;
reset = 1'b0;
a = 1'b0;
b = 1'b0;
end
always begin
reset <= #50 1'b1;
clk = #250 ~clk;
a <= #1000 1'b1;
b <= #1000 1'b1;
end
count_and count_and_inst (
.clk(clk),
.reset(reset),
.a(a),
.b(b),
.y(y),
.counter(counter)
);
endmodule