初学习verilog_经验
先记下来:
1、不使用初始化语句;
2、不使用延时语句;
3、不使用循环次数不确定的语句,如:forever,while 等;
4、尽量采用同步方式设计电路;
5、尽量采用行为语句完成设计;
6、always过程块描述组合逻辑,应在敏感信号表中列出所有的输入信号;
7、所有的内部寄存器都应该可以被复位;
8、用户自定义原件(UDP元件)是不能被综合的。
1它是 cadence的模拟器verilog-XL的基础,cadence的广泛流行使得 verilog 在90年代深入人心;
2它在硅谷获得广泛使用;
B) verilog 与VHDL相比的优点二者的关系仿佛 C与FORTRAN,具体而言:
1 verilog 的代码效率更高:
比较明显的对比:
VHDL在描述一个实体时采用 entity/architecture 模式,
verilog 在描述一个实体时只需用一个"module/edumodule"语句块.
此外verilog 的高效性还在很多地方体现出来;
2 verilog 支持二进制的加减运算:
VHDL在进行二进制的加减运算时使用conv_***函数或者进行其他的定义,总之必须通知编译器;verilog
直接用形如"c=a+b"的表示二进制的加减运算;
3综合时可控制性好:
VHDL对信号不加区分地定义为"signal",
而verilog 区分为register类型的和 wire类型的;
但是也有人支持 VHDL,认为verilog 和VHDL的关系仿佛 C和C++.C)典型的verilog 模块
讨论以下典型电路的 verilog描述:
*与非门;
*加法器; //即全加器
* D触发器;
*计数器; //**分频的counter
* latch;
*时序机;
*RAM; //用synopsys的
*模块引用;
*预编译;
*与非门的 verilog描述如下:
//verilog 使用和C语言相同的注释方法
module nd02(a1,a2,zn);//一个 verilog模块总是以module 开始,以endmodule 结束,nd02是模块
名,a1,a2,zn 是模块的3个输入输出信号
input a1,a2; //告诉编译器a1,a2 对此模块而言是输入,并且数据类型是"bit"
output zn; //告诉编译器zn 对此模块而言是输出,数据类型也是"bit"
nand (zn,a1,a2); //我理解nand 是运算符,我们不必深究 verilog中的正式术语是什
么了吧,总之这种形式表示 zn=~(a1 && a2);你一定已经想到类似的运算符还有
"not","and","or","nor","xor"了吧;除了"not",括号里的信号数可以任意,例如or (z,f,g,h)表示z=f
|| g || h,并且延时是3个单位时间,#x表示延时x个单位时间;
endmodule
*加法器的 verilog描述如下:
module ad03d1(A,B,CI,S,CO) ;
input [2:0] A,B; //表示A,B 是输入信号,并且是3位矢量,上界是2,下界是 0
input CI;
output [2:0] S;
output CO;
assign {CO,S}=A+B+CI;//一对"{"和"}"表示链接,即将 CO和S合并成4位矢量
endmodule
*带异步清零端的 D触发器的verilog 描述如下:
module dfctnb (d,cp,cdn,q,qn);
input d,cp,cdn;
output q,qn;
reg q,qn; //关键字"reg"表示 q和qn是"register"类型的信号;verilog中有两种类型的信
号:"register"类型和"wire"类型.你可以简单地把register类型的信号想象为某个D触发器的输出,而
wire类型的的信号是组合逻辑的输出.二者的最大区别在于:你可以对register 类型的信号进行定时赋
值(用wait 语句在特定时刻的赋值,详见下面always语句),而对于wire类型的信号则不可.
always wait (cdn==0) //表示每当 cdn=0时,将要对D 触发器清零,"always"和"wait"嵌套,"wait"和
"@"是verilog 的两个关键字,表示一旦有某事发生;则执行下面的语句块,"always"有点象C语言中的
"if ... then...","wait"和"@"的区别:请参考本模块.wait表示本语句块的进程停止,直到"cdn=0"的
条件出现才继续;我理解在verilog中,每个最外层语句块都是一个***的进程;"@"(请看下个always语
句)也表示本语句块的进程停止,直到后面定义"posedge cp"(即出现cp的上升沿)的事件出现才继续;也
许wait和@可以合二为一吧,但至少到目前verilog中wait表示"条件",@表示"事件";具体运用中,wait
总是用于类似"wait(xxx=1)"之类的场合,@总是用于类似"@(xxx)"或"@(posedge/negedge xxx)"之类的
场合整句话的意思是"每当cdn 等于0时,则作以下事情"
begin //begin...end结构的用法类似于 pascal语言
q=0;
qn=1;
wait (cdn==1);
end
always @ (posedge cp)//"@(posedge cp)"中有两个关键字:"@ (x)"表示"每当事件 x发
生","posedge x"表示"x的上升沿,"negedge x"表示"x的下降沿",整句话的意思是"每当cp的上升沿,
则作以下事情"
if (cdn) //如果cdn=1(意味着清零端无效)
begin
q=d;
qn=~q;//"~"表示反相
end
endmodule
完整的pdf格式文档51黑下载地址(共39页):
verilog_经验(适合初学者).pdf
(946.04 KB, 下载次数: 33)
|