HDLBits(16)4.18

发布时间 2023-04-18 21:04:27作者: LhTian21

3 电路

3.2 时序逻辑

3.2.2 计数器

  •  Count1to10(Decade counter again)

与上题一样,区别是复位为1

module top_module(
    input clk,
    input reset,
    output [3:0] q);
    
    always @(posedge clk)
        begin
            if(reset)
                q <= 4'b0001;    //复位为1
            else if(q <= 4'b1001)
                q <= q + 1'b1;
            else
                q <= 4'b0001;
        end
endmodule
  •  Coutslow(Slow decade couter)

一个0-9,同步复位且复位为0的计数器,但计数器不随clk变化而递增,而是由slowena使能信号控制

module top_module (
    input clk,
    input slowena,
    input reset,
    output [3:0] q);

    always @ (posedge clk)
        begin
            if(reset)
                q <= 4'b0;
            else if(slowena == 1'b1)
                begin
                    if(q == 4'd9)
                        q <= 4'b0;
                    else 
                        q <= q + 4'd1;
                end
        end

endmodule
  •  Counter 1-12

 根据以下输入输出信号设计一个计算1~12的计数器

Reset:同步复位信号,高复位,将计数器复位为1.

Enable:使能信号高有效

Clk:时钟上升沿触发计数器工作

Q[3:0]:计数器输出

c_enable, c_load, c_d[3:0]:题目中给我们提供了一个4-bit的计数器,这三个信号是用于该4-bit计数器的控制信号。

题目提供给我们4-bit计数器

  1. 有enable信号,带复位和置位的计数器,将该计数器例化至我们的代码中。
  2. 再用一些其他的逻辑门来完成本题
module top_module (
    input clk,
    input reset,
    input enable,
    output [3:0]Q,
    output c_enable,
    output c_load,
    output [3:0]c_d
);
    reg [3:0] temp; //4-bit 计数器的控制信号
    assign c_enable = enable;
    assign c_load = reset | (Q == 4'd12 & enable == 1'b1);
    assign c_d = 4'b1;
    count4 the_counter (clk,c_enable,c_load,c_d,Q);
endmodule
  •  Counter1000

OneHertz: 从1000Hz中分离出1Hz的信号;这个信号主要用作于数字时钟中。

利用一个模10的BCD计数器和尽量少的逻辑门建立一个时钟分频器。同时输出每个BCD计算器的使能信号(c_enable[0]为高位,c_enable[2]为低位)

module bcdcount (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
);
    wire [3:0] q0,q1,q2;  //1000 -> 100(q2) -> 10(q1) -> 1(q0)
    assign c_enable = {q1==4'd9 && q0==4'd9,q0==4'd9,1'b1};
    assign OneHertz = {q2==4'd9 && q1==4'd9 && q0==4'd9};
    
    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