代码

module BCD_Counter(Clk, Cin, Rst_n, Cout, q);

	input Clk;			//计数基准时钟
	input Cin;			//计数器进位输入
	input Rst_n;		//系统复位 
	
	output Cout;	//计数进位输出
	output [3:0]q;		//计数器值输出

	reg [3:0]cnt;
//执行计数过程	
	always@(posedge Clk or negedge Rst_n)
	if(Rst_n == 1'b0)
		cnt <= 4'd0;
	else if(Cin == 1'b1)begin
		if(cnt == 4'd9)
			cnt <= 4'd0;
		else
			cnt <= cnt + 1'b1;
	end
	else
		cnt <= cnt;

//不要在不同的always块中对同一个变量赋值
//不要在同一个always块中同时使用阻塞赋值与非阻塞赋值		
//时序逻辑电路always块中被赋值的变量必须是reg
/*
always时序逻辑电路中用 <= 非阻塞赋值,在时序逻辑电路中用 = 阻塞赋值
简单理解就是:在边沿敏感的always块中用非阻塞赋值,在电平敏感的always块中用阻塞赋值
*/	
/*
always的敏感列表中包括多个电平敏感事件,也可以同时包括多个电平敏感事件,但是不能同时有电平和边沿敏感事件。
另外,敏感列表中,同时包含一个信号的上升沿和下降沿也是不允许的,因为这两个事件可以合并成一个电平事件
*/

//产生进位输出信号
	//这是把之前的时序逻辑电路(注释内)改成组合逻辑电路
	assign Cout =(Cin == 1'b1 && cnt == 4'd9);		
/* 
	always@(posedge Clk or negedge Rst_n)
	if(Rst_n == 1'b0)
		Cout <= 1'b0;
	else if(Cin == 1'b1 && cnt == 4'd9)	
		Cout <= 1'b1;
	else
		Cout <= 1'b0;
*/		
	assign q = cnt;	
endmodule

用时序逻辑电路的波形问题

进位链的问题

改用组合逻辑电路的正确波形