二选一选择器
module muxtwo(out,a,b,s1);
input a,b,s1;
output out;
reg out;
always @ (s1, or a or b)
if (!s1) out = a;
else out = b;
endmodule
没有定义端口的位数,所有端口大小默认为1位;没有定义端口的数据类型,都默认为线网型数据类型。输出out定义为reg类型。
2.3数据类型和运算符
Verilog HDL语言的基本要素:标志符、数据类型、模块端口、值集合及表达式
标志符:字母、数字、下划线和$符号,第一个字符必须是字母或下划线
数据类型
Wire型wire[n-1:0]数据名1,数据名2,数据名3,…,数据名N定义了N条线,每条线位宽为n
Reg型
赋值可以改变寄存器存储的值,相当于改变触发器存储器的值。Reg型数据常用来表示always模块内的指定信号,代表触发器。Always块内被赋值的每一个信号都必须定义为reg型。Reg型保持最后一次的赋值,而wire型需要持续地驱动。
Memory型
Memory型通过扩展reg型数据的地址范围来达到二维数组的效果,定义格式如下:
Reg[n-1:0]存储器名[m-1:0]
Parameter型
Verilog中用parameter来定义常量,即用parameter来定义一个标志符表示常数
Parameter 参数名1 = 数据名1;
2.4 verilog HDL语言的描述语句
结构描述形式
一个全加器
module ADD(A,B,Cin,Sum,Cout);
inputA,B,Cin;
output Sum,Cout;
wire S1,T1,T2,T3;
xor X1(S1,A,B),
X2(Sum,S1,Cin);
And A1 (T3,A,B),
A2 (T2,B,Cin),
A3 (T1,A,Cin);
Or O1 (Cout,T1,T2,T3);
Endmodule
数据流移位器
Module mlshift2(a,b);
Input a;
Input b;
Assign b=a<<2;
Endmodule
只要a的值发生变化,b就会被重新赋值,所赋值为a左移两位后的值
行为描述
通常采用4中过程模块来实现
Initial模块 面向仿真,初始化、监视、波形生成等功能,只执行一次
Always模块
任务task模块
函数function模块
Mudule and3(f,a,b,c)
input a,b,c;
output f;
reg f;
Always @ (a or b or c ) begin
F=a&b&c;
End
endmodule
语句块
1)begin...end
用来组合需要顺序执行的语句,称为串行块,如:
parameter d-50;
reg[7:0] r;
begin
# d r='h35;
#d r='hE2
#d r='h00;
#d->end_wave;
end
2)fork...join
用来组合需要并行执行的语句,称为并行块。如:
parameter d=50
reg[7:0] r;
fork
# d r = 'h35;
#d r='hE2
#d r='h00;
#d->end_wave;
join
3.时序控制
延时控制,表示语句执行前的“等待延时”
# 延时数 表达式;
initial
begin
# 5 clk=~clk;
end
事件控制
上升沿用posedge描述,下降沿用negedge描述
reg[4:0] cnt;
always @(posedge clk) begin
if (reset)
cnt<=0;
else
cnt<=cnt+1;
end
只要clk信号有上升沿,那么cnt信号就会加1,完成计数的功能。
注释
//或/* */
模块调用
Verilog中有两种模块调用方法。
位置映射法,严格按照模块定义的端口顺序来链接。语法为
模块名 (连接端口1信号名,连接端口1信号名,连接端口1信号名,...)
信号映射法,即利用“.”符号,表明原模块定义时的端口名,语法为
模块名(.端口信号名(连接端口1信号名),
.端口信号名(连接端口2信号名),
.端口信号名(连接端口3信号名),...);
信号映射法同时将信号,名和被引用端口名列出来,不严格遵循端口顺序,不仅降低了代码易错性,还提高了可读性和可移植性,因此,良好的代码中,严禁使用位置调用法,全部采用信号映射法。
2。6常用verilog程序示例
触发器
1)同步RS触发器
RS触发器分为同步触发器和异步触发器
正触发型同步RS触发器的Verilog实现。
module sy_rs_ff (clk,r,s,q,qb);
input clk,r,s;
output q, qb;
reg q;
assign qb=~q;
always @ (posedge clk) begin
case ({r,s})
2'b00: q< =q;
2'b01: q< =1;
2'b10: q< =0;
2'b11: q< =1'bx;
endcase
end
endmodule
同步T触发器的Verilog实现
module sy_t_ff(clk,r,qb);
input clk,r;
output q, qb;
reg q;
assign qb=~q;
always @ (posedge clk) begin
if(r)
q<=0;
else
if(t)
q<=q;
else
q<=~q;
end
endmodule