c和verilog的enum枚举类型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog中的枚举类型与C语言中一样。
C语言中枚举类型
1、应用场合
在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作:
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。以下代码定义了这种新的数据类型:
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开;
(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项;
(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1,如果把第一个改为1,后续成员依次为2,3,4…;
(4)可以在定义枚举类型时初始化各个成员的值,从而自定义某个范围内的整数;
(5) 枚举型是预处理指令#define的替代;
(6) 类型定义以分号;结束。
2、引用方法
(1)定义后引用
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY yesterday;
enum DAY today;
enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY
enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型
其中任何一个枚举数据类型enum DAY都是在所以定义的enum DAY成员范围变化。
(2)定义时引用
e num week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //变量days的类型为枚举型enum week (3)用typedef把枚举类型定义为别名
typedefenum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此处的workday为枚举型enum workday的别名
workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday。同时,enum workday中的workday可以省略。
Verilog中枚举类型
Verilog中的枚举类型应用与c语言一致。如用在状态机的状态定义中。
1、用枚举类型定义状态机状态
typedefenum logic[4:0] {REQ_IDLE=5'b00001, REQ_READ, REQ_READ_RETURN, REQ_WRITE1, REQ_WRITE2, REQ_WRITE_WAIT_REQ_RDY, REQ_WRITE_WAIT_DATA_RDY } request_fsm_t;
这里采用了typedef为enum logic[4:0]定义为别名request_fsm_t
2、引用
request_fsm_trequest_ps;//present state
request_fsm_trequest_ns;//next state
定义状态机当前状态和下一个状态。
例子
`timescale 1ps/1ps
moduleenum_test;
typedefenum logic[4:0] {REQ_IDEL=5'b00001, REQ_READ, REQ_READ_RETURN, REQ_WRITE1, REQ_WRITE2, REQ_WRITE_WAIT_REQ_RDY,
REQ_WRITE_WAIT_DATA_RDY} req;
reqreq_ps;
reqreq_ns;
initial
begin
$display(REQ_IDEL);
$display(REQ_READ);
$display(REQ_READ_RETURN);
$display(REQ_WRITE1);
$display(REQ_WRITE2);
$display(REQ_WRITE_WAIT_REQ_RDY);
$display(REQ_WRITE_WAIT_DATA_RDY); end
endmodule
输出
1
2
3
4
5
6
7