曜曜曜切克闹的个人空间 https://blog.eetop.cn/1781145 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

Verilog学习之旅

热度 56已有 3183 次阅读| 2023-9-18 19:20 |个人分类:verilog学习|系统分类:芯片设计

 本人是东南的一名电子菜鸡,目前仍在东大读研。此前本科四年东学西学,没有留下学习痕迹。于研0顿悟,开始记录下自己的Verilog学习之旅,目的一是监督自己学习进展;目的二是记录自己学习感悟;目的三是给后来者分享自己经验;目的四是希望各位同仁批评指正本人的不足之处。

初识Verilog

  本人此前多次尝试想自学Verilog,但多次不得要领。我们大四有门课程设计需要上机,使用的主要语言就是Verilog。但是无奈老师身体欠恙,助教上课。于是乎学风浮躁,虽然最终综评成绩第一,但其实没学到多少真东西。

 真正算接触到Verilog是在wqw师兄的带领下,并且强调了Verilog对一个数字硬件工程师的重要性,因此才潜下心来,虚心学习。

正篇1——入门

 首先要对一个Verilog语言的基本框架有认识。

包括:(信号定义);模块名;模块信号声明;模块功能;

module adder(
  input clk,         //补充
  input RESETn,  //补充
  input  [2:0] a,
  input  [2:0] b,
  output reg [4:0] c
);
 
  always@(posedge clk or negedge RESETn)begin //asynchronous reset
      if(!RESETn)begin
       c <= 'd0;
      end
      else c <= a + b;
  end
 
endmodule


学习感悟:

1.认识到什么时候需要wire型变量,什么时候需要reg型变量;

wire型表示直通,输入有变化,输出立即发生改变,需要持续的驱动;此外,在模块连接时,wire型定义的变量也可以看成一根导线,用于连接不同的模块。wire型变量主要用在连续赋值语句中(例如assign)。

reg型相当于一个存储单元,reg型一定要有触发,不需要有持续的驱动。reg型变量主要用在过程赋值语句中(例如initial,always)。

变量类型变量的物理模型变量用途无驱动时的默认值
wire型变量直通,类似一根导线,需要持续驱动主要用于连续赋值语句(如assign)z
reg型变量存储,类似寄存器,不需要持续驱动主要用在过程赋值语句(initial,always)x

2.阻塞语句与非阻塞语句的区别?

2.1 时序逻辑一般采用非阻塞语句(<= , nonblocking assignment):

[变量] <= [逻辑表达式];

非阻塞的含义就是,在always模块中,本条赋值语句执行过程中,其他赋值语句也可以执行。

那么为什么会时序逻辑一般采用阻塞语句呢?

always@(posedge clk)
  a = b;
always@(posedge clk)
  b = a;

当有多个always模块同时被激活时,这样的多组阻塞语句就会产生竞争,导致最终结果可能会由于编译器的不同而产生不同的结果。

always@(posedge clk)
  a <= b;
always@(posedge clk)
  b <= a;

如果多个always采用阻塞赋值,那么赋值行为就不影响,因为a获得的是b在clk打拍之前的值,b获得的是a在clk打拍之前的值。(此时,a、b的赋值都没有发生变化)


2.2 组合逻辑一般采用阻塞语句(= , Blocking assignment):

[变量] = [逻辑表达式];

阻塞的含义就是,在本条语句赋值结束之前,阻塞了当前其他的赋值任务(类似于C语言和matlab顺序执行的操作)。


3.同步复位和异步复位的区别?

3.1 同步复位的模块和波形:

image.pngimage.png

从波形中可以分析,同步复位是一种软复位,也就是说复位信号的优先度并没有很高,即使复位信号下拉为0,也需要等待时钟clk打拍才能实现复位功能;


3.2 异步复位的模块和波形:

image.pngimage.png

从波形中可以分析,异步复位是一种硬复位,也就是说复位信号的优先度很高,只要复位信号拉低为0,就能实现复位功能。


4.verilog位宽 和 matlab数组转换的问题

修改了一版(第一版搞混了位宽和数组的定义):

在verilog中,可以定义位宽,不同数之间是可以直接进行相加的,可以进位;

如果需要对某些位宽进行操作,就需要在matlab中定义数组,从而对应每位位宽。

在verilog中数值(多位宽)可以直接进行加减,但是在matlab中的数组并不能直接产生进位,因此我是将数组先转换成十进制数,然后再进行加减,最后再转换成数组,方便后续操作。(本人目前的做法,如有同仁有更好的想法,欢迎来分享)


写在最后:

        此前我好久就有写博客的打算,于今日才下定决心上传内容。这是本人的第一次博客,虽然路途较为曲折(发表时出了bug 导致又重新写了一遍),在写博客过程中感受到了久违的平静,希望能继续保持初心,将自己的所感所悟分享给大家,也欢迎大家批评指正。


39

点赞

刚表态过的朋友 (39 人)

发表评论 评论 (11 个评论)

回复 icccccccc 2023-9-19 15:28
代码里端口没有clk和resetn
回复 analogg 2023-9-19 18:32
持续关注
回复 曜曜曜切克闹 2023-9-20 16:11
icccccccc: 代码里端口没有clk和resetn
感谢纠正
回复 魔小白 2023-9-22 21:59
码住,感谢分享,一起学习
回复 767781537 2023-9-25 09:19
楼主加油,尽量从电路的角度去理解
回复 ZZY123452 2023-9-27 13:27
我是大二的智能科学与技术的学生的学生,和楼主一起学习
回复 曜曜曜切克闹 2023-9-27 13:56
767781537: 楼主加油,尽量从电路的角度去理解
好的,谢谢你的建议,后续会尽量根据电路去理解
回复 icdane 2023-10-18 11:35
a starting point might be buying a fpge dev board and trying it out.
回复 churchmice 2023-12-4 15:11
reg型相当于一个存储单元
这话就是完全错误,赶紧抛弃wire/reg,投身logic的怀抱吧
回复 king-wa 2023-12-12 17:01
churchmice: reg型相当于一个存储单元
这话就是完全错误,赶紧抛弃wire/reg,投身logic的怀抱吧
我当年学的时候也是这么说的,input wire/ output reg,请问大佬怎么理解的
回复 Yuk1pedia 2023-12-15 17:27
持续关注

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 3

    关注
  • 19

    粉丝
  • 6

    好友
  • 45

    获赞
  • 11

    评论
  • 108

    访问数
关闭

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

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

GMT+8, 2024-5-9 07:35 , Processed in 0.017089 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部