多循环操作状态机

∥☆過路亽.° 提交于 2019-11-25 21:57:46

多个时钟周期上的重复操作

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

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!