ath10_字节计数器问题


 always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_byte <= 0 ;
        end
        else if(add_cnt_byte)begin
            if(end_cnt_byte)begin
                cnt_byte <= 0 ;
            end                
            else begin        
                cnt_byte <= cnt_byte + 1 ;
            end             
        end
    end             
    assign    add_cnt_byte = rw_done ;
    assign    end_cnt_byte = add_cnt_byte && (cnt_byte == ((state_c == READ) ? 7:4) - 1) ;

作者您好,请问在ath10控制模块中的这个字节计数器,我理解的是初始化后需要四个字节,应该计数到32,而不是计数到三,因为字节计数器也是时钟上升沿加一,

这里的字节计数器的计数条件不是时钟上升沿,而是add_cnt_byte,也就是rw_done信号拉高一次,计数器才计数一次,发送完一字节的数据之后rw_done才拉高一次,此时计数器技计数一次。

根据您提供的代码,这是一个在时钟上升沿触发的计数器,其计数范围是0到31。该计数器在复位信号(rst_n)为低电平时被初始化为0。每当添加(add_cnt_byte)信号为高电平时,如果结束(end_cnt_byte)信号也为高电平,则计数器被重置为0,否则计数器会增加1。

根据您的描述,您希望计数器的初始值为4,并在时钟上升沿计数到32。然而,根据代码的实现方式,计数器只会从0计数到31。因此,根据这个代码片段,无法实现您所描述的功能。

如果您希望实现将计数器从4开始计数到32的功能,您需要对代码进行修改。具体来说,您需要将计数器的最大值设置为32,并在初始化时将计数器的值设置为4。另外,您还需要修改结束信号的比较条件,以便在计数器达到32时重置计数器。

以下是一个修改后的代码示例:

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_byte <= 4; // 将计数器初始化为4
    end
    else if(add_cnt_byte) begin
        if(end_cnt_byte) begin
            cnt_byte <= 0; // 重置计数器为0
        end else if(cnt_byte == 32) begin // 当计数器达到32时重置计数器
            cnt_byte <= 0;
        end else begin
            cnt_byte <= cnt_byte + 1; // 否则增加计数器的值
        end
    end
end

assign add_cnt_byte = rw_done;
assign end_cnt_byte = add_cnt_byte && (cnt_byte == ((state_c == READ) ? 7:4) - 1);

请注意,这只是一个示例代码,您可能需要根据您的具体需求进行进一步的调整和验证。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的代码片段,我了解到在 ath10 控制模块中有一个名为 cnt_byte 的字节计数器。根据代码逻辑,cnt_byte 变量会在时钟上升沿触发时进行计数。

根据代码中的逻辑,cnt_byte 的初始值为0,并在复位信号 rst_n 为低电平时被重置为0。然后,当 add_cnt_byte 为真时,cnt_byte 会递增1。同时,当 end_cnt_byte 为真时,cnt_byte 会被重置为0。

根据您的描述,您希望字节计数器在初始化后计数到32,而不是计数到3。根据代码中的条件,end_cnt_byte 的计算是基于 (state_c == READ) ? 7 : 4 的结果进行判断。如果 state_c 的值为 "READ",则 end_cnt_byte 将在 cnt_byte 达到7时为真,否则在 cnt_byte 达到3时为真。

如果您希望字节计数器计数到32,您需要相应地调整代码中的逻辑。您可以将 (state_c == READ) ? 7 : 4 修改为 (state_c == READ) ? 31 : 3,这样当 state_c 为 "READ" 时,字节计数器会在 cnt_byte 达到31时为真,否则在 cnt_byte 达到3时为真。

以下是相应的修改代码片段:

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        cnt_byte <= 0;
    end
    else if (add_cnt_byte) begin
        if (end_cnt_byte) begin
            cnt_byte <= 0;
        end                
        else begin        
            cnt_byte <= cnt_byte + 1;
        end             
    end
end             

assign add_cnt_byte = rw_done;
assign end_cnt_byte = add_cnt_byte && (cnt_byte == ((state_c == READ) ? 31 : 3));

请注意,这只是对您提供的代码片段进行了相应的修改来使字节计数器计数到32。具体的修改可能还需要结合您的设计需求和整体代码结构来进行调整。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢