Verilog基础

1)逻辑值
逻辑0:gnd
逻辑1:VCC
逻辑X:1/0
逻辑Z:高阻态

2)数据表示
二进制:4’b0101(四位二进制数5 ,二进制表示0101,《8421》)
十进制:4’d9 (四位十进制数9 ,二进制表示1001,《8421》)
十六进制:4’hf (四位十六进制数15 ,二进制表示1111,《8421》)
Quartus无位数及格式时,默认为32位十进制
例如:16’b1001_1010_1010_1001=16’h9AA9

3)标识符
用于定义模块名、端口名、信号名(变量)
parameter定义的变量全用大写,内部信号全部小写,外部信号首字母大写。

4)数据类型
4-1)寄存器类型,reg
reg[31:0] delay_cnt; ///定义32位寄存器
寄存器初始值为X,没给出位宽时默认32位
reg只能在always和initial语句中赋值
always语句中带有时钟信号,则该寄存器为触发器
always语句中不带有时钟信号,则该寄存器为硬件连线
4-2)线网类型,wire、tri
实体之间的连线,不能存储值
reg类型数据不赋初值状态为X,wire类型数据不赋初值状态为Z
4-3)参数类型,parameter
定义参数,非实体
参数类型数据常用于定义状态机的状态、数据的位宽和延迟大小

5)运算符
算数运算符:+ 、- 、* 、5/2=2 、5%2=1
关系运算符:> , < , >= , <= , == , !=
逻辑运算符:&& , || , !
条件运算符:result=(a>=b)?a:b;条件为真时选a,假时选b
位运算符:~ 、& 、| 、***^ (异或相同为0不同为1)***,当位宽不一致时,少的高位补零
移位运算符:<<(左移为宽增加,空位0补齐),>>(位宽不变,空位0补齐)
位拼接运算符:{a,b}

6)常用关键字
module / endmodule
input
output
inout 双向端口定义
parameter 定义参数
wire 定义线类型数据
reg 定义寄存器类型数据
always 产生reg信号(有时钟时是reg,无时钟时是wire)
always:中<=左侧只能是reg类型数据
always:既可定义组合逻辑又可定义时序逻辑
always块内部是顺序执行的,多个always块之间是并列执行的

assign 产生wire信号
assign :只能定义组合逻辑

assign:中=左侧只能是wire类型数据
begin / end 语句的起始和结束
edge / posedge / negedge
case
default
endcase
if / else
for

7)程序框架
基本单元模块(block):端口定义+IO说明+内部信号声明+功能定义

8)模块的调用(例化)

time_count #(										//调用模块名称
		.MAX_NUM		(TIME_SHOW)					//参数传递(带参数传递时,前面必须加#)	
)u_time_count(										//给例化的模块重新起一个名字
		.clk					(sys_clk),			//端口连接
		.rst_n				(sys_rst_n),			//端口连接
		.flag					(add_flag)			//端口连接
);

模块例化输入端可以是wire或是reg,但输出端必须是wire类型的数据类型。
用于传递信号的变量位宽必须保持一致

9)结构语句
a)initial在模块里只执行一次,实际上是不存在的,常用来编写测试文件

initial begin... ...
#20 touch_key <= 1'b1		//	#20表示延时20nm后,touch_key拉高

b)always一直在不断的重复活动

always #10 sys_clk<=~sys_clk		//产生20nm(50mhz)的时钟信号

c)敏感列表:只有敏感列表里的条件满足时,begin~end之间的过程块语句才能执行。
沿触发的always语句用来描述时序逻辑(有记忆功能),电平触发的always语句用来描述组合逻辑。

always #10 sys_clk<=~sys_clk		//产生20nm(50mhz)的时钟信号

10)赋值语句
阻塞赋值“=”:在同一个always语句中,后面的赋值语句是在前面赋值语句结束后才开始执行的。(一步赋值到位)
非阻塞赋值“<=”:在同一个always语句中,所有的赋值语句同时执行。只能用于对寄存器类型的变量进行赋值。(节拍性的逐步赋值)
组合逻辑使用“=”,时序逻辑使用“<=”
非阻塞赋值只能用于always和initial结构语句里(因为:寄存器变量只能用在这样的语句里)
在同一个always块中只能使用一种赋值方式
不容许在多个always块中对同一变量进行赋值,因为always之间是并行的。

11)条件语句
if else else if
条件语句必须在过程块(initial和always)中使用。
case
控制表达式、分支表达式(两种表达式的位宽必须一致)、default
casez:不考虑高阻值z
casex:不考虑不定值x
注意:if、else要配对使用。使用case时,当情况不完全时,要加defalt
否则产生锁存器。

12)状态机
a)如何写一个状态机(四段论)
状态空间定义
状态跳转
下个状态判断
各个状态下的动作
b)状态机的结构
组合逻辑:产生下一状态的组合逻辑
时序逻辑:状态寄存器
组合逻辑:产生输出组合逻辑
c)独热码

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值