对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核,由于没有使用过了,这里就不多加议论了
从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核,由于没有使用过了,这里就不多加议论了
相关文章推荐
- VS2005 && MasterPage && Form 的一些相关使用记录
- RFC34 关于ARC时钟的一些初步记录摘要
- 新工作一周的一些记录
- 记录一些TinyXml使用指南(1)
- 记录一些平时学习的点滴
- 记录一些TinyXml使用指南(2)
- 让人郁闷了好久的问题,终于解决了,之前网上也看到一些解决方法,但大多没有解决问题,所以记录下来,以供参考之用(ADO Could Not Find The Specified Provider)
- 在一个表中有一些完全一样的记录,怎样只保留一条记录呢?(来自CSDN)
- GridView使用一些记录
- 一些工作记录
- 把平时工作中的一些记录放上来
- 写个帖子记录一些小问题。
- 今天开始记录一些买卖股票的记录心得
- 一些DotNet的小知识点记录
- 记录一些学习历程
- 微软工程师对SQL Server中可不可以指定某一些语句不记录到日志。问题的回复。
- 一些记录
- 语言的"不完全性现象" (一些想记录)
- 记录一些TinyXml使用指南(4)
- 清除记录的一些方法