1.1 简介
设计一个在多个时钟周期内部执行同样的操作,可以利用时钟的嵌套,例如设计一个4样值累加器。就是一个状态机在数据通道上连续采4个样值进行相加,然后对样值进行求和运算。
1.2 电路实现
4样值采样加法器verilog代码:
// 设计一个4样值加法器
module add_4_cycle(date,clk,rest,sum);
// 参数定义
parameter WIETH = 32;
// 端口定义
input [3:0] date;
input clk;
input rest;
output [6:0] sum;
reg [6:0] sum;
// 功能实现
always @ (posedge clk,negedge rest) begin :add_loop
if(!rest)
disable add_loop;
else
sum <= date;
@(posedge clk ) if(!rest)
disable add_loop;
else
sum <= sum + date;
@(posedge clk ) if(!rest)
disable add_loop;
else
sum <= sum + date;
@(posedge clk ) if(!rest)
disable add_loop;
else
sum <= sum+date;
end
endmodule
1.3 testbench
// 测试程序
module add_4_cycle_tb();
// 参数定义
parameter WIETH = 32;
// 激励端口定义
reg [3:0] date;
reg clk;
reg rest;
wire[6:0] sum;
// 模块例化
add_4_cycle U1 (.date(date),.clk(clk),.rest(rest),.sum(sum));
// 参数的初始化
initial begin
rest = 0;
clk =0;
end
// 时钟模块
always #5 clk = ~clk;
// task_date
task signal_creat();
input [15:0] date_in;
@(posedge clk) date = date_in[3:0];
@(posedge clk) date = date_in[7:4];
@(posedge clk) date = date_in[11:8];
@(posedge clk) date = date_in[15:12];
endtask
// test
initial begin
#3 rest = 1;
signal_creat(16'b0001_0101_0010_1110);
signal_creat(16'b0101_1100_0101_1101);
#10 $finish;
end
// VPD
initial begin
`ifdef DUMP_VPD
$vcdpluson();
`endif
end
endmodule