依然是错题记录
构建一个4位数的BCD(二进制编码的十进制)计数器。每个十进制数字使用4位进行编码:q[3:0]是个位,q[7:4]是十位,以此类推。对ena[3:1],要输出一个使能信号,指示个十、百、位什么时候进位,即十、百、千位什么时候加一
module top_module (
input clk,
input reset, // Synchronous active-high reset
output [3:1] ena,
output [15:0] q);
assign ena[1] = q[3:0]==9?(1):(0);
assign ena[2] = q[7:4]==9&q[3:0]==9?(1):(0);
assign ena[3] = q[11:8]==9&q[7:4]==9&q[3:0]==9?(1):(0);
BCD BCD1(.clk(clk),.in(1'b1),.reset(reset),.counter(q[3:0]));
BCD BCD2(.clk(clk),.in(ena[1]),.reset(reset),.counter(q[7:4]));
BCD BCD3(.clk(clk),.in(ena[2]),.reset(reset),.counter(q[11:8]));
BCD BCD4(.clk(clk),.in(ena[3]),.reset(reset),.counter(q[15:12]));
endmodule
module BCD(input clk,input in,input reset, output reg[3:0] counter);
always@(posedge clk)begin
if(reset)begin
counter<=0;
end
else begin
if(counter==9&in)begin
counter<=0;
end
else begin
counter<=counter+in;
end
end
end
endmodule
最初考虑设计为,基本全部由时序逻辑完成,如由个位模块监视自己当前计数,并将要进位加一的信号传给十位模块,然而由于时序逻辑的特点,需要在当前状态为8时传递给十位模块信号,才能使个位模块变为9的同时,十位模块接收到加一信号,下个状态才能是个位变0,十位加1
这种方法首先是不符合常用逻辑,其次,设计繁琐,还需在状态为9时设置下一个状态
考虑第二种方法,通过组合逻辑实现,对时序逻辑电路状态实时监视,相当于全局监视,如当个位为9时,下一个时钟,命令个位变0,十位加1