1(4)計數器

xuxuxu69發表於2024-11-21

Proteus模擬計數器

工程搭建

計數器從0計數到15,當計數到10時觸發led燈
程式碼:

點選檢視程式碼
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/11/21 15:41:56
// Design Name: 
// Module Name: count_module
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////
// Company:         xxx
// Engineer:        dahunzi
// 
// Create Date:     2023/07/01
// Design Name:     xxx
// Module Name:     xxx
// Project Name:    xxx
// Target Devices:  xxx
// Tool Versions:   VIVADO2017.4
// Description:     xxx
// 
// Dependencies:    xxx
// 
// Revision:     v0.1
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////

module count_module#(
    parameter       P_CNT_WIDTH = 8   
)(
    input                       i_clk       ,
    input                       i_rst       ,
    input                       i_en        ,    

    output  [P_CNT_WIDTH-1:0]   o_cnt       ,
    output                      o_led
);

/***************function**************/

/***************parameter*************/

/***************port******************/             

/***************mechine***************/

/***************reg*******************/
reg [P_CNT_WIDTH-1:0]           ro_cnt      ;
reg                             ro_led      ;


/***************wire******************/

/***************component*************/

/***************assign****************/
assign o_cnt = ro_cnt;
assign o_led = ro_led;

/***************always****************/
always @(posedge i_clk or negedge i_rst) begin
    if(!i_rst) begin
        ro_cnt <= 8'd0; //大位寬賦值給小位寬允許(自動截位),小位寬賦值給大位寬不允許(軟體不會自動補位)
    end
    else begin
        ro_cnt <= ro_cnt + 1;
    end
end

always @(posedge i_clk or negedge i_rst) begin
    if(!i_rst) begin    //上電覆位初值
        ro_led <= 1'd0; 
    end
    else if(ro_cnt == 8'd10) begin
            ro_led <= 1'd1;
        end
    else begin
        ro_led <= 1'd0;
    end
end

endmodule

這節課沒上板)
他這個程式碼的i_en沒用到
不過程式碼中沒有直接將埠設定為reg,而是另外定義了reg暫存器然後assign給了埠的操作還是值得學習的

相關文章