【准研一学习】狂肝15小时整理的Verilog语言入门知识

本文详细介绍了Verilog的基础知识,包括模块、基本要素、行为语句和Testbench。通过实例解析了模块声明、实例化、变量声明、运算符的使用,以及如何编写Testbench来验证设计。此外,还探讨了时钟和复位信号的产生方法,以及常用系统函数的应用。

闲言稍叙

Verilog和VHDL就是目前使用最多的两个硬件描述语言(HDL),如果阅读本文的你也是Verilog新手,这部分闲言或许对你有所启发。

作者本科是计算机科学与技术专业,现在是准研一,方向和硬件相关。
由于学艺不精,只会点C、Java,电路、信号、单片机等硬件课程都只懂皮毛。由于课题组研究需要,学习了Verilog语言并总结为本文。

C语言是软件描述语言,编码的核心目的在于经过编译、链接后能够产生机器能够识别的指令序列,进而完成代码功能。而Verilog是硬件描述语言,编码的核心目的在于描述门与门之间的连接,通过综合、实现所写的代码,产生可以转化为芯片的图纸,交由厂商通过光刻来生产所设计的电路,最终经过封装、测试,即通常所称的芯片。

要学习Verilog首先需要一个编程平台,有Vivado、Modelsim等,其中Vivado是用的最多的,但是运行比较慢,Modelsim运行的快,但是界面丑,这个看个人喜好安装就好。

有编程平台后,通过在网站上刷题和看书,逐渐就可以上手了。那么下面列举出我学习Verilog所使用过的网站、书籍:

网站
1.HDLBits
网站地址
该网站是全英文的,里面有100多道练习题,题解可以在Github上找到。

2.VLab Verilog OJ
网站地址
这是由中科大团队开发的Verilog在线评测系统,类似于软件编程的洛谷等网站。
其中每个题都会给出比较充分的知识点叙述,然后再让你动手编码,目的在于帮助大家学习Verilog。
有挺多的简单题,适合我这样的零基础菜鸟,但这个网站没有题解,网上只能查到前27题的题解。

其他网站:

书籍

  • 《EDA技术与Verilog HDL》 王金明编著 清华大学出版社
    这本书是基于Vivado平台的,讲了Vivado的基本操作、Verilog语法和一些实例,硬件用EGO1实验板。

  • 《自己动手写CPU》 雷思磊 电子工业出版社
    这本书是基于Modelsim平台的,主要是使用Verilog设计能运行mips32指令的处理器。

  • 《Vivado入门与FPGA设计实例》 廉玉欣 侯博雅编著 电子工业出版社
    这本书也是基于Vivado和EGO1的,介绍了不少组合逻辑和时序逻辑的基本器件设计,如加法器设计。

一、简介

Verilog HDL(Hardware Description Language)是IC设计者常用的两种HDL之一,另一种是VHDL,通过比较Verilog和C语言的区别可以更好地理解它。
Verilog和C语言的区别:

  1. 描述对象不同:
    Verilog语法和C接近,但C描述的是算法逻辑,依赖于硬件对其进行实现。而Verilog是硬件描述语言,描述的是硬件本身。
  2. 处理方式不同:
    C需要经过编译、汇编、链接来将代码转化为可由计算机执行的二进制代码,而Verilog则需要经过综合来生成描述门与门之间互联关系的网表文件。
  3. 执行方式不同:
    Verilog的部分描述语句可以并行执行,而C只能串行执行。

二、模块

2.1 模块是Verilog的设计实体

Verilog的基本设计思想是自顶向下(top-down),设计实体是模块,所有Verilog代码都将在模块内书写。
如下图所示,先定义顶层模块,分析顶层模块中所需的各个子模块,然后进一步对各个子模块进行分解和设计,最终可以将一个大的系统分解为多个子系统。
在Verilog中,成熟的、封装好的模块称为IP(intelligent property),调用已有IP的本质就是模块实例化。
在这里插入图片描述

2.2 模块声明

模块是Verilog的基本设计实体,模块声明的第一行指定了模块名称和端口列表,下面若干行指定了每个端口的方向、位宽、数据类型。
例如定义一个32位加法器模块:

module add32(in1,in2,out);
  input wire[31:0] in1,in2;
  output wire[31:0] out;
  assign out=in1+in2;
endmodule

其中in1,in2,out是该模块的三个端口,采用上述代码较为简洁,也可以采用如下定义:

module add32(
  input wire[31:0] in1,
  input wire[31:0] in2,
  output wire[31:0] out
);
  assign out=in1+in2;
endmodule

2.3 模块的实例化

模块实例化有两种方式,
一是按照名称:
.模板中端口名称 (要连接到端口的线名),
二是按照位置
和定义时一一对应
下面我们将在top_module顶层模块中实例化mod_a,如图所示:
在这里插入图片描述
其中mod_a实现的功能是将输入的a、b、c、d四个信号相与、相或,赋给out1和out2,mod_a的声明如下:

module mod_a(
    output out1, out2,
    input in1,in2,in3,in4
);
    assign out1 = in1 & in2 & in3 & in4;
    assign out2 = in1 | in2 | in3 | in4;   
endmodule

在top_module中两种实例化mod_a模块的代码如下:

module top_module( 
    input a, 
    input b, 
    input c,
    input d,
    output out1,
    output out2
);
    //基于端口位置的实例化如下
    mod_a  inst_1(
        out1,out2,a,b,c,d
    );
    //基于端口名称的实例化如下
    mod_a inst_2(
              .out1(out1),
              .out2(out2),
              .in1(a),
              .in2(b),
              .in3(c),
              .in4(d
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民真快落

我琢磨着也没人给我打赏呀。。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值