
- UID
- 110505
- 性别
- 男
|

//由6个十进制计数器。形成一个6位10进制计数器。email:awei112625@163.com
module cnt999999(testclk,clr,en,q1,q2,q3,q4,q5,q6);
input testclk,clr,en;
output[3:0]q1,q2,q3,q4,q5,q6;
reg [3:0]q1,q2,q3,q4,q5,q6;//定义6个寄存器
wire clk1,clk2,clk3,clk4,clk5,clk6;//定义6根时钟导线
cnt10 c1(testclk,clr,q1,clk1,en);//元件例化调用10进制计数器;
cnt10 c2(clk1,clr,q2,clk2,en);//调用10进制计数器
cnt10 c3(clk2,clr,q3,clk3,en);//调用10进制计数器
cnt10 c4(clk3,clr,q4,clk4,en);//调用10进制计数器
cnt10 c5(clk4,clr,q5,clk5,en);//调用10进制计数器
cnt10 c6(clk5,clr,q6,clk6,en);//调用10进制计数器
endmodule
module cnt10(clk,reset,q,cout,e);//带使能端的10进制计数器,e是使能端,e==1时计数,==0时清零。
input clk,reset,e;
output[3:0]q;//q为计数结果
output cout;
reg cout;
reg[3:0]out,q;//out为内部计数器,用来计数,后将结果给q。
always@(posedge clk or negedge reset)
begin
if(!reset)
begin
q<=0;
out<=0;
end
else if (e==0)//out 清零,q值不变
begin
out<=0;
q<=q;
end
else if(e==1)//可以计数的状态
begin
if(out==9)
begin//形成进位脉冲
out<=0;
cout<=~cout;
end
else
begin
out<=out+1;//计数
q<=out;//为q赋值
end
end
end
endmodule
/*e的高电平时间是1秒,同时它也是使能端,在这一秒的时间内允许计数,当变为零的时候就停止计数。
并输出结果锁存并显示,1秒后自动刷新。同步清零比较好,但这个程序只能用异步清零。同步的话就不会及时的清零。
但是这个程序输出显示后,出现频率累加的情况。可以清零,不知道是为什么。有哪位高手能帮我解释一下么?
我又仔细看了一下,当e为零的时候,计数高位不能及时的清零。所以累加了。有办法解决么?(不换算法的情况下) |
|