赞
踩
`timescale 1ns / 1ps
module counter (
input clk,
input reset,
input enable,
input mode,
input [3:0] init,
output reg [3:0] count
);
// clk上升沿时
always @(posedge clk) begin
// reset为0置初始值
if (!reset) count <= init;
else begin
// 使能端为1则计数
if (enable)
// 如果mode为1,则加计数,否则减计数
if (mode) count <= count + 1'b1;
else count <= count - 1'b1;
end
end
endmodule
`timescale 1ns / 1ps
module testbench;
// 初始化clk信号
reg clk;
initial clk = 0;
always #(1) clk <= ~clk;
reg reset = 1;
reg enable = 1;
reg [3:0] init = 4'b0010;
reg mode = 1;
initial begin
reset = 0; // reset 0使能,将初始值置为0010
#2 reset = 1; // 开始计数
#10 enable = 0; // 停止计数
#5 enable = 1; // 继续计数
#20 reset = 0; init = 4'b1111; // 重新置初始值
#2 reset = 1; mode = 0; // 重新开始计数,并为减计数
#10 $stop;
end
wire [3:0] out;
counter ctr (
clk,
reset,
enable,
mode,
init,
out
);
endmodule
clk为模拟的脉冲,reset为重置信号,如果reset为0,则把init的值作为初始值赋值给out,enable为使能端,如果enable为1,则在上升沿根据mode的值,如果mode为1,为加计数,mode为0,为减计数。
仿真图像中,
第1个脉冲,reset为0,为out赋值输入的初始值0010。
第2~6个脉冲,enable为1,mode为1,加计数
第7~8个脉冲,enable为0,停止计数
第9~18个脉冲,enable为1,继续计数,并到1111后再加一变为0000
第19个脉冲,reset为0,为out赋初始值1111,并将mode置为0
第20~24个脉冲,enable为1,mode为0,减计数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。