完成1赫兹计数器的建模。采用低电平同步复位,复位状态为“0”。输入时钟为1000Hz。 本关任务需要通过实例化若干个如下所示的模10计数器实现,其中,当使能输入端口en = 1时,计数器开始计数。 本关会用到三个4位计数器,它们必须被定义为cnt[11:0],即cnt[3:0],cnt[7:4]和cnt[11:8]分别对应三个计数器。 module cnt_bcd #(parameter N = 4)( input sys_clk, input sys_rst_n, input en, output [N - 1 : 0] cnt ); localparam CNT_MAX = 10; reg [N-1 : 0] cnt; always @(posedge sys_clk) begin if (!sys_rst_n) cnt <= 0; else if (en) begin if (cnt == CNT_MAX - 1) cnt <= 0; else cnt <= cnt + 1; end end endmodule 1位输出信号OneHertz:1赫兹计数的标记信号。计数器每计1000次,该信号输出1个周期高电平。 3位输出信号en:用于控制若干模10计数器开始计数。其中en[0]连接最快的计数器,en[2]则连接最慢的计数器。`include "src/step5/cnt_bcd.v" module cnt_1Hz( input sys_clk, input sys_rst_n, output OneHertz, output [2 : 0] en ); // 请在下面添加代码,完成1Hz计数器的建模 // 代码量预计8行 /****** Begin ******/ /****** End ******/ endmodule
时间: 2023-12-31 20:03:20 浏览: 167
单片机C语言程序设计 INT0及INT1中断计数(有源码)
5星 · 资源好评率100%
module cnt_1Hz(
input sys_clk,
input sys_rst_n,
output OneHertz,
output [2:0] en
);
// 实例化三个模10计数器
cnt_bcd #(.N(4)) cnt0(.sys_clk(sys_clk), .sys_rst_n(sys_rst_n), .en(en[0]), .cnt(cnt[3:0]));
cnt_bcd #(.N(4)) cnt1(.sys_clk(sys_clk), .sys_rst_n(sys_rst_n), .en(en[1]), .cnt(cnt[7:4]));
cnt_bcd #(.N(4)) cnt2(.sys_clk(sys_clk), .sys_rst_n(sys_rst_n), .en(en[2]), .cnt(cnt[11:8]));
// 定义计数器计数到1000的阈值
localparam CNT_MAX = 1000;
reg [9:0] cnt_1Hz = 0;
// 定义输出信号
wire [3:0] cnt0_9 = cnt0.cnt;
wire [3:0] cnt1_9 = cnt1.cnt;
wire [3:0] cnt2_9 = cnt2.cnt;
// 当计数器计数到1000时,OneHertz输出一个周期的高电平
assign OneHertz = (cnt_1Hz == CNT_MAX - 1);
// 每次sys_clk上升沿时,cnt_1Hz加1,同时en输出控制信号
always @(posedge sys_clk) begin
if (!sys_rst_n) begin
cnt_1Hz <= 0;
en <= 3'b000;
end else begin
if (cnt_1Hz == CNT_MAX - 1) begin
cnt_1Hz <= 0;
en <= {en[1:0], 1'b1};
end else begin
cnt_1Hz <= cnt_1Hz + 1;
en <= {en[1:0], 1'b0};
end
end
end
endmodule
阅读全文