秒计数器(s_counter,0-9)
假设clk是24MHz系统·时钟,秒分频产生秒脉冲s_pluse;
秒计数模块对秒脉冲计数,计数范围0-9,秒计数结果s_sum(位宽4)。
系统时钟:24MHz
基于系统时钟的计数:cont_t(计数范围0-24000000-1),每循环一圈就是1秒。
秒脉冲:触发器,每看到0就置为1,不是0就置为0,就可以得到一秒一个脉尖冲,称为秒脉冲
秒计数:对秒脉冲进行计数,看到一个秒脉尖冲加一。(9加1变成0)
`timescale 1ns/10ps//testbench时间单位
module s_counter(
clk,//时钟
res,//复位
s_num//秒计数,输出
);
input clk;
input res;
output[3:0] s_num;
parameter frequency_clk=24;//24MHz;方便修改其他数值,比如16Mhz;
reg[24:0] con_t;//秒脉冲分频计数器;
//24MHz频率24000000,二进制25位
reg s_pulse;//秒脉冲尖;
reg[3:0] s_num;
always@(posedge clk or negedge res)
//触发器复位
if(~res)begin
con_t<=0;s_pulse<=0;s_num<=0;
end
//正常工作
else begin
//秒脉冲分频计数器,基于系统时钟计数
if(con_t==frequency_clk*1000000-1)begin
con_t<=0;
end
else begin
con_t<=con_t+1;
end
//秒脉冲,con_t为0,置1,非0,置0。
if(con_t==0)begin
s_pulse<=1;
end
else begin
s_pulse<=0;
end
//秒计数器,对秒脉冲进行计数,看到一个秒脉冲加一。计数范围0-9。
if(s_pulse)begin
if(s_num==9)begin
s_num<=0;
end
else begin
s_num<=s_num+1;
end
end
endmodule
测试代码testbench
//------testbench of s_counter-----
module s_counter_tb;
reg clk,res;
wire[3:0] s_num;
s_counter s_counter(
.clk(clk),
.res(res),
.s_num(s_num)
);
initial begin
clk<=0;res<=0;//复位
#17 res<=1;//17ns后复位结束
#300000 $stop;//300000ns系统任务结束
end
always #5 clk<=~clk;
endmodule
数码管0-9秒循环显示
Verilog代码
//顶层module:top
module top(clk,res,a_g);
input clk;
input res;
output[6:0] a_g;
wire[3:0] s_num ;//顶层内部信号,如果只是为了连接,则定义成wire型即可
//s_counter seg_dec是module名
//U1 U2例化名
s_counter U1(
.clk(clk),
.res(res),
.s_num(s_num)
);
seg_dec U2(
//括号里的是顶层信号名,如果不是端口,需要定义成wire型完成连接
.s_num(s_num),
.a_g(a_g)
);
endmodule
数码管0-59秒循环显示
每个数码管7个笔画
笔画比较多,采用共用办法,各个数码管公用同一组a-g信号。通过片选,快速扫描,实现共享笔画。