From 1000Hz clock to 1Hz--OneHertz

本文最后更新于:Tuesday, October 6th 2020, 9:20 am

problem link:https://hdlbits.01xz.net/wiki/Exams/ece241_2014_q7b

Background

从频率为1000Hz的时钟中得到频率为1Hz的信号(OneHertz),它用来驱动一系列时/分/秒计数器的使能信号(Enable signal)以此创建一个数字时钟墙(digital wall clock)。因为需要时钟每秒计数一次,OneHertz信号必须每秒准确地断言一个周期(周期为1秒,且每周期只能翻转一次)。

Problem Description

用BCD计数器和少许其它的门构建分频器(frequency divider)。并且输出你所使用的BCD计数器的使能信号。(c_enable[0] for the fastest counter, c_enable[2] for the slowest)

如下的BCD计数器已经提供给你,Enable为高电平计数器才能正常工作,Reset为同步高电平置位0;

1
2
3
4
5
6
module bcdcount (
input clk,
input reset,
input enable,
output reg [3:0] Q
);

你设计的电路中所有的计数器必须直接使用相同的1000Hz时钟信号。

Template

1
2
3
4
5
6
7
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
);

First Try

answer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
);
reg [3:0] Q0,Q1,Q2;
/************ BCD十进制,当Q=1001时使能-->十倍频 ***************/
assign c_enable[0] = 1'b1; // 让第一个计数器全速计数
assign c_enable[1] = Q0[3] & Q0[0]; // 第二计数器计数周期是第一个的10倍
assign c_enable[2] = Q1[3] & Q1[0]; // 第二计数器计数周期是第二个的10倍
assign OneHertz = Q2[3] & Q2[0];
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

result❌

mark

在计数0-10的时候是正确的

mark

  • 在计数90-99的时候: c_enable[2]本该为0却变为了1,导致输出c_enable=5=3’b101;

  • 由于c_enable[2]=Q1[3] & Q1[0],起初我认为是Q1有问题;后续画出如下草图发现还是c_enable有问题

    mark

  • 由于Q1是由计数器生成的,只要使能信号没问题,那么它就还🆗
  • 又由于使能信号1和2是我们定义,所以从这里下手解决问题比较方便;
  • 由上图知使能信号2有问题,它在计数90-99期间一直为高电平,我们只希望其在99时为高电平。
  • 所有修改使能2的赋值:c_enable[2] = Q1[3] & Q1[0] & c_enable[1]
  • 同理我们也要修改OneHertz = Q2[3] & Q2[0] & c_enable[2];,让其只在999时才有效;否则其在900-999一直有效;

Final answer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
); //
reg [3:0] Q0,Q1,Q2;
assign c_enable[0] = 1'b1;
assign c_enable[1] = Q0[3] & Q0[0];
assign c_enable[2] = Q1[3] & Q1[0] & c_enable[1];
assign OneHertz = Q2[3] & Q2[0] & c_enable[2];
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

Advanced problem(❓)

⭐如何实现50%(xx%)占空比的10(xx)倍频电路


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!