Thiết kế counter đơn giản.

Thảo luận trong 'PROJECT ASIC' bắt đầu bởi duongnt, 30 Tháng bảy 2017.

Chia sẻ trang này

Lượt xem: 494

  1. duongnt

    By:duongntin: 30 Tháng bảy 2017
    Administrator Staff Member

    Tham gia ngày:
    9 Tháng ba 2017
    Bài viết:
    32
    Đã được thích:
    17
    1.Yêu cầu
    Thiết kế một simple counter có nhừng chức năng sau:
    - Khi tín hiệu inc_i = 1 thì counter tăng 1 đơn vị.
    - Khi tín hiệu dec_i =1 thì counter giảm 1 đơn vị.
    - Khi cả hai tín hiệu trên đều bằng 1 thì counter giữ nguyên giá trị trước đó (không tăng cũng không giảm).
    - Khi clr_i = 1 thì reset giá trị counter về 0.
    2.Input/Output block diagram.
    [​IMG]
    3.Logic design block.
    [​IMG]

    Verilog code :
    Mã:
    ////////////////////////////////////////////////////////////////////////////////
    //Company : vimach.net
    // Filename    : cnt.v
    // Description : Simple counter
    // Author      :
    // Created On  :
    // History     : Initial
    //
    ////////////////////////////////////////////////////////////////////////////////
    module cnt
        (
        clk,
        rst_n,
        //---------------------------------
        //Input
        inc_i,
        dec_i,
        clr_i,
        //---------------------------------
        //Output
        cnt_o
        );
    
    //------------------------------------------------------------------------------
    //parameter
    parameter CNT_DW  = 4'd8;
    
    //------------------------------------------------------------------------------
    // Port declarations
    input                 clk;
    input                 rst_n;
    //---------------------------------
    //Input
    input                 inc_i;
    input                 dec_i;
    input                 clr_i;
    //---------------------------------
    //Output
    output  [CNT_DW-1:0]  cnt_o;
    //------------------------------------------------------------------------------
    //internal signal
    wire [CNT_DW-1:0]      nxt_cnt;
    reg [CNT_DW-1:0]       cnt;
    wire                            inc_and_dec;
    //------------------------------------------------------------------------------
    //Count logic
    assign inc_and_dec = inc_i & dec_i;
    assign nxt_cnt = clr_i ? 8'd0 :
                             inc_and_dec ? cnt :
                             inc_i ? (cnt + 1'b1) :
                             dec_i ? (cnt - 1'b1) :cnt;
    //------------------------------------------------------------------------------
    //Flip flop
    always @ (posedge clk or negedge rst_n)
        begin
        if(!rst_n)
            cnt <= 8'd0;
        else
            cnt <= nxt_cnt;
        end
    
    assign cnt_o = cnt;
    
    endmodule

    4. Simulation & waveform.
    [​IMG]
     

    Bài viết cùng chủ đề:

    Last edited: 30 Tháng bảy 2017
    snvv and Lu ROm like this.