OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4086|回复: 4

[ALTERA] Always程序块中变量无法正常赋值

[复制链接]

18

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-4-24
在线时间
29 小时
发表于 2022-1-28 19:06:35 | 显示全部楼层 |阅读模式
1金钱
代码如下,功能就是对输入时钟分频输出1S间隔的脉冲信号以及1MS的间隔的脉冲信号,在对MS进行计数的always模块中count_ms无法自增(红色代码段),仿真始终显示为0

module s_count_block
#(
    parameter sys_clk_Mhz = 50
)
(
    input   wire                sys_clk             , //50Mhz - 20ns
    input   wire                sys_rst_n           ,
    output  reg                 s_count_flag        , //计数完1s标志位
    output  reg                 ms_count_flag       , //计数完1ms标志位
    output  reg     [19:0]      BINARY_NUM            //二进制输出
);

reg [5:0] sys_clk_count     ; //时钟计数变量  
reg [9:0] count_ms          ; //ms计数变量


localparam count_ms_max = 10 ;


//系统时钟计数块
always@(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 0)
        begin
            sys_clk_count <= 6'd0;
            ms_count_flag = 1'b0;
        end
    else if(sys_clk_count == sys_clk_Mhz-1)
        begin   
            ms_count_flag = 1'b1;
            sys_clk_count <= 6'd0;
        end
    else
        begin
            ms_count_flag = 1'b0;
            sys_clk_count <= sys_clk_count + 1'b1;
        end
end


//ms计数程序块
always@(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 0)
        begin
            count_ms <= 10'd0;
            s_count_flag <= 1'b0;
        end
    else if((count_ms == count_ms_max - 1) && (ms_count_flag == 1'b1))
        begin
            count_ms <= 10'd0;
            s_count_flag <= 1'b1;
        end
    else if(ms_count_flag == 1'b1)
        begin
            count_ms <= count_ms + 1'b1;
            s_count_flag <= 1'b0;
        end
    else
        begin
            count_ms <= count_ms;
            s_count_flag <= 1'b0;
        end
end

always@(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 0)
        BINARY_NUM <= 20'd0;
    else if((BINARY_NUM == count_ms_max - 1) && (ms_count_flag == 1'b1))
        BINARY_NUM <= 20'd0;
    else if(ms_count_flag == 1'b1)
        BINARY_NUM <= BINARY_NUM + 1'b1;
    else
        BINARY_NUM <= BINARY_NUM;
end



endmodule

最佳答案

查看完整内容[请看2#楼]

程序没问题,是不是你外部例化的时候parameter sys_clk_Mhz 赋值过大,计数器reg [5:0] sys_clk_count 溢出,计数器异常导致的if(sys_clk_count == sys_clk_Mhz-1)条件一直不成立,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
455
金钱
455
注册时间
2020-11-30
在线时间
66 小时
发表于 2022-1-28 19:06:36 | 显示全部楼层
程序没问题,是不是你外部例化的时候parameter sys_clk_Mhz 赋值过大,计数器reg [5:0] sys_clk_count  溢出,计数器异常导致的if(sys_clk_count == sys_clk_Mhz-1)条件一直不成立,
回复

使用道具 举报

18

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2017-4-24
在线时间
29 小时
 楼主| 发表于 2022-1-28 19:07:02 | 显示全部楼层
各位大佬帮忙看看
回复

使用道具 举报

4

主题

881

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4199
金钱
4199
注册时间
2019-9-4
在线时间
881 小时
发表于 2022-2-8 11:44:29 | 显示全部楼层
帮顶  
回复

使用道具 举报

2

主题

102

帖子

0

精华

高级会员

Rank: 4

积分
645
金钱
645
注册时间
2021-8-3
在线时间
152 小时
发表于 2022-2-9 09:41:15 | 显示全部楼层
//ms计数程序块
always@(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 0)
        begin
            count_ms <= 10'd0;
            s_count_flag <= 1'b0;
        end
    else if((count_ms == count_ms_max - 1) && (ms_count_flag == 1'b1))
        begin
            count_ms <= 10'd0;
            s_count_flag <= 1'b1;
        end
    else if(ms_count_flag == 1'b1)
        begin
            count_ms <= count_ms + 1'b1;
            s_count_flag <= 1'b0;
        end
    else
        begin
            count_ms <= count_ms;
            s_count_flag <= 1'b0;
        end
end

第一个else if和第二个else if这里有问题,复位之后ms_count_flag 值为0,count_ms 不会增加,所以一直为0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表