FPGA学习笔记(四)——Verilog基本语法

###### 【该随笔部分内容转载自小梅哥】 #########

  • 组合逻辑:    多路选择器、加法器、译码器、乘法器
  • 时序逻辑:    计数器、分频器、定时器、移位寄存器

一、Verilog文件的基本结构

1、模块声明     模块名    端口列表

2、端口类型、位宽定义

3、功能描述

//模块描述方式一(先列出端口,再描述端口类型)
//此方式虽然行数多,但是方便后面例化端口,推荐使用
module  name(
        ,
        ,
        //最后一个不需要“,”
);
    //端口类型描述
    //功能描述
endmoule

//模块描述方式二(端口列表和端口类型一起描述)
module  name(
   //端口列表 + 类型描述
     );
    //功能描述
endmoule

二、数据类型

  • 线与型wire(默认值z—高阻)     寄存器型reg

注:存储器型(memory)

memory型数据常用于寄存器文件、ROM和RAM建模等,是寄存器型的二维数组形式,它是将reg型变量进行地址扩展而得到

  

//一般格式:
reg[n-1 : 0] 存储器名[N-1 : 0];
//定义位宽为n,深度为N的寄存器组
  • parameter型(常量参数)

三、数据表示

assign x = 4‘b1001;      //二进制

assign x = 4‘d9;          //十进制

assign x = 4‘hc;          //十六进制

四、运算

 1、加(+)——加法器

减(-) ——减法器(逆运算)

乘(*) ——乘法器

除(/) ——除法器ip核(尽量不用)

 2、 逻辑运算

逻辑与&&,或||,非!(只有一位

按位与&、或|、非~、异或^、同或~^

五、组合逻辑电路功能的描述

  设计方法:    分析真值表规律

  两种描述方式:

    • 方式1:用assign描述,用阻塞赋值=
    • 方式2:用[email protected](*)描述,用非阻塞赋值<=

 选择功能的三种描述方式:

    • 方式1:三目运算符 ? :  ;
    • 方式2:if...else if.....else(分级)
    • 方式3:switch...case....default...(并行)

  例1.mux2二选一数据选择器

//方式1(先列出端口,后定义端口属性)
module mux2(
    a,
    b,
    sel,
    out
);
    //端口属性定义(输入/输出,位宽)
    input [7:0]a;
    input [7:0]b;
    input sel;        //sel = 0,out输出a
    output [7:0]out; //位宽8位
    //功能描述
    //阻塞赋值语句
    assign out = (sel == 0)?a:b;
    //assign out = (!sel)?a:b;
    //assign out = sel?b:a;
endmodule
//方式2(在声明端口的同时定义属性)
module mux2(
        //端口属性定义
    input [7:0]a,
    input [7:0]b,
    input sel,
    output [7:0]out  //此处没有分号
);
    //功能描述
    //阻塞赋值语句
    assign out = (sel == 0)?a:b;
endmodule

   例2.三态门控制

//三态门控制
    assign oe = sel;
    assign io = oe?out[0]:1‘bz;    //z高阻态(输入)

   例3.加法器

     1、半加器halfadder

    2、全加器adder

      设计方式1:采用原理图方式,由两个半加器和一个或门组成

      设计方式2:采用verilog直接描述(如下图)

六、时序逻辑电路设计

  用[email protected](posedge clk)描述

       时序逻辑电路的基础——计数器

  例1.四位计数器(同步使能、异步复位)

module counter(clk,en,rst);
    input clk;    //时钟信号
    input en;     //使能信号
    input rst;    //清零信号

    reg [3:0]cnt;        //4位寄存器,用于计数

    //同步清零和异步清零的问题
    always@(posedge clk,negedge rst)
    if(!rst)
        cnt <= 4‘d0;
    else if(en)begin
        cnt <= cnt + 1‘b1;

    else 

        cnt <= cnt;
    end
endmodule

 注:计数器只是基本电路,比如分频器、定时器、巴克码序列发生器在计数器基本电路上设计即可;

例2.基本分频操作——分频器(闪烁灯)

例3.基本移位操作——verilog位操作(流水灯)

      //1.取某一位直接操作
      wire [2:0]m;
      assign m = out[5:3];

        //2.循环移位(移位寄存器)
        reg [7:0] shift_a;
        always@(posedge clk)
            shift_a <= {shifta[0],shift[7:1]};

        reg [7:0] shift_a;
        wire data;
        always@(posedge clk)
          shift_a <= {data,shift[7:1]};

        reg [7:0] shift_a;
        wire data;
        always@(posedge clk)
          shift_a <= {shift[7:1],data};

       //3、拼接
        wire [3:0]x;
        wire [3:0]y;
        wire [7:0]z;
        wire [31:0]n;

        assign z = {x,y};
        assign n = {x,7{x}};

原文地址:https://www.cnblogs.com/Mculover666/p/9066055.html

时间: 2024-08-27 06:10:54

FPGA学习笔记(四)——Verilog基本语法的相关文章

Java基础学习笔记四 Java基础语法

数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻烦. 数组的概述 数组是指一组数据的集合,数组中的每个数据被称作元素.在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致. 数组的定义 格式: 数据类型[] 数组名 = new 数据类型[元素个数或数组长度]; 举例:int[] x = new int[100]; 要点说明 数据类

JSP学习笔记四:JSP语法之内置对象

JSP有9个内置对象,分别是request(请求对象).response(响应对象). pageContext(页面上下文对象).session(会话对象).application(应用程序对象).out(输出对象).config(配置对象).page(页面对象)和exception(例外对象). 那么,这些对象是怎么来的呢?我们看一下转译文件. public void _jspService(final javax.servlet.http.HttpServletRequest request

【JavaWeb】学习笔记四 JSP基础语法

---恢复内容开始--- 一.JSP页面元素的组成 指令 表达式 小脚本 声明 注释 静态内容 二.JSP指令 1.page指令 ---恢复内容结束---

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

WEB前端学习笔记 四

接上一篇,web学习笔记 四,在此感谢您对此篇笔记的认可,但转发时请注明文章出自网知博学. 2.0  html的语法格式 html的标签要写在尖括号中 :<> 在在英文输入法状态下,按住shift键然后再按它左侧的尖括号就可了, 先学习一个简单的h1标签,是个标题标签,在html中这样写: <h1>我在h1标签中,我就是标题</h1> 那么h1标签中所包裹的文字,就标记成标题了.通过浏览器的解析后在页面上显示出来的效果就是字体加粗,加黑,和word中的标题性质一样! 大

laravel3学习笔记(四)

原作者博客:ieqi.net ==================================================================================================== 视图 Laravel3遵循MVC模式,视图层负责将控制器处理好的数据展示出来,view层相关代码文件保存在application/views目录下,并且以php结尾. 因为PHP本身就可以和HTML混写的特性,一般而言,PHP框架的View层某种程度上也可以作为模板使

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten