博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Verilog与C/C++的一些区别
阅读量:6330 次
发布时间:2019-06-22

本文共 1592 字,大约阅读时间需要 5 分钟。

  之前一段时间接触过Verilog但是一直没有具体记录,现在在这里记录一下,比较浅薄。

  从C/C++语言上手Verilog一些需要注意的东西:

  1.if,else等语句的书写要求,这里与C/C++语言不同,if的内容是以begin和end开始和结尾的。在Verilog很少有用大括号来表示范围的。

  2.对output类型的变量赋值需要使用assign

  3.Verilog中虽然有并行执行的语句,但是不是什么都并行执行的,一些书籍上面认为这是与其他语言很大的不同,夸大了并行执行,个人认为是不合适的,而且书中并没有说明,整个文件被编译之后的执行顺序是什么。很容易给人以误导。(具体的执行顺序到现在还不是很清楚)

  4.注意阻塞性赋值(=)与非阻塞性赋值(<=)的区别。这里简单说就是阻塞性赋值是一个一个执行的,而非阻塞性赋值这是并行执行的。举个例子:

            a <= 1‘b1;

            b <= 1'b1;//非阻塞性赋值,这里a,b同时被修改为1.

            c   = 1'b1;

            d   = 1'b1;//阻塞性赋值,c先被修改为1,之后d被修改为1

    大致看了一下这篇文章里面结合硬件来说明应该是更加形象一点:

    http://blog.163.com/xiaoting_hu/blog/static/50464772201361162838112/

  5.再给非数字变量赋值时,要注意位数,比如直接给一个reg型的变量a赋值为1,即a = 1;这里a不是一个单独的1,会按照一定的要求(和操作系统有关)经行数位的补齐。例如将1补成32’b1;

  还有一点就是要注意相应位数所能表示数的最大范围。例如一个8位的向量,最大可以为2的8次方,即255,如果发生溢出会导致从零重新开始,即0,1,2,3....254,255,0,1,2...这里不注意的话很可能会发生我们想不到的事情

  6.关于always语句,本人使用的时候,里面放置的敏感信息都是时钟信号,通常是上升沿触发或者是下降沿触发,之后再进行一个计数,已完成相应的延时或者其他功能。例如:

  always(posedge clk)

  begin

  count = count + 1;

  if(count < 100)

      a = 1;

  else if(count > 100 && count < 200)

      a = 0;

  else if(count == 200)

      count = 0

  end

  //这样a为1(高电平)就被保留了100个时钟周期,假设clk是0.01秒,而a是一个给LED等供电的io口,那么我们//就能看到每隔1s中灯闪亮一次。

  //注:只是举个例子,具体事例还要具体的分析

  7.之后还有一些function之类的语法还有IP核,由于没有使用过了,这里就不多加议论了

 

以上是2015-03-29写的

 

2016.3.15更新

FPGA与Verilog有一段时间没有记录了,看了一下自己过去写的,感觉认识好肤浅.....

再次记录一下自己对FPGA与Verilog的新的领悟。首先要想学习FPGA与Verilog就要与硬件相关联,很多程序软件上仿真是正确的,但到了板子上就没有那种效果,这个大多数是因为在程序中使用了一下编译器无法与硬件相对应的语句,例如always(*)这种可能编译器没有判定为错误的语句。此外Verilog是一种硬件描述语言,关键词是描述,因为硬件FPGA的结构已经是确定的了,所以只能是描述,而不能像C/C++语言一样,可以去设计程序。

转载于:https://www.cnblogs.com/wace/p/4375633.html

你可能感兴趣的文章