计数器 波形仿真 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

计数器 波形仿真 signaltap



这个是时钟下降沿有效,但是不知道为什么。



用SignalTap 观测数据  新建一个SignalTap文件 

时钟

计数器 波形仿真 signaltap   


下载

计数器 波形仿真 signaltap


右键,添加 Add Nodes

计数器 波形仿真 signaltap

左边单步  右边连续自动

计数器 波形仿真 signaltap

计数器 波形仿真 signaltap


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

计数器 波形仿真 signaltap

计数器 波形仿真 signaltap

计数器 波形仿真 signaltap



LED闪烁



计数器 波形仿真 signaltap

计数器 波形仿真 signaltap

计数器 波形仿真 signaltap

由于OUT2由1变0   比   OUT3由0变1慢了很多,导致出现了12 出现毛刺

时钟周期为1/50MHZ=0.02ns  

这个灯相当于亮9*0.02ns  暗0.02*9  暗的时间太短 看不出来  这样就可以实现延时


计数器 波形仿真 signaltap

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亮,折算是一秒,实现准确计时