Verilog学习笔记

news/2024/5/3 4:13:10/文章来源:https://blog.csdn.net/qq_27148893/article/details/127086221

sky视频笔记:数字逻辑回顾&Hello World_哔哩哔哩_bilibili

一、数电基础

1.组合逻辑

  • 电路逻辑输出值只和当前的输入有关
  • 比如:AND/OR/XOR/NAND/NOR/MUX/Adder/Multiplier

2.时序逻辑

  • 电路逻辑输出值跟当前的输入和电路的当前状态有关
  • 保存当前状态的器件,如:触发器Flip-Flop,锁存器Latch 二者区别: Flip-Flop和Latch - 知乎

3.逻辑值

  • 逻辑状态

  • 逻辑 0:表示低电平,也就对应我们电路 GND;
    逻辑 1:表示高电平,也就是对应我们电路的 VCC;
    逻辑 X:表示未知,有可能是高电平,也有可能是低电平,仿真发生了不能解决的逻辑冲突
    逻辑 Z:表示高阻态,外部没有激励信号是一个悬空状态。相当于啥也没接,可以上拉或者下拉。

  • 对于没有进行初始化的信号,一般处于不确定态(x),高阻态表示该信号没有被其他信号驱动,经常用于有多个驱动源的总线型数据上。

  • 对于高阻态的理解:Verilog中三态门(高阻态)的理解与例子_CLL_caicai的博客-CSDN博客_verilog 高阻态

  • 反相器(非门)

  • 与门/或门/异或门

二、Verilog介绍

1.概述

  • 是一种硬件描述语言HDL,不是设计语言,先有电路,后有程序
  • 类似的有VHDL、SystemVerilog、Chisel(未来的方向,目前不好说)
  • 推荐书:国外的Verilog HDL 高级数字设计(第二版)—Miachael,D.Cilette和国内Verilog数字系统设计教程(第4版)夏宇闻。

2.可综合&不可综合

  • 可综合描述:综合tool能够把Verilog描述转化(Comlile)为基本的数字电路底层cell(与或非门,寄存器等)

    例如:assign y = a & b;—>

  • 不可综合描述:不能把Verilog描述转化为基本的数字电路底层cell的描述

    例如:$display("Hello world.\n");这种是需要串口。

3.Verilog设计仿真与实现

  • 何为仿真?

    从仿真器的角度理解Verilog语言:从仿真器的角度理解Verilog语言 - 知乎

  • 常用的仿真工具(所有verilog描述)

    • modelsim/Questasim (Mentor)
    • VCS                            (Synopsys)
    • NC-verilog                  (Candence)
  • Verilog设计的物理实现(可综合verilog描述)

    • 综合后在IC芯片上实现
    • 综合后在FPGA上实现

4.数字电路设计方法学

  • Top-Down:从顶层结构,算法/协议上开始。享下逐步划分功能模块;再细分各功能模块的功能和IO

 

三.Verilog语法介绍

1.标识符

  • 首字母必须是字母/下划线
  • 区分大小写
  • 信号名字和信号功能对应

2.关键字

完整关键字定义,见verilog标准:IEEE Std 1364-2001

Verilog标识符与关键字_FPGA&IC设计导师的博客-CSDN博客_verilog标识符

initial一般是不可综合的,always是可综合的

3.数据物理类型

  • “线”性数据:用于连续赋值语句(assign)描述组合逻辑或module间的信号连接线
    • wire:线性,可综合
      • wire a; //1bit位宽
      • assign a=1'b0; //连续赋值语句
    • tri0/tri1:带下拉/上拉电阻的线性,没有驱动时,会有默认值0/1,一半可综合代码不用。
  • 寄存器类型:用于过程赋值语句(always,initial)描述组合逻辑/时序逻辑
    • reg d1;
    • d1<=din;//时序逻辑 d1 =din;//组合逻辑
    • 除了wire/tri0/tri1外的其他数据类型,基本都属于寄存器类型,只能用于过程赋值语句;
      • real 类似于float
      • interger //等价reg [31:0]
      • time/realtime

4.数据类型

  • 一维标量类型(常量)
    • 整数型(需要明确指定数据位宽):位宽代表转化为二进制数的位宽,达不到高位补0,多的,高位截断

      16'd100 //10进制表示的“100”

      16'h64 //16进制表示的“100”

      16'b0110_0100 //2进制表示的“100”

    • 实数型(可综合verilog不用)

    • 字符型(每个字符按8bit ASCII码的整型存储)

      “verilog” //占56bit

  • 一维标量类型(变量)
    • 整数型(需要明确指定数据位宽

 

  •          实数型(目前不可综合)
  • 多维标量类型(变量)

{}是用来合并的

  • 片选

在 assign 赋值操作中,如果等号左右两侧信号的位宽不同,那么就会进行截断或者补零操作。

  • 左侧信号位宽大于右侧信号位宽,右值的低位赋予左值对应的低位,左值高位的部分赋零
  • 左侧信号位宽小于右侧信号位宽,右值的低位赋予左值对应的低位,右值高位的部分直接被截断。即保留右值的低位。

使用 [] 可以对信号进行片选,选择信号中特定几位比特,以下是一些片选的例子。

w[3:0]      // Only the lower 4 bits of w
x[1]        // The lowest bit of x
x[1:1]      // ...also the lowest bit of x
z[-1:-2]    // Z 最低两位
b[3:0]      // 如果 b 在声明时 声明为 wire [0:3] b;则不能使用 b [3:0]进行选择
b[0:3]      // b的高四位.
assign w[3:0] = b[0:3];    // 将 b 的高位赋予 w 的低位 w[3]=b[0], w[2]=b[1], etc.

5. 运算符

  • 按bit位逻辑操作:&(and), |(or), ^(xor),~(inv)
  • 按整体运算:&&,||,!,==,! =, 返回值为0/1
  • 条件运算符(三目运算符) 描述MUX ?:
  • bit位选择[]/拼接{} a[0 +:8] 从0开始向上取8位,等价于a[7:0]
  • 算术运算符:+,-,*,<,>,< =,> =,**/,% (**慎用)

6.条件语句

  • if-else
if beginend
  • case/casez/casex(casez/casex非必要不用)
case(*)
3'b001: out = 0;
...
end case

7.module 功能模块构建

  • 对于需要instance的模块,input 只能是wire,output可以是wire/reg

8.杂项

四、Verilog描述组合逻辑

1.MUX(多路选择器)

module mux4to1(s,d,y);input wire[1:0] s;input wire[3:0] d;output reg y;always @(*) begincase (s[1:0])2'd0:y = d[0];2'd1:y = d[1]; 2'd2:y = d[2];  default: y = d[3];endcaseendendmodule

对应的电路图如下:

2.带有优先级的多路选择器(4选1)

module mux4to1(din,d,dout);input wire[1:0] din;input wire[3:0] d;output reg dout;always @(*) beginif(din[2])dout = d2;else if(din[1])dout = d1;else if(din[0])dout = d0;else dout= d3;endendmodule

3.译码器

  • N-2^N译码器

    独热码:每次只有一位输出。

  • 3-8译码器

module dec_3to8(din ,dout);input wire [2:0] din;ouput reg  [7:0] dout;always @(*) begincase(din)3'b000:dout = 8'h01;3'b001:dout = 8'h02;3'b010:dout = 8'h04;3'b011:dout = 8'h08;3'b100:dout = 8'h10;3'b101:dout = 8'h20;3'b110:dout = 8'h40;3'b111:dout = 8'h80;endcaseend
endmodule

4.可综合常用语法:组合逻辑

//实现输出a+b-c
wire clk,rstn;
wire [15:0]a,b,c;
wire [17:0]out0;
reg [17:0[ out1;assign out0 = {2'b0,a}+{2'b0,b}-{2'b0,c}; //连续赋值语句always @(*) begin   //过程赋值语句
//always @(a or b or c) beginout1 = {2'b0,a}+{2'b0,b}-{2'b0,c};
end

  • CSA(Carry Save Adder,进位保存加法器)

【HDL系列】进位保存加法器原理与设计 - 知乎

5.有符号数符号位扩展

  • 有符号数符号位扩展

工具会默认把wire数当作有符号数

wire [15:0] a,b; //singned number
wire [16:0] out0;
wire [16:0] out1;assign out0 = {a[15],a}-{b[15],b}; //
assign out1 = a-b;                 //这种会出错

五、Verilog描述时序逻辑

  • 可综合常用语法:时序逻辑
//实现输出a+b-c
wire clk,rstn;
wire [15:0]a,b,c;
reg [17:0[ out2,out3; //1.同步复位
always @(posedge clk) beginif(!rstn)out2 <= 'd0;elseout2 <= {2'b0,a}+{2'b0,b}-{2'b0,c};
end//2.异步复位
always @(posedge clk or negedge rstn) beginif(rstn)out3 <= {2'b0,a}+{2'b0,b}-{2'b0,c};elseout3 <= 'd0;
end

[FPGA复位——同步复位和异步复位]https://www.jianshu.com/p/f2f78b4be64c

  • 同步复位等效电路

    顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。

  • 异步复位等效电路

    它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。

六、Verilog语句执行顺序

  • 连续赋值(assign)语句块,过程赋值(always,initial)语句块之间是并行执行的(只要触发条件满足,就开始执行)
连续赋值(assign x=y;):不能在过程块内使用;
过程阻塞性赋值(x=y;):只能在过程块中使用;
过程费阻塞性复制(x<=y):只能在过程块内使用。
  • 组合逻辑用阻塞赋值,时序逻辑用非阻塞赋值,同一个模块中不要既用阻塞又用非阻塞

1.initial、always、assign

  • initial

    只能执行一次,在仿真一开始就执行,begin...end之间是顺序执行(非阻塞赋值除外)

initialbegin语句1;语句2;......语句n;
end
  • always

    always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。(非阻塞赋值除外)

    对于硬件综合来说,存在两种always块:

    组合逻辑:`always @(*)`时序逻辑:`always @(posedge clk)`
    

    时序always块也会像组合always块一样生成一系列的组合电路,但同时在组合逻辑的输出生成了一组触发器(或寄存器)。该输出在下一个时钟上升沿(posedge clk)后可见,而不是之前的立即可见。

always @ (event)[statement]always @ (event) begin[multiple statements]
end
  • assign

    assign相当于连线,一般是将一个变量的值不间断地赋值给另一个变量,就像把这两个变量连在一起,所以习惯性的当做连线用,比如把一个模块的输出给另一个模块当输入。只能用于阻塞赋值。

    要更好的把握assign的使用,Verilog中有几个要点需要深入理解和掌握: - 在Verilog module中的所有过程块(如initial块和always块)、连续赋值语句(如assign语句)和实例引用都是并行的。在同一module中这三者出现的先后顺序没有关系。 - 只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于module的功能定义部分。 - 连续赋值assign语句独立于过程块,所以不能在always过程块中使用assign语句

2.非阻塞赋值的执行顺序

  • 所有过程赋值(always,initial)语句块中的非阻塞赋值(none blocking assignment:< =)是完全同时执行的
b<=a;
c<=b;
/*
clk0 b0=初值 c0也等于初值
clk1 b1=a c1=b0
clk2 b2=a c2=b1=a
*/

3.阻塞赋值的执行顺序

  • 在同一个过程赋值(always,initial)语句块中,阻塞赋值(blocking assignment:=)是顺序执行的。

  • 在同一个过程赋值(always,initial)语句块中,阻塞赋值的循序语法没有定义。

4.可综合code建议

  • 描述组合逻辑使用"="赋值;
  • 描述时序逻辑(DFF)使用"< ="赋值
  • #1(delay)可以用,但是综合会被忽略
  • 不要在多个语句块中,对同一个变量赋值
  • 在一个always块内,该块的一次触发,对同一个信号最多只赋值一次

七.实际用处的电路

1.Edge检测

  • 上升沿检测

    • 波形图:
    • 电路结构:

    • 代码

wire clk,rstn;
wire din;
reg  din_dly;
wire pulse;assign pulse = din & (!din_dly);always @(posedge clk or negedge rstn)
if(!rstn)din_dly <= 1'b0;
elsedin_dly <= din;

2.全加器

assign sum = a ^ b ^ cin;assign cout = a&b | a&cin | b&cin;<--> 
{cout,sum} = a + b + cin;

常见的错误来源

1.如何避免引入锁存器

在设计电路时,必须首先具体考虑电路:

1、我想实现一个逻辑门;

2、我想实现一个具有输入并产生输出的组合逻辑块;

3、我想实现一组组合逻辑,紧接着一组触发器。

不要上来就写代码,这样往往与你想象的电路相差很远。

除了你指定的情况以外,会发生些什么,答案是什么也不会发生,输出保持不变。而这往往就导致了电路的错误,所以说语法正确的代码不一定能产生合理的电路(组合逻辑+触发器)。

输出保持不变,这就意味着电路需要记住当前状态,从而产生锁存器。组合逻辑(比如逻辑门)不能记住任何状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_15709.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python生成Hilbert矩阵

代码放在了最后&#xff0c;前面是解题思路 目录 1.什么是Hilbert矩阵矩阵&#xff1a; 2.找规律 1.第一种思路&#xff1a;先从值出发&#xff08;找规律&#xff09; 2.第二种思路&#xff1a;先从下标索引出发&#xff08;找规律&#xff09; 三、代码展示 四、输出展…

WPF 界面打不开提示 System.ArithmeticException Overflow or underflow in the arithmetic operation 异常

本文告诉大家如何解决界面打不开,抛出 System.ArithmeticException: Overflow or underflow in the arithmetic operation 异常的修复方法本文告诉大家如何解决界面打不开,抛出 System.ArithmeticException: Overflow or underflow in the arithmetic operation 异常的修复方…

某IOT设备漏洞分析

申明&#xff1a;本文章所分享内容仅用于网络安全技术讨论&#xff0c;切勿用于违法途径&#xff0c;所有渗透都需获取授权&#xff0c;违者后果自行承担&#xff0c;与本文及作者无关&#xff0c;请谨记守法. 设备名称: DLINK DIR-818l 固件包: d-link DIR818L_FW105b01 A1 环…

Rust学习笔记:简单练习

最近一个月比较闲&#xff0c;忙碌大半年终于有自己短暂的休息时间。如果不写大的程序&#xff0c;偶尔写写一些小东西&#xff0c;其实用起来也很自在&#xff0c;前提是如果没有太多生活压力。看电视变成奢侈的事情。有时候&#xff0c;我会羡慕老外享受福利待遇非常好&#…

javaweb|JSTL的下载、配置与原理,解决uri导入时报错的问题

今天在配置jstl时&#xff0c;发现在引入uri时出现了问题&#xff0c;地址直接报红。在尝试了几种方法后&#xff0c;最后成功解决了。 JSTL一、下载1、https://tomcat.apache.org/2、找到taglib标准库3、下载前2个jar包二、配置1、放入web-inf的lib文件夹里2、将Jar包放入tomc…

windows下 解决PHP-CGI 进程崩溃502

PHP是世界上最好的语言&#xff0c;但需要PHP解析器&#xff1b;Apachephp,需要通过mod_php.so和php相连&#xff1b;nginxphp 需要转发给 cgi程序 关于FastCGI&#xff1a; 全称 FastCGI Process Manager&#xff0c;是一种进程管理器&#xff0c;管理 cgi&#xff0c;市面上…

1474_AURIX TC275 WDT的运行模式

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 1. 前面的内容中其实已经看到了&#xff0c;这个看门狗的时钟其实是固定的&#xff0c;SPB的时钟。这样&#xff0c;后面了解时钟树的时候需要注意一下。其实&#xff0c;在功能安全的失效…

ES6--》一文搞懂JS中的Promise

目录 Promise Promise使用 Promise封装Ajax请求 Promise封装读取文件 Promise.prototype.then 方法 Promise多文件读取 Promise.prototype.catch() Promise.prototype.finally() Promise.all() Promise.race() Promise.allSettled() Pomise.any() Promise.resolve…

微信小程序开发入门与实战(Behaviors使用)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

【原创】基于JavaWeb的社区疫情防控管理系统(疫情防控管理系统毕业设计)

项目介绍&#xff1a;后端采用JspServlet。前端使用的是Bootstrap的一个网站模板。开发一个在线的社区疫情防控管理系统。从角色的划分&#xff0c;包括用户、社管员、管理员。功能模块上包括了社区公告发布、高风险地区记录、地区感染信息管理、社区出入登记管理、行程信息管理…

关于maven生命周期的理解

晚上有点无聊&#xff0c;看到了一些东西引发了自己的思路&#xff0c;就想将maven的一些东西总结总结&#xff0c;有从网上抄的&#xff0c;也有自己的思路。 一、生命周期是指什么&#xff08;lifecycle&#xff09; Maven的生命周期就是对所有的构建过程进行抽象和统一。包…

Posix与System V IPC

Posix与System V IPC一、Posix IPC1.概述2.IPC名字3.px_ipc_name函数3.创建与打开IPC通道4.IPC权限二、System V IPC1.概述2.key_t键和ftok函数3.ipc_perm结构4.创建与打开IPC通道5.IPC权限6.标识符重用7.ipcs和ipcrm程序8.内核限制一、Posix IPC 1.概述 三种类型的IPC合称为…

Redux的基本使用过程详解

文章目录Redux的使用过程Redux测试项目的搭建Redux的基本使用步骤Redux目录的结构划分React的三大原则Redux的使用过程 Redux测试项目的搭建 1.创建一个新的项目文件夹:learn-redux # 执行初始化操作 npm init -y或yarn init -y # 安装redux:npm install redux --save或yarn …

自定义View 布局过程(Layout)

目录一、作用二、layout过程详解2.1单一View的layout过程具体使用具体流程源码分析总结2.2ViewGroup的layout过程具体使用具体流程源码分析总结三、细节问题&#xff1a;getWidth() &#xff08; getHeight()&#xff09;与 getMeasuredWidth() &#xff08;getMeasuredHeight(…

Java高级——编译JDK

编译JDKJDK是什么&#xff1f;编译环境搭建JDK下载编译参数编译在IDE中调试源码JDK是什么&#xff1f; Java Development Kit&#xff0c;用于执行和开发java程序 编译环境搭建 本文采用Ubantu 18.04 执行以下命令安装依赖 apt-get install build-essential apt-get instal…

Transformer

参考 https://www.ylkz.life/deeplearning/p12158901/ https://zhuanlan.zhihu.com/p/396221959 模型结构 Input Embedding 将文本中词汇的数字表示转变为向量表示, 希望得到其在高维空间中的特征表示向量。 # 导入必备的工具包 import torch import torch.nn as nn import …

Qt5开发从入门到精通——第九篇一节( Qt5 文件及磁盘处理—— 读写文本文件)

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 欢迎小伙伴的点评✨✨&#xff0c;相互学习c/c应用开发。&#x1f373;&#x1f373;&#x1f373; 博主&#x1f9d1;&#x1f9d1; 本着开源的精神交流Qt开发的经验、将持续更新续章&#xff0c;为社区贡献博主自身的开源精…

esp32-C3 CAN接口使用

esp32-C3 CAN接口使用功能概述CAN协议关注点接收过滤器单过滤器模式双过滤器模式关键函数说明配置和安装驱动获取TWAI状态信息发送/接收消息使用示例CAN控制器自回环测试CAN收发带过滤测试功能概述 ESP32-C3具有1个CAN控制器支持以下特性&#xff1a; 兼容ISO 11898-1协议(CA…

伟大的micropython smartconfig 配网它来了!!!

我这其实只是实验和搬运&#xff0c;还是感谢伟大的walkline群主&#xff0c;他弄好的&#xff0c;我只是负责搬运发布给新手看。 之前一大堆人问我配网的事儿&#xff0c;输入下wifi名称密码这么麻烦吗&#xff0c;好吧&#xff0c;有求必应&#xff0c;之前的配网是通过ap模式…

PICO高管专访:关于PICO 4硬件、内容、定价、海外布局的一切解答

PICO 4昨天正式在国内发布&#xff0c;简单来说这是一款相对均衡的VR一体机&#xff0c;在硬件素质、内容生态建设上都可圈可点&#xff0c;对于国内还未入手VR的朋友们来说是非常好的选择。相关阅读&#xff1a;《PICO 4评测&#xff1a;Pancake光学新标杆&#xff0c;VR娱乐V…