代码:
module test(clk,reset,min_H,min_L,min_H_cy,min_L_cy);
input clk,reset;
output [3:0] min_H,min_L;
output min_H_cy,min_L_cy;
reg [3:0] min_H,min_L;
assign min_L_cy=(min_L==4'b1001)?1:0;
always @(posedge clk)
begin
if(reset) min_L<=4'b0000;
if(min_L_cy==1)
begin
min_L<=4'b0000;
end
else min_L<=min_L+1;
end
assign min_H_cy=(min_H==4'b0101)?1:0;
//另一种写法是assign min_H_cy=(min_H==4'b0101)&(min_L_cy==1)?1:0 ,需要改下注释P1后的写法;
always @(posedge clk)
begin
if(reset) min_H<=4'b0000;
if(min_L_cy==1) //P1
begin
if(min_H_cy==1)
begin
min_H<=4'b0000;
end
//always不能写min_L;
else min_H<=min_H+1;
end
end
endmodule
时序图:
总结:
1)每个always 处理一位(例如59的个位“9”),例如:min_L已经在第一个always处理过了,就不能在第二个always中赋值;(经验总结)
2)每一个begin-end 相当于(c语言中的)一个括号;
3)if-if else-if else … … 最后要补else,(即使语句无实际功能,例如a<=a;)要养成好习惯;
- 其实无需高位插眼,用二进制码表示就挺方便的。