您的位置:首页 > 其它

对Verilog的一些记录

2015-03-29 01:46 197 查看
之前一段时间接触过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核,由于没有使用过了,这里就不多加议论了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: