3.2.2.5 Counter 1-12
本题参考HDLBits:在线学习 Verilog (二十一 · Problem 100 - 104) - 知乎
问题描述
设计一个具有以下输入和输出的 1-12 计数器:
- 复位同步高电平有效复位,强制计数器为 1
- 启用设置为高以使计数器运行
- clk上升沿触发时钟输入
- Q[3:0]计数器的输出
- c_enable, c_load, c_d[3:0]控制信号进入提供的 4 位计数器,它们的目的是允许检查这些信号的正确性。
您有以下可用组件:
- 下面的 4 位二进制计数器 ( count4 ),它具有启用和同步并行加载输入(加载的优先级高于启用)。count4模块提供给您。在你的电路中实例化它。
- 逻辑门
module count4( input clk, input enable, input load, input [3:0] d, output reg [3:0] Q );
c_enable 、c_load和c_d输出是分别进入内部计数器的enable、load和d输入的信号。它们的目的是允许检查这些信号的正确性。
分析:本题相当于用c_enale、c_load和c_d[3:0]三个控制信号来控制题目中给我们提供的4-bit计数器,使得该计数器的计数范围改变为1~12。
题目提供给我们4-bit计数器
- 有enable信号、复位和置位的计数器,将该计数器例化至我们的代码中。
- 再用一些其他的逻辑门来完成本题
代码:
module top_module (
input clk,
input reset,
input enable,
output [3:0] Q,
output c_enable,
output c_load,
output [3:0] c_d
);
//使能端
assign c_enable=enable;
//复位信号
assign c_load=reset||(Q==12&&enable);
//置位信号
assign c_d=1;
//count4 the_counter (clk, c_enable, c_load, c_d /*, ... */ );
count4 the_counter (clk, c_enable, c_load, c_d, Q);
endmodule
3.2.2.6 Counter 1000
问题描述
从 1000 Hz 时钟导出一个称为OneHertz的 1 Hz 信号,该信号可用于驱动一组小时/分钟/秒计数器的启用信号,以创建数字挂钟。由于我们希望时钟每秒计数一次,因此OneHertz信号必须每秒准确地断言一个周期。使用模 10 (BCD) 计数器和尽可能少的其他门构建分频器。还要从您使用的每个 BCD 计数器输出使能信号(c_enable[0] 为最快的计数器,c_enable[2] 为最慢的)。
为您提供以下 BCD 计数器。Enable必须为高电平才能使计数器运行。复位是同步的并设置为高以强制计数器为零。电路中的所有计数器必须直接使用相同的 1000 Hz 信号。
分析:
clk是每秒一千次,OneHertz是每秒一次,题目的意思就是用三个十进制计数器把1000hz“减速”为1hz。counter0每计数到9的时候,才允许counter1计数1次;当counter0计数到9且counter1计数到9,相当于计数到99,这时候允许counter2计数1次,以此类推。
文章来源:https://www.toymoban.com/news/detail-840777.html
代码:文章来源地址https://www.toymoban.com/news/detail-840777.html
module top_module (
input clk,
input reset,
output OneHertz,
output [2:0] c_enable
); //
// 我们定义个位、十位、百位
wire [3:0] one,ten,hundred;
// 个位的使能c_enable[0]恒有效
// 十位的使能c_enable[1]只有在个位为9时才有效
// 百位的使能c_enable[2]只有在个为为9十位为9时才有效
// 类比小学数学,使能有效姑且理解为进位
assign c_enable={one==4'd9&&ten==4'd9, one==4'd9, 1'b1};
// 计数到999时,OneHertz=1
assign OneHertz= one==4'd9&&ten==4'd9&&hundred==4'd9;
// 例化提供的模十计数器
bcdcount counter0 (clk, reset, c_enable[0], one);/*, ... */
bcdcount counter1 (clk, reset, c_enable[1], ten);/*, ... */
bcdcount counter2 (clk, reset, c_enable[2], hundred);
endmodule
到了这里,关于HDLBits刷题Day14,3.2.2.5 Counter 1-12 - 3.2.2.6 Counter 1000的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!