1.开发环境搭建

需要使用的软件:

  • QuartusII
  • ModelSim
  • Visio
  • Notepad++

2.初识Verilog

2.1 Verilog HDL简介

  • Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图\逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能
  • Verilog语法自由,易学易用,适用于算法级,门级设计,代码简介,发展较快
  • Verilog从C语言发展而来的

2.2 逻辑值

  • 0 -- 逻辑低电平,条件为假
  • 1 -- 逻辑高电平,条件为真
  • z -- 高阻态,无驱动
  • x -- 未知逻辑电平
  • 实际电路中存在0,1,z,亚稳态

2.3 关键字

module example(
input wire sys_rst_n,//输入信号
inout wire sda,//输入输出信号,基本不用 output wire po_flag // 输出信号
);
// 只有输入信号是不能直接得到输出信号的
// 需要通过一些数据和参数对输入信号进行处理,得到输出信号
// 一般需要对输入信号进行处理之后得到输出信号 // 线网型变量 -- wire可以被看作是物理连接 -- 被综合成物理连线
wire [0:0] flag; // 寄存器型变量 -- 具有对某一时间点的状态进行保持的功能
// 可综合电路中被综合成寄存器
reg [7:0] cnt; // 参数的定义
// parameter 可以在顶层模块通过实例化对参数进行修改
parameter CNT_MAX = 100; //localparam -- 只用在模块内部,不能在实例化的时候进行修改
localparam CNT_MAX = 100; // 模块的实例化
example
#(
.CNT_MAX (8'd100) // 实例化时参数可以修改
)
example_inst
(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.po_flag (po_flag)
); /*
常量
表示方法: [换算为二进制数之后的位宽]'[进制符号][与数值对应的进制数]
8'd171
d -- 十进制
b -- 二进制
h -- 十六进制 不写位宽 -- verilog会自动进行匹配
总位宽大于实际位宽,自动补0,总位宽小于实际位宽,则自动截断左边超出的位数
d'7 8'd7 -- 8'b0000_0111 前面补5个0
2'd7 换算位二进制是 2'b11 (7换成二进制是111),总长度位2位,所以截掉左侧的部分
直接写参数 100 ,表示位宽为32bit的十进制数100
*/ // 赋值方式
// 阻塞赋值 =
// 阻塞赋值可以看作是顺序执行,每条语句执行完成之后才能执行下一条语句
a = 1;
b = 2;
c = 3;
begin
a = b;
c = a;
end
a = 2;
b = 2;
c = 2;
// 非阻塞赋值 <= 并行执行
a = 1;
b = 2;
c = 3;
begin
a <= b; // 同一时刻,这两条语句是同时执行的
c <= a;
end
a = 2;
b = 2;
c = 1; // always语句
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 8'b0; // 进行寄存器复位
else if (cnt == CNT_MAX) // 寄存器中的值记到最大的时候,维持最大值
cnt <= CNT_MAX;
else
cnt <= cnt + 8'd1; // 每个周期都加1 // assign语句
assign po_flag = (cnt == CNT_MAX) ? 1'b1 : 1'b0;
endmoudle

2.4 算术运算符

+
-
* -- 一般不用
/ -- 一般不用
% -- 求余数,两边都为整型数据

2.5 归约运算符\按位运算符

  • & -- 既可以作为单目运算符又可以作为双目运算符
// & 作为单目运算符,&m,将m的所有bit相与,得到结果是1bit
4'b1111 = 1&1&1&1 = 1'b1
4'b1101 = 1&1&0&1 = 1'b0 // & 作为双目运算符表示按位与,m&n,是将m的每个bit与n的每个bit相与,在运算的时候保证m和n的bit数相等,最后结果位数和m(n)的bit数相等
4'b1010&4'b0101 = 4'b0000
  • &,^,^,|,~| -- 这些运算符都有相同的看法

2.6 逻辑运算符

  • &&/||/! -- 与或非三种逻辑运算,返回值为0或者是1
  • 逻辑运算符两边非0位真,0为假
a = 4'ha
b = 4'd0
c = a && b // c的值为0

2.7 关系运算符

a < b
a > b
a <= b
a >= b

2.8 移位运算符

  • 移位运算符是二元运算符,<<和>>,将运算符左边的数左移或者是右移指定的位数,用0来补充空闲位
b <= a << 1; // a的每一位都左移一位,结果赋值给b
b <= a >> 1; // a的没一位都右移一位,结果赋值给b
  • 在应用移位运算符的时候一定要注意他的特性:就是空闲位使用0来补充,也就是说,一个二进制数不管原来的数值是多少,只要一直移位,最终都会变为0
4'b1000 >> 3;  // 4'b0001
4'b1000 >> 4; // 4'b0000
  • 移位运算符可以代替乘法和除法,左移一位可以看成是乘2,右移一位可以看成是除2,但是要注意位拓展

2.9 拼接运算符

  • {,} -- 位拼接运算符
a = 8'b1011_1111;
b = 3'b011;
c = 5'b11011;
{a,b,c} ; // 拼接成16bit

2.10 三元运算符

[表达式1]?表达式2:表达式3
a = 6;
b = 7;
c = (a>b)?a:b;

2.11 优先级

  • 一元运算符>二元运算符>三元运算符
  • != > 按位运算 > && > || > 条件运算
  • 归约运算符 > 算术运算符 > 移位运算符 > 关系运算符 > == 和 !=
  • 使用()提升优先级

2.12 if-else语句

if(表达式)   // 这种写法在always语句块产生组合逻辑的时候中会产生latch,不推荐使用
语句块; if(表达式)
语句块1;
else if(表达式2)
语句块2;
....
else
语句; // 这种是最常用的写法

2.12 case语句

switch(表达式)
case value1 : 语句1;
case value2 : 语句2;
....
default: 语句;

2.13 系统函数

`timescale 1ns/1ns  // 时间尺度预编译指令 时间单位/时间精度
时间单位和时间精度有由1,10及100以及s,ms,ns,us,ps,fs组成
时间单位:定义仿真过程中所有与时间相关量的单位
仿真中使用#数字表示延迟相应的时间单位的时间,例如#10表示延时10个时间单位,即10ns 时间精度:决定时间相关量的精度及仿真显示的最小单位
`timescale 1ns/10ps // 精度0.01, #10.11 表示延迟10110ps `timescale 100ps/1ns // 错误,时间单位不能比时间精度小
// 主要的函数,在支持verilog语法的编译器中都会显示为高亮的关键字
$display //打印信息,自动换行
$write //打印信息
$strobe //打印信息,自动换行,最后执行
$monitor //检测变量
$stop //暂停仿真
$finish //结束仿真
$time //时间函数
$random //随机函数
$readmemb //读取文件的函数

$display()

$display(); //  输出,打印信息
$display("%b+%b = %d",a,b,c);
// %d %D -- 十进制
// %o %O -- 八进制
// %b %B -- 二进制
// %d %D -- 十六进制
// 不指定进制,默认为十进制数
`timescale 1ns/1ns

module tb_test();
reg [3:0] a;
reg [3:0] b;
reg [3:0] c; // initial只在仿真中使用,是不可综合的
// 仿真开始,只执行一次
initial begin
$display("Hello");
$display("EmbedFire");
a = 4'd5;
b = 4'd6;
c = a + b;
#100;
$display("%b + %b = %d",a,b,c); end
endmodule result:
Hello
EmbedFire
010 + 0110 = 11

$write()

  • write() -- 输出打印信息 -- 函数不会自动进行换行
`timescale 1ns/1ns

module tb_test();
reg [3:0] a;
reg [3:0] b;
reg [3:0] c; // initial只在仿真中使用,是不可综合的
// 仿真开始,只执行一次
initial begin
$write("Hello");
$write("EmbedFire");
a = 4'd5;
b = 4'd6;
c = a + b;
#100;
$write("%b + %b = %d",a,b,c); end
endmodule

$strobe()

  • 输出打印函数 -- 在最后进行执行
`timescale 1ns/1ns

module tb_test();
reg [3:0] a;
reg [3:0] b;
reg [3:0] c; // initial只在仿真中使用,是不可综合的
// 仿真开始,只执行一次
initial begin
$strobe("strobe:Hello"); // 写在最前面,但是执行在最后
a = 4'd5;
$display("EmbedFire");
$display("display:%b + %b = %d",a,b,c); // 在执行这条语句的时候b,c都没有进行赋值
// 所以b,c未知的x
b = 4'd6;
c = a + b;
#100; end
endmodule

$monitor()

  • 检测变量,只要打印的变量发生了变化,就会执行一次
`timescale 1ns/1ns

module tb_test();

	reg [3:0] a;
reg [3:0] b;
reg [3:0] c; initial begin
a = 4'd5;
#100;
b = 4'd6;
#100;
c = a + b;
end initial begin
$monitor("%b + %b = %d",a,b,c);
end
endmodule

$stop

  • 暂停执行仿真
`timescale 1ns/1ns

module tb_test();
initial begin
$display("hello");
$display("EmbedFire");
#100;
$display("Stop Simulation");
$stop;
#100;
$display("Finish Simulation");
$finish; // 结束仿真
end
endmodule

$time

`timescale 1ns/1ns

module tb_test();
reg [3:0] a;
always #10 a = $random;
initial $monitor("a = %d @time %d",a,$time);
endmodule

$readmemb 和 $readmemh

  • $readmemb -- 用于读取二进制文件函数
  • $readmemh -- 用于读取十六进制文件函数
$readmemb("数据文件名",存储器名);
$readmemh("数据文件名",存储器名);
`timescale 1ns/1ns

module tb_test();

  integer i;
reg [7:0] a [20:0]; // a 为宽度为8bit,深度为21bit的存储器 initial begin
$readmemb("EmbedFire.txt",a);
for(i = 0;i<=20;i=i+1) begin
#10;
$write("%s",a[i]); // Welcome to EmbedFire!
end
end
endmodule

读取的文件

02-初识Verilog的更多相关文章

  1. 前端知识(一)02 初识 Node.js-谷粒学院

    目录 初识Node.js 一.Node.js的概念 1.JavaScript引擎 2.什么是Node.js 3.Node.js有什么用 二.BFF 1.BFF 解决什么问题 2.BFF是什么 三.安装 ...

  2. SpringBoot 02: 初识SpringBoot

    1. SpringBoot 产生原因 spring, springmvc框架使用上的一些缺点: 需要使用的大量的配置文件 还需要配置各种对象 需要把使用的对象放入到spring容器中才能使用对象 需要 ...

  3. 8.3 mysql 表操作

    库操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等    performance_sch ...

  4. 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字

    081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...

  5. 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则

    080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...

  6. 079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象

    079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象 本文知识点:实例化对象 说明:因为时间紧张,本人写博客过程中只是对知 ...

  7. 078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类

    078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类 本文知识点:创建类 说明:因为时间紧张,本人写博客过程中只是对知识点的关 ...

  8. 077 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 02 类和对象

    077 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 02 类和对象 本文知识点:类和对象 说明:因为时间紧张,本人写博客过程中只是对知识点 ...

  9. 076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学

    076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学 本文知识点:Java面向对象导学 说明:因为时间紧张,本人 ...

  10. 002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介

    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介 学习Java的基础语法 Java是一门编程语言,学习的逻辑其实和现实世界的语言是一样的,需要了 ...

随机推荐

  1. 局部异常因子(Local Outlier Factor, LOF)算法详解及实验

    局部异常因子(Local Outlier Factor, LOF)通过计算样本点的局部相对密度来衡量这个样本点的异常情况,可以算是一类无监督学习算法.下面首先对算法的进行介绍,然后进行实验. LOF算 ...

  2. Javaweb知识复习--MyBatis+Mapper代理开发

    一种持久层框架,主要用于简化JDBC MyBatis应用步骤 1.在数据库里面创建一个表 2.创建模块,导入坐标 就是新建一个Maven项目,在pom.xml里面导入mybatis相应导包依赖代码: ...

  3. 一起听、一起看、一起唱掀起Z世代青年社交浪潮

    6月5日,声网Agora 联合人人都是产品经理在成都举办了主题为"社交泛娱乐APP运营增长力和新玩法解析"的沙龙.现场围绕社交泛娱乐新玩法解析以及出海的新机遇.支付痛点.增长.运营 ...

  4. smart rtmpd 服务器配置文件说明及优化方法介绍

    ---------------------------------------------------------------------------------------------------- ...

  5. FastDFS 使用流程

    一.什么是FastDFS? FastDFS 是用 C 语言编写的一款开源的分布式文件系统,对文件进行管理,主要功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡 ...

  6. 集合-ArrayList 源码分析

    1.概述 ArrayList 是一种变长的集合类,基于定长数组实现.ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个 ...

  7. vue之列表渲染v-for

    目录 简介 用法 v-for可循环的几种变量的展示 数组的循环展示 对象的循环展示 字符串的循环展示 数字的循环展示 v-for搭档key值的说明 js循环几种方式 基于索引的循环 数组的循环 数组基 ...

  8. [Java SE/JDK]Intellij IDEA中设置JDK版本

    1 Intellij IDEA 修改JDK版本 第1步:配置JDK环境变量 装好JDK之后,要添加一个环境变量:JAVA_HOME 第2步:修改Idea配置 由Maven决定的版本 <build ...

  9. [网络]内网IP的判别与分类

    1 内网IP划分 内网IP地址分为A类.B类和C类,其地址范围如下: A类地址: 10.0.0.0 - 10.255.255.255 B类地址: 172.16.0.0 - 172.31.255.255 ...

  10. 四月二十八号Java基础知识

    1.由于Thread类位于java.lang包中,因而程序的开头不用import导入任何包就可直接使用try{ sleep((int)(1000*Math.random()));//sleep()方法 ...