资源预览内容
第1页 / 共59页
第2页 / 共59页
第3页 / 共59页
第4页 / 共59页
第5页 / 共59页
第6页 / 共59页
第7页 / 共59页
第8页 / 共59页
第9页 / 共59页
第10页 / 共59页
亲,该文档总共59页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,Verilog设计快速入门,2,Verilog模块结构,说明: 浅色部分用得较少; 常用语句只有三种: assign语句 always语句 底层模块调用语句 三种语句顺序无关 除开始的module模块名和结束的endmodule必须写外,其他都是可选的。,功能描述部分,模块说明部分,3,Verilog模块结构,例1:二选一数据选择器的描述,二选一数据选择器的结构之一,二选一数据选择器的符号,设a、b、s波形已知,可得y波形:,4,Verilog模块结构,2选1多路选择器的Verilog描述,5,Verilog程序结构,例2:边沿D触发器的Verilog描述,6,Verilog模块结构,1模块说明部分,module 模块名 (端口列表); 端口信号声明; 参数声明;,模块名是指电路的名字,由用户指定,最好与文件名一致(特别是在Quartus II软件中调试时); 端口列表是指电路的输入/输出信号名称列表,信号名由用户指定,各名称间用逗号隔开; 端口信号声明是要说明端口信号的输入输出属性、信号的数据类型,以及信号的位宽;输入输出属性有input,output,inout三种,信号的数据类型常用的有wire和reg两种;信号的位宽用n1:n2表示;同一类信号之间用逗号隔开; 参数声明要说明参数的名称和初值,输入输出属性 数据类型 位宽 名称,parameter 数据类型 参数名 = 初值,7,例:,module full_adder (A,B,CIN,S,COUT); input 3:0 A,B; input CIN; output reg 3:0 S; output COUT;,位宽如果不做说明的话,默认是1位; 数据类型不做说明的话,默认是wire型的。,S位宽为4位,对应信号为S3、S2、S1、S0,根据模块说明部分,我们可以得出电路符号,COUT,8,2. assign语句,assign语句称作连续赋值语句,assign 赋值目标 = 表达式,例:,特点: 之所以称为连续赋值语句是指其总是处于激活状态,只要表达式中的操作数有变化,立即进行计算和赋值。(与连续赋值语句对应的另一种语句称为过程赋值语句) 赋值目标必须是wire型的,wire表示电路间的连线。,assign y=a; assign y=a,基本格式:,9,2. assign语句,例:assign M=B|C; assign Y=A,M,M和Y都必须是wire型的,10,2. assign语句,Verilog具有丰富的表达式运算功能,可用于assign语句,详见夏宇闻教材第6章,自学。,(1) 算术型,例: Y=5%2; Y=2*3;,求余,结果为1,求幂,结果为8,说明 加减乘除、求幂的操作数可以是实数也可以是整数,求余运算的操作数只能是整数。 求余运算结果取第一个操作数的符号;,(2) 逻辑型,例: Y=! (32) Y=(26); Y=(26); Y=(23) ,逻辑非,结果为0,逻辑与,结果为0,说明 逻辑型运算的结果可能是1(逻辑真)、0(逻辑假)、x(不确定); 逻辑运算的操作数可以是任意表达式,表达式的结果被当做逻辑值处理,只有1、0、x三种情况,非0、x即1; 表达式最好加括号。,逻辑或,结果为1,逻辑与,结果为x,逻辑或,结果为1,(3) 关系运算符,例: Y=(32) Y=(3=2); Y=(3=2); Y=(3=1bx);,结果为1,结果为0,说明 关系运算的结果可能是1(逻辑真)、0(逻辑假)、x(不确定);,结果为1,结果为0,结果为x,(4) 等价运算符,例: Y=(3=2) ; Y=(3!=2); Y=(3=3); Y=(1b1 =1bx); Y=(1bx =1bx); Y=(1b1 =1bx); Y=(1bx =1bx);,结果为0,结果为1,说明 等于和不等于运算的结果可能是1(逻辑真)、0(逻辑假)、x(不确定);对于x或z,认为是不确定的值,比较结果为x; case等和case不等的结果只能是1或0,对于x、z认为是确定的值,参加比较;,结果为1,结果为x,结果为x,结果为0,结果为1,(5) 按位运算符,例: Y= 4b1001 ; Y= 4b1001 ,结果为0110,结果为0001,说明 按位运算的操作数是1位或多位二进制数, 按位非的操作数只有一个,将该数的每一位求非运算。 其它按位运算的操作数有2个或多个,将两个操作数对应的位两两运算; 如果操作数位宽不同,位宽小的会自动左添0补齐; 结果与操作数位宽相同;,结果为1111,结果为0111,结果为0101,(6) 缩减运算符,例: Y=,结果为0,结果为1,说明 缩减运算的操作数是1位或多位二进制数; 缩减运算的操作数只有一个,将该数的各位自左至右进行逻辑运算,结果只有一位。,(7) 移位运算符,例: Y= 4b1001 1; Y= 4sb1001 1;,结果为0100,结果为1100,说明 移位运算的操作数是1位或多位二进制数; 向左或向右移n位; 只有对有符号数的算术右移自动补符号位; 其他移位均自动补0。,操作数 移位符 n;,格式,(8) 拼接复制运算符,例: Y= 4b1001, 2b11; Y= 42b01; Y= 42b01, 2b11;,结果为100111,结果为01010101,说明 将多个操作数拼接起来; 将操作数复制n遍并拼接起来; 可以组合使用。,操作数1, 操作数2, ,格式,n操作数1, 操作数2, ,格式,(9) 条件运算符,例: Y= a ? b : c; Y= s1 ? (s0 ? d3 : d2) : (s0? d1 : d0);,如果a=1,则y=b; 如果a=0,则y=c。 如果a=x,则y=x。,说明 根据表达式1的值,决定运算结果; 如果表达式1值为1,则结果等于表达式2; 如果表达式1值为0,则结果等于表达式3; 如果表达式1值为x,则结果为x; 可以嵌套。,表达式1 ? 表达式2 : 表达式3,格式一,20,3. always语句块,always语句块又称过程块,基本格式: always (敏感信号条件表) 各类顺序语句;,特点: always语句本身不是单一的有意义的一条语句,而是和下面的语句一起构成一个语句块,称之为过程块;过程块中的赋值语句称过程赋值语句; 该语句块不是总处于激活状态,当满足激活条件时才能被执行,否则被挂起,挂起时即使操作数有变化,也不执行赋值,赋值目标值保持不变; 赋值目标必须是reg型的。,例: always (posedge CLK) Q=D;,3. always语句块,激活条件由敏感信号条件表决定,当敏感条件满足时,过程块被激活。,敏感条件有两种,一种是边沿敏感,一种是电平敏感。,电平敏感:,(posedge 信号名),边沿敏感:,(negedge 信号名),(信号名列表),信号上升沿到来,信号下降沿到来,例: (posedge clk),例: (negedge clk),信号列表中的任一个信号有变化,例: (a,b,c),当a,b,c中有一个发生变化,说明: 逗号可以换成or,例: (a or b or c),3. always语句块,例: always (posedge CLK) Q=D;,当CLK上升沿到来时,激活该语句块,将D的值赋给Q; 否则,该语句块挂起,即使D有变化,Q的值也保持不变,直到下一次赋值。,例: always (D) Q=D;,当D有变化时(不管是由1变0还是由0变1),激活该语句块,将D的值赋给Q; 否则,该语句块挂起,Q的值保持不变,直到下一次赋值。,D,Q,D,CLK,Q,3. always语句块,说明: 过程块中的赋值目标必须是reg型的。 由于always语句可以描述边沿变化,在设计时序电路中得到广泛应用。 always语句中还可以使用if、case、for循环等语句,其功能更加强大。,例: always (posedge CLK) Q=D;,例: always (D) Q=D;,必须是reg型的,3. always语句块,25,3. always语句块,assign语句和always语句的主要区别: 连续赋值语句总是处于激活状态,只要操作数有变化马上进行计算和赋值; 过程赋值语句只有当激活该过程时,才会进行计算和赋值,如果该过程不被激活,即使操作数发生变化也不会计算和赋值。 verilog规定assign中的赋值目标必须是wire型的,而always语句中的赋值目标必须是reg型的。,assign Q=D,always (posedge clk) Q=D;,例:,只要D发生变化,马上进行计算和赋值; Q必须是wire型。,只有当clk上升沿到来时,才能激活该块语句,才能进行计算和赋值;否则,即使D发生变化也不会计算和赋值。在未被激活时,Q的值保持不变。 Q必须是reg型。,26,3. always语句块,always语句块中除了可以使用表达式赋值以外,还可以使用if,case等行为描述语句,还能够描述边沿变化,因此其功能比assign语句更强大(assign语句不能使用if等语句,也不能描述边沿变化)。,例:,module DFF2 (CLK,D,Q,RST,EN) input CLK,D,RST,EN; output Q; reg Q; always (posedge CLK or negedge RST) begin if (!RST) Q=0; else if (EN) Q=D end endmodule,27,3. always语句块,always语句块中如果有多条赋值语句必须将其用begin end包括起来,assign语句中没有begin end。,例:,module adder (a,b,cin,s,cout) input a,b,cin; output s,cout; reg s,cout; always (a,b,cin) begin s=abcin; cout=(a end endmodule,思考问题:在仿真时,begin和end之间的语句执行顺序如何?,请大家画出该模块的端口符号图和电路图,3. always语句块,begin end之间的赋值语句有阻塞赋值和非阻塞赋值之分。,阻塞赋值:语句顺序执行,前面的执行完才能执行后面; 赋值符号:= 非阻塞赋值:所有语句并行执行。 赋值符号:=,赋值目标1=表达式1; 赋值目标2=表达式2;,赋值目标1=表达式1; 赋值目标2=表达式2;,赋值语句1会阻塞赋值语句2 ,即只有当赋值语句1执行完才能执行赋值语句2。,赋值语句1不会阻塞赋值语句2 ,赋值语句1和赋值语句2并行执行。,3. always语句块,举例比较:,阻塞赋值 begin m=a*b; y=m; end,非阻塞赋值begin m=a*b; y=m; end,当m=a*b 执行完才能执行y=m 。,当m赋值完成后,才能执行y的赋值,y得到的是m的新值。,m和y的赋值并行执行,y得到的是m的旧值。,m=a*b 和y=m并行执行 。,阻塞赋值的实质:右边表达式的计算和对左边寄存器变量的赋值是一个统一的原子操作中的两个动作,这两个动作之间不能再插入其他任何动作。 非阻塞赋值的实质:首先按顺序计算右边表达式的值,但是并不马上赋值,而是要等到过程结束时再按顺序赋值。,赋值目标1=表达式1; 赋值目标2=表达式2;,赋值目标1=表达式1; 赋值目标2=表达式2;,阻塞赋值【例8-6】 always (A,B) begin M1=A; M2=B end,设A、B同时由0变1,激活前:M1=0,M2=0,Q=0,激活后:,先计算A=1,马上赋值给M1 再计算B M2=B end,先计算A=1,(等待,不赋值) 再计算B output Y; reg Y; reg
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号