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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3102|回复: 10

[求助] 新手学习verilog的两个问题

[复制链接]
发表于 2016-11-11 18:44:40 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 GreatGBL 于 2016-11-11 19:54 编辑

大家好,刚刚学习verilog有两个问题想请教以下

1. 为什么在verilog中的进位是从9进位,但是实际是10有效呢?
比如一个秒表中的进位程序如下

always_ff @(posedge clk)
        begin
            if (reset)
              begin
                count1 <= '0;            
                count2 <= '0;           
                count3 <= '0;           
                count4 <= '0;           
              end
            else if(enable)
            begin
               if (count1 == 4'b1001)
                    begin
                    count1 <= '0;
                   if (count2 == 4'b1001)
                       begin
                       count2 <= '0;
                       if (count3 == 4'b1001)
                             begin
                             count3 <= '0;
                            if (count4 == 4'b1001)
                               begin
                               count4 <= '0;
                               end
                   else
                     count4 <= count4 + 1'b1;
                     end
               else
                  count3 <= count3 + 1'b1;
                  end
            else
               count2 <= count2 + 1'b1;
               end
         else
            count1 <= count1 + 1'b1;
            end
         end
endmodule


程序比较简单,但是为什么进位时的判定条件是 if (count1 == 4'b1001)
而不是if (count1 == 4'b1010) 呢?  从C的角度看,应该是等于10才归零才进位呀?






2.为什么这个程序会陷入死循环? pos和an一直等于0,不管我按了reset没有。。


always_ff @(posedge clk)
        if (reset)
         begin
            pos <= '0;            // set all bits to 0
            an <= '0;            // set all bits to 0
         end

发表于 2016-11-11 22:56:53 | 显示全部楼层
你好,我来回答一下你的两个问题
1,verilog是一种硬件描述语言,从你的代码看always_ff是systemverilog的语法
      always_ff后面的括号里是整个always过程块的触发条件“@(posedge clk)”意思是时钟上升沿触发,按照你的代码应该是第9个时钟来的时候count继续计数并且值加到了9,等到第10个时钟的上升沿来到的时候count就会归0。

2,你这个代码的意思当时钟的上升沿到了的时候reset的值为1的时候给pos和an赋值为0,这里并没有其他的赋值操作所以“pos”和“an”一直保持为0很正常。不同的仿真器处理这种尚未被赋值的变量可能会有不同的处理方式,在你没有把reset设置成1的时候你的两个变量可能是“X”不定态或者其他形式。
 楼主| 发表于 2016-11-12 00:29:27 | 显示全部楼层
回复 2# ppoogood

好的,非常感谢回答还有一个问题,在verilog中,程序是从左往右执行吗?  我发现把上下顺序调换也可以工作,这在C语言中是不能实现的
发表于 2016-11-12 11:50:57 | 显示全部楼层
FPGA中,语句都是并发进行的,一个时钟到来后,或者一个敏感信号触发后,进程中的所有语句都同时执行一遍,没有先后之分的,这一点是和高级软语言最大的不同,也是初学者极易搞混淆的地方
发表于 2016-11-12 22:48:52 | 显示全部楼层
回复 3# GreatGBL

在verilog中各个过程块(也就是always)都是并发进行的,此外在当begin...end中的语句使用了非阻塞赋值(<=)符号的他们是并行的关系,如果这些语句使用了阻塞赋值符号(=)的话那么就是按照上下顺序执行的。
 楼主| 发表于 2016-11-14 02:42:37 | 显示全部楼层
本帖最后由 GreatGBL 于 2016-11-14 11:19 编辑

回复 4# 北京小黑


   你好,请问 是FPGA里面是把程序变成实际的逻辑门,因为逻辑门是并行执行的吗?、
如果是的话,IF语句是如何变成逻辑门的呢?感谢你的回答
 楼主| 发表于 2016-11-14 02:48:15 | 显示全部楼层
回复 5# ppoogood


   好的,我明白了。我刚学FPGA没几个月,我们老师直接给我们现成的CODE,比如DQ触发器(Flip-flop),计数器,译码器。 我也只知道always_comb是用 “=”, always_ff 是用 "<=" 但是不清楚原因。然后实验课就是把老师给的现成CODE分模块拼在一起。实际上没有本质上理解FPGA的工作原理,还有很长的路要走呢。

题外话一下,我用的是 Xilinx 的 verliog 软件,板子用的是Basys 3
但是我写好CODE以后,上传到板子里面要差不多3-5分钟。如果我要修改CODE,我又要上传3-5分钟,这样效率很低,很多时间都在等待上传上面了,请问有没有什么办法,当我上传好CODE以后,再修改的时可以即使上传吗?谢谢
 楼主| 发表于 2016-11-14 11:24:02 | 显示全部楼层
回复 2# ppoogood


    你好,关于之前的这个代码,我还是有一个问题
always_ff @(posedge clk)
        if (reset)
         begin
            pos <= '0;            // set all bits to 0
            an <= '0;            // set all bits to 0
         end


我这里是列了部分,之前我有always_comb来操作pos和an  
我是想让用户操作板子上的up,down,left,right 四个按钮,来移动LCD显示屏上的"-"符号,其中pos就是位置,an是第几个LCD显示屏
之前没有reset是能够操作的(但是有一些问题,我再自己研究一下),但是一旦我加了上面这行代码,无论我按下RESET没有,这个pos和an就永远都是0了,我对这个逻辑感觉很奇怪。请问能解答一下嘛,谢谢
发表于 2016-11-14 17:07:41 | 显示全部楼层


实际上,verilog begin end块中的语句是顺序执行的,fork join块中的才是并行执行
发表于 2016-11-14 17:11:04 | 显示全部楼层


回复  GreatGBL

在verilog中各个过程块(也就是always)都是并发进行的,此外在当begin...end中的语句使 ...
ppoogood 发表于 2016-11-12 22:48



begin end块中的语句都是顺序执行的,与是否是在用非阻塞或者阻塞赋值无关,只不过使用非阻塞赋值时,右边的表达式的计算结果不是立刻赋值给左边的变量,而是等当前deta cycle执行快完成的时候对左边的变量赋值。详细的调度可参考verilog标准
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-3 09:49 , Processed in 0.028541 second(s), 6 queries , Gzip On, Redis On.

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