计数器 波形仿真 signaltap
计数器代码 与74161不同,不用其他的管脚,只要计数哦那个计数功能就好。所以可以把2个使能端,同步/异步清零端,数据段都去掉,只留下时钟端。还有输出数据段和溢出端。
计数器代码如下
module conter(
CLK , //xia jiang yan
CNTVAL, // 输出的计数值信号
OV );// 计数溢出信号,计数值为最大值时该信号为1
input CLK ;
output [3:0] CNTVAL;
output OV;
reg [3:0] CNTVAL, cnt_next;
reg OV;
// 电路编译参数,最大计数值
parameter CNT_MAX_VAL = 9;
always @(posedge CLK) begin
if(CNTVAL < CNT_MAX_VAL) // 未计数到最大值, 下一值加1
CNTVAL = CNTVAL + 1'b1;
else// 计数到最大值,下一计数值为0
CNTVAL = 0;
end
// 组合逻辑,生成OV
always @ (CNTVAL) begin
if(CNTVAL == CNT_MAX_VAL)
OV = 1;
else
OV = 0;
end
endmodule
这个是时钟下降沿有效,但是不知道为什么。
用SignalTap 观测数据 新建一个SignalTap文件
时钟
下载
右键,添加 Add Nodes
左边单步 右边连续自动
0-17计数器
module conter(CLK , //xia jiang yan
CNTVAL, // 输出的计数值信号
OV );// 计数溢出信号,计数值为最大值时该信号为1
input CLK ;
output [4:0] CNTVAL;
output OV;
reg [4:0] CNTVAL ;
reg OV;
// 电路编译参数,最大计数值
parameter CNT_MAX_VAL = 17;
always @(posedge CLK) begin
if(CNTVAL < CNT_MAX_VAL) // 未计数到最大值, 下一值加1
CNTVAL = CNTVAL + 1'b1;
else// 计数到最大值,下一计数值为0
CNTVAL = 0;
end
// 组合逻辑,生成OV
always @ (CNTVAL) begin
if(CNTVAL == CNT_MAX_VAL)
OV = 1;
else
OV = 0;
end
endmodule
LED闪烁
由于OUT2由1变0 比 OUT3由0变1慢了很多,导致出现了12 出现毛刺
时钟周期为1/50MHZ=0.02ns
这个灯相当于亮9*0.02ns 暗0.02*9 暗的时间太短 看不出来 这样就可以实现延时
module conter(
CLK , //xia jiang yan
//CNTVAL, // 输出的计数值信号
OV );// 计数溢出信号,计数值为最大值时该信号为1
input CLK ;
//output [30:0] CNTVAL;
output OV;
//reg [30:0] CNTVAL ;
integer CNTVAL=0 ;
reg OV;
// 电路编译参数,最大计数值
parameter CNT_MAX_VAL = 100_000000;
always @(posedge CLK) begin
if(CNTVAL < CNT_MAX_VAL) // 未计数到最大值, 下一值加1
CNTVAL = CNTVAL + 1;
else// 计数到最大值,下一计数值为0
CNTVAL = 0;
end
// 组合逻辑,生成OV
always @ (CLK) begin
if(CNTVAL <50000000)
OV = 0;
else
OV = 1;
end
endmodule
integer 相当于c语言的int 32位
时钟5*1000000次暗,5*1000000亮,折算是一秒,实现准确计时