从 1000 Hz 时钟中,得出一个 1 Hz 信号,称为 OneHertz,该信号可用于驱动一组小时/分钟/秒计数器的启用信号,以创建数字挂钟。由于我们希望 clock 每秒计数一次,因此 OneHertz 信号必须每秒正好置位一个周期。使用 modulo-10 (BCD) 计数器和尽可能少的其他门构建分频器。此外,还输出您使用的每个 BCD 计数器的使能信号(c_enable[0] 表示最快的计数器,c_enable[2] 表示最慢的计数器)。
为您提供以下 BCD 计数器。Enable 必须为高电平,计数器才能运行。reset 是同步的,并设置为高电平以强制 counter 为零。电路中的所有计数器必须直接使用相同的 1000 Hz 信号。
module bcdcount ( input clk, input reset, input enable, output reg [3:0] Q );
错误代码:
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
); //
reg [2:0]Q0,Q1,Q2;
assign c_enable=3'b001;//我在这里赋值,犯了c语言的逻辑错误
//assign会持续组合逻辑赋值,它会和always时序逻辑赋值产生冲突
//这也是为什么这段代码的结果显示c_enable一直为001
always@(*)begin
if(Q0==4'd9)begin
c_enable=3'b011;
if(Q1==4'd9)begin
c_enable=3'b111;
end
end
if(Q2==4'd9 && Q1==4'd9 && Q0==4'd9)begin
OneHertz<=1;
end
else begin
OneHertz<=0;
end
end
bcdcount counter0 (
.clk(clk),
.reset(reset),
.enable(c_enable[0]),
.Q(Q0)
);
bcdcount counter1 (
.clk(clk),
.reset(reset),
.enable(c_enable[1]),
.Q(Q1)
);
bcdcount counter2 (
.clk(clk),
.reset(reset),
.enable(c_enable[2]),
.Q(Q2)
);
endmodule
正确代码:
module top_module (
input clk,//1000hz的时钟
input reset,
output OneHertz,
output [2:0] c_enable
); //
reg [3:0]Q0,Q1,Q2;//Q1,Q2,Q3分别代表个位,十位,百位的计数器输出
always@(*) begin
c_enable<=3'b001;//在always块内,三个赋值的地位相同,不会冲突
if(Q0==4'd9)begin
c_enable<=3'b011;
if(Q1==4'd9)begin
c_enable<=3'b111;
end
end
if(Q2==4'd9 && Q1==4'd9 && Q0==4'd9)begin
OneHertz<=1;
end
else begin
OneHertz<=0;
end
end
bcdcount counter0 (
.clk(clk),
.reset(reset),
.enable(c_enable[0]),
.Q(Q0)
);
bcdcount counter1 (
.clk(clk),
.reset(reset),
.enable(c_enable[1]),
.Q(Q1)
);
bcdcount counter2 (
.clk(clk),
.reset(reset),
.enable(c_enable[2]),
.Q(Q2)
);
endmodule
标签:enable,output,Counter,module,计数器,Verilog,d9,input,1000
From: https://blog.csdn.net/m0_63352623/article/details/145125709