在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2568|回复: 1

[原创] 十分简单的timer,支持多通道,连续计数和握手,复位有效电平,计数周期为参数

[复制链接]
发表于 2011-12-23 13:11:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 never1978 于 2011-12-23 13:26 编辑

结构十分简单,宏定为为
·define ONES(n) {(n-1){1'b0},1'b1}
data_bits 为clog2的函数,verilog 参考手册上的clog2给仿真用的,综合的话有warnning,对输入做了赋值,使用不太舒服,自己写了一个,宏是重载data bits 的位宽。
module gecko_timer_lite
    #(
    parameter TIMER_NUM            = 2'b0                           ,//=== timer channel number,support multi channel
    parameter TIMER_WIDTH          = data_bits(TIMER_NUM)           ,//=== timer number width
    parameter TIMER_CYCLE          = 8'd32                          ,//=== timer output cycle
    parameter TIMER_OPCODE         = 4'b0101                           
    )
    (
    input                          clk                              ,
    input                          rst_n                            ,

    input  [TIMER_WIDTH-1     : 0] i_timer_restore                  ,//=== timer restore to zero
    input  [TIMER_WIDTH-1     : 0] i_timer_en                       ,//=== timer enable
    input  [TIMER_WIDTH-1     : 0] i_timer_ack                      ,//=== timer interrupt clear
    output [TIMER_WIDTH-1     : 0] o_timer_on                        //=== timer count up and issue interrupt
    );
   
    //=== opcode[0] = timer self clear and countinus output
    //=== opcode[1] = timer ack clear and output level
    //=== opcode[2] = timer restore active level
   
    `DATA_BITS ( 16 )
    localparam TIMER_RESTORE_ACITE = TIMER_OPCODE[2]                ;
    localparam TIMER_ACK           = TIMER_OPCODE[1]                ;
    localparam TIMER_MODE          = TIMER_OPCODE[0]                ;
    localparam TIMER_CACHE_ON      = TIMER_OPCODE[3]                ;

    wire   [TIMER_NUM-1       : 0] w_timer_eos_count                ;//=== timer end of counter
   
    reg    [TIMER_WIDTH-1     : 0] r_timer_counter[TIMER_NUM:0]     ;//=== timer main counter

    generate
    genvar i;
    begin : timer
    for ( i = 0; i < TIMER_NUM; i = i + 1 )
    begin
    always @ ( posedge clk or negedge rst_n )
        if ( ! rst_n )
            r_timer_counter <= `TD 1'b0;
        else if ( i_timer_restore == TIMER_RESTORE_ACITE )
            r_timer_counter <= `TD 1'b0;
        else if ( w_timer_eos_count == 1'b1 )
        begin
            if ( TIMER_ACK == 1'b0 )
                r_timer_counter <= `TD 1'b0;
            else if ( i_timer_ack == 1'b1 )
                r_timer_counter <= `TD 1'b0;
        end
        else if ( i_timer_en == 1'b1 )
            r_timer_counter <= `TD r_timer_counter + `ONES ( TIMER_WIDTH );
        else
            r_timer_counter <= `TD 1'b0;

    assign w_timer_eos_count = r_timer_counter == TIMER_CYCLE;
    end
    end
    endgenerate

    generate
    genvar j;
    if ( TIMER_CACHE_ON == 1'b1 )
    begin : timer_cache
    reg    [TIMER_NUM-1       : 0] r_timer_cache                    ;//=== timer main counter
    for ( j = 0; j < TIMER_NUM; j = j + 1 )
    always @ ( posedge clk or negedge rst_n )
        if ( ! rst_n )
            r_timer_cache[j] <= `TD 1'b0;
        else
            r_timer_cache[j] <= `TD w_timer_eos_count[j];

    assign o_timer_on               = r_timer_cache                 ;
    end
    else
    begin : timer_uncache
    assign o_timer_on               = w_timer_eos_count             ;
    end
    endgenerate
   
endmodule
 楼主| 发表于 2011-12-23 13:13:39 | 显示全部楼层
`define DATA_BITS(n_data_width)                                                                    \
function [n_data_width-1:0] data_bits                                                              \
        (                                                                                              \
        input [n_data_width-1:0] data                                                                       \
        );                                                                                             \
        integer                   i;                                                                   \
        reg [n_data_width-1:0]value;                                                                   \
        begin                                                                                          \
        data_bits = 1;                                                                                 \
        value = data - 1;                                                                              \
        for ( i = 0 ;i < n_data_width-1; i = i + 1 )                                                   \
                if ( value[i] == 1'b1 )                                                                    \
                        data_bits = i + 1;                                                                     \
        end                                                                                            \
endfunction //=== calculate data valid bits
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-7-5 13:51 , Processed in 0.085924 second(s), 10 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表