OpenEdv-开源电子网

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

[ALTERA] always语句中的执行顺序问题!!!

[复制链接]

7

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2019-6-2
在线时间
63 小时
发表于 2020-2-14 21:30:03 | 显示全部楼层 |阅读模式
5金钱
下面是按键消抖部分程序
key_reg保存的是上一个时钟的key值
当key值改变并且下一个时钟上升沿触发时 请问红色的两句话是并行执行的么?
(只有并行执行才能检测到按键值的变化)
刚接触verilog 有些基础还不是很懂

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        key_reg   <= 1'b1;
        delay_cnt <= 32'd0;
    end
    else begin
       key_reg <= key;
        if(key_reg != key)             
            delay_cnt <= 32'd1000000;
        else if(key_reg == key) begin
            if(delay_cnt > 32'd0)
                delay_cnt <= delay_cnt - 1'b1;
            else
                delay_cnt <= delay_cnt;
        end           
    end   
end

最佳答案

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

你好 上面的程序是对的 使用非阻塞赋值 寄存器类型key_reg 保存的是上一个时钟周期的key值 当下一个时钟上升沿触发并且key值改变时 key_reg 的值是key上一个时钟周期的值 执行if(key_reg != key) 对delay_cnt寄存器变量赋初值
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2019-6-2
在线时间
63 小时
 楼主| 发表于 2020-2-14 21:30:04 | 显示全部楼层
jshzp 发表于 2020-2-15 10:29
在Verilog语言中 ,=和

你好 上面的程序是对的
使用非阻塞赋值 寄存器类型key_reg 保存的是上一个时钟周期的key值
当下一个时钟上升沿触发并且key值改变时 key_reg 的值是key上一个时钟周期的值
执行if(key_reg != key) 对delay_cnt寄存器变量赋初值
回复

使用道具 举报

52

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2019-4-1
在线时间
118 小时
发表于 2020-2-15 10:29:39 | 显示全部楼层
在Verilog语言中 ,=和<=是两种不同的赋值方式,前者是阻塞式赋值,新数值到下个触发周期才生效;后者是非阻塞赋值,新数值是和单片机情况一样的,立刻就会生效。
所以,你的代码 key_reg <= key;应该采用非阻塞赋值方式key_reg = key;代码才会是你想要的结果。
回复

使用道具 举报

8

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2017-1-14
在线时间
48 小时
发表于 2020-2-18 15:40:13 | 显示全部楼层
Shari 发表于 2020-2-15 11:09
你好 上面的程序是对的
使用非阻塞赋值 寄存器类型key_reg 保存的是上一个时钟周期的key值
当下一个 ...

对的!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-10-3 09:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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