由于某些原因,又重新看是看了本科的教材——《电子技术基础数字部分》,经过两年半的工作,再次看到上面的内容,感觉到自己的基础环节着实薄弱,所以,就从书上找些基础内容,学习记录下来;
原来,典型的一些中规模集成电路,都是属于组合逻辑电路,比如:编码器,数据选择器,数据分配器,数值比较器,算数逻辑运算单元等。
组合电路的结构具有如下特点:
Verilog语言中内置了12个基本门级元件模型:门级元件的输出、输入必须为线网类型的变量。
当这些元件进行逻辑仿真时,仿真软件回根据程序的描述给每个元件中的变量分配逻辑0,逻辑1,不确定态x,和高阻态z这4个值之一。
元件符号 | 功能说明 | 元件符号 | 功能说明 |
---|---|---|---|
and | 多输入端的与门 | nand | 多输入端的与非门 |
or | 多输入端的或门 | nor | 多输入端的或非门 |
xor | 多输入端的异或门 | xnor | 多输入端的异或门 |
buf | 多输入端的缓冲器 | nor | 多输入端的反相器 |
bufif11 | 控制信号高电平有效的三态缓冲器 | notif1 | 控制信号高电平有效的三态反相器 |
bufif0 | 控制信号低电平有效的三态缓冲器 | notif0 | 控制信号低电平有效的三态反相器 |
用Verilog
语言的门级元件进行描述:由三态门构成的2选1数据选择器。
[分析]2选1选择器的门级描述如下述程序所示。两个三态门的输出都与L
相连,即输出线L被两个三态门驱动,为了说明这种情况,建议将输出变量L
定义成tri数据类型。
// Gate-level description of a 2-to-1-line multiplexer
module _2to1muxtri(A, B, SEL, L);
input A, B, SEL;
output L;
tri L;
bufif1(L, B, SEL);
bufif0(L, A, SEL);
endmodule
这里差一个图。
对于基本单元逻辑电路,使用Verilog
语言提供的门级元件模型描述电路非常方便,但随着电路复杂性的增加,使用的逻辑门较多时,使用HDL
门机描述的工作效率就很低。
数据流建模能够在较高的抽象级别描述电路的逻辑功能,并且通过逻辑综合软件,能够自动将数据流描述转换为门级电路。
有点基础的就不用在此叙述了,运算符有双目运算符,单目运算符,三目运算符(不常用,全等===
和不全等!==
)。
要注意,位运算和缩位运算,在之前的文章中有介绍Verilog实用操作。
使用条件运算符描述一个2选1的数据选择器。在连续赋值语句中,如果SEL=1
,则输出L=A
,否则L=B
。
// Dataflow description of 2-to-1-line multiplexer
module mux2x1_df(A, B, SEL, L);
input A, B, SEL;
output L;
assign L = SEL ? A : B;
endmodule
从上面的例子看,数据流建模根据电路的逻辑功能进行描述,不必考虑电路的组成以及元件之间的连接,时描述组合逻辑电路常用的一种方法。
行为级建模就是描述数字逻辑电路的功能和算法,一般使用always
结构,后面跟着一系列过程赋值语句,给reg
类型的变量赋值。
在always
结构内部使用的逻辑表达式就是一种过程赋值语句,除此之外,还有一些与高级程序设计语言类似的语句,常用的有条件语句(if-else)
和多路分支语句(case-endcase)
等。
行为级描述的标识是always
结构。
always
是一个循环执行语句,在它后面跟着循环执行的条件@(SEL or A or B)
(注意后面没有分号),它表示圆括号内的任一变量发生变化时,下面的过程复制语句就会被执行一次,,执行完最后一条语句后,执行挂起,always
语句再次等待变量发生变化,因此将圆括号内列出的变量成为敏感变量。
对组合逻辑电路来说,所有的输入信号都是敏感变量,应该被写在圆括号内。
注意:
or
代替了逻辑或运算符|
;L
定义成reg
数据类型。混合使用if-else和case语句描述带有是能控制端的4选一数据选择器。
// Behavioral description of 4-to-1 line multiplexer
module mux4to1_bh(A, SEL, E, L);
input [3:0] A;
input [1:0] SEL;
output L;
reg L;
always @(A or SEL or E) begin
if (E == 1) begin
L = 0;
end else begin
case(SEL)
2'd0: L = A[0];
2'd1: L = A[1];
2'd2: L = A[2];
2'd3: L = A[3];
endcase
end
end
endmodule
用Verilog
对组合逻辑电路建模时有三种不同的描述风格,即:
改关键词可分两部分理解,buf时buffer的缩写,表示该元件完成缓冲器的功能;后面的if1表示完成该功能所需要的条件,即控制信号为逻辑1。 ↩︎