多个时钟周期上的重复操作
verilog代码如下:在第一个时钟周期,sum初始化第一个值,在第4个时钟周期之后,动作流返回第一个事件控制表达式;disable位于reset中,以确保状态机正常进行初始化。
module add_4cycle(
output reg [5:0] sum,
input [3:0] data,
input clk,
input reset);
always@(posedge clk)
begin:add_loop
if(reset==1'b1)
disable add_loop;
else
sum<=data;
@(posedge clk)
if(reset==1'b1)
disable add_loop;
else
sum<=sum+data;
@(posedge clk)
if(reset==1'b1)
disable add_loop;
else
sum<=sum+data;
@(posedge clk)
if(reset==1'b1)
disable add_loop;
else
sum<=sum+data;
end
endmodule
tb代码如下:
module tb();
reg [3:0] data;
reg clk;
reg reset;
wire [5:0] sum;
parameter cycle=20;
initial
begin
clk=0;
forever #(cycle/2) clk=~clk;
end
task rst_n(
input [31:0]rst_time);
begin
reset=1'b1;
# rst_time reset=1'b0;
end
endtask
initial
begin
rst_n(60);
data=4'b1010;
end
add_4cycle u1(
.sum(sum),
.data(data),
.clk(clk),
.reset(reset));
endmodule
仿真波形如图所示:
如果此循环使用常规方法,则需要使用计数器
module add(
input clk,
input reset,
input [3:0] data,
output reg [5:0] sum);
reg [1:0] count;
always@(posedge clk)
begin
if(reset)
sum=6'hx;
else
begin
case(count)
2'b00:sum<=data;
2'b01:sum<=data+sum;
2'b10:sum<=data+sum;
2'b11:sum<=data+sum;
endcase
end
end
always@(posedge clk)
begin
if(reset)
count<=2'b00;
else
count<=count+1'b1;
end
endmodule
来源:CSDN
作者:人无再少年97
链接:https://blog.csdn.net/buzhiquxiang/article/details/103152330