Exams/ece241 2014 q7a(Counter 1-12)
module top_module (
input clk,
input reset,
input enable,
output [3:0] Q,
output c_enable,
output c_load,
output [3:0] c_d
); //
count4 count12(.clk(clk), .enable(c_enable), .load(c_load), .d(c_d), .Q(Q) );
assign c_enable = enable;
//使能信号一致;
assign c_load = reset | (enable && Q == 4'd12);
//load代表重新加载,即回到初始值;① reset为1时,c_load高,重新加载;② enable使能,且Q到12,c_load高,重新加载;
assign c_d = c_load?4'b1:4'bz;
//特殊c_load高,c_d重新加载为1;其他情况c_d不管;
endmodule
Exams/ece241 2014 q7b(Counter 1000)
法一:参考
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
); //
reg[3:0] q0,q1,q2;
always@(*)begin
if(reset)begin
c_enable<=0; //reset时,使能000;
end
else begin
c_enable[0]<=1'b1;
if(q0==4'd9)begin //q0数到9,开始下一级即q1计数,c_enable[1]使能;
c_enable[1]<=1'b1;
end
else begin
c_enable[1]<=1'b0;
end
if(q1==4'd9 && q0==4'd9)begin
c_enable[2]<=1'b1;
end
else begin
c_enable[2]<=1'b0;
end
end
end
assign OneHertz = (q2==4'd9) && (q1==4'd9) && (q0==4'd9); //9 9 9,到OneHertz周期;
bcdcount counter0 (clk, reset, c_enable[0], q0);
bcdcount counter1 (clk, reset, c_enable[1], q1);
bcdcount counter2 (clk, reset, c_enable[2], q2);
endmodule
法二:来源
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
); //
reg[3:0] q0,q1,q2;
assign c_enable = {q1==4'd9&&q0==4'd9, q0==4'd9, 1'b1};
assign OneHertz = (q2==4'd9) && (q1==4'd9) && (q0==4'd9); //9 9 9,到OneHertz周期;
bcdcount counter0 (clk, reset, c_enable[0], q0);
bcdcount counter1 (clk, reset, c_enable[1], q1);
bcdcount counter2 (clk, reset, c_enable[2], q2);
endmodule
Countbcd
module top_module (
input clk,
input reset, // Synchronous active-high reset
output [3:1] ena,
output [15:0] q);
always@(posedge clk)begin
if(reset)begin
ena<=0;
end
else begin
if(q[3:0]==4'd8)begin
ena[1]<=1'b1;
end
else begin
ena[1]<=1'b0;
end
if(q[7:4]==4'd9 && q[3:0]==4'd8)begin
ena[2]<=1'b1;
end
else begin
ena[2]<=1'b0;
end
if(q[11:8]==4'd9 && q[7:4]==4'd9 && q[3:0]==4'd8)begin
ena[3]<=1'b1;
end
else begin
ena[3]<=1'b0;
end
end
end
decade_con decade_con1(.clk(clk), .reset(reset), .enable(1'b1), .q(q[3:0]));
decade_con decade_con2(.clk(clk), .reset(reset), .enable(ena[1]), .q(q[7:4]));
decade_con decade_con3(.clk(clk), .reset(reset), .enable(ena[2]), .q(q[11:8]));
decade_con decade_con4(.clk(clk), .reset(reset), .enable(ena[3]), .q(q[15:12]));
endmodule
// 带使能端口的十进制计数器
module decade_con (
input clk,
input reset, // Synchronous active-high reset
input enable,
output [3:0] q);
always@(posedge clk)begin
if(reset)begin
q<=0;
end
else begin
if(enable)begin
if(q==9)begin //q数到9,下一个归零;
q<=0;
end
else begin
q<=q+1;
end
end
end
end
endmodule
Count clock
12 h-clock,am/pm ,fast-running clk驱动,时钟clk每增加一次(即每增加秒一次),ena脉冲1。
复位信号将时钟复位为 12:00 AM。0:AM,1:PM。hh、mm 和 ss 是两个 BCD(二进制编码十进制)数字,分别表示小时 (01-12)、分钟 (00-59) 及秒 (00-59)。
复位信号的优先级高于ena,即使ena无效,也可能发生复位。
以下时序图显示了从AM 11:59:59 到PM 12:00:00 的翻转行为以及同步复位和使能行为。
module top_module(
input clk,
input reset,
input ena,
output pm,
output [7:0] hh,
output [7:0] mm,
output [7:0] ss);
always@(posedge clk)begin
if(reset)begin //reset resets the clock to 12:00 AM.
pm<=1'h0; //0:am 1:pm
hh<={4'd1, 4'd2};
mm<={4'd0, 4'd0};
ss<={4'd0, 4'd0};
end
else begin
//pm变换,0:am 1:pm
if(hh=={4'd1, 4'd1} && mm=={4'd5, 4'd9} && ss=={4'd5, 4'd9})begin
pm<=~pm;
end
else begin
pm<=pm;
end
//ena作用
if(~ena)begin
hh<=hh;
mm<=mm;
ss<=ss;
end
else begin //ena使能
//ss
if(ss=={4'd5, 4'd9})begin //ss=59;
ss<={4'd0, 4'd0};
mm[3:0]<=mm[3:0]+1'b1; //mm个位数加1;
end
else begin
if(ss[3:0]==4'd9)begin //ss=z9;
ss[7:4]<=ss[7:4]+1'b1;
ss[3:0]<=4'd0;
end
else begin //ss={z,<9};
ss[3:0]<=ss[3:0]+1'b1;
end
end
//mm
if(mm=={4'd5, 4'd9} && ss=={4'd5, 4'd9})begin //mm=59,ss=59
mm<={4'd0, 4'd0}; //mm清零,hh加一;只需mm清零,ss怎么清零前面已经定义;
hh[3:0]<=hh[3:0]+1'b1;
end
else begin
if(mm[3:0]==4'd9 && ss=={4'd5, 4'd9})begin //mm=z9,ss=59
mm[7:4]<=mm[7:4]+1'b1; //mm高位加1,低位清零;
mm[3:0]<=4'd0;
end
//mm={z,<9},ss=59 35行已经定义,固此处不再重复定义;
end
//hh
if(hh=={4'd1, 4'd2} && mm=={4'd5, 4'd9} && ss=={4'd5, 4'd9})begin
hh<={4'd0, 4'd1}; //12:59:59,只需hh变为01,mm、ss怎么清零已经定义;
end
else begin
if(hh=={4'd0, 4'd9} && mm=={4'd5, 4'd9} && ss=={4'd5, 4'd9})begin
hh<={4'd1, 4'd0}; //09:59:59 (hh=z9,z只能=0), hh=10;
end
//mm={0,<9},ss=59 49行已经定义,固此处不再重复定义;
end
end
end
end
endmodule