学习笔记(3):Verilog数字逻辑电路设计方法
1.Verilog语言设计思想和可综合特性
例:用Verilog设计模256(8bits)计数器
(a)可综合程序描述方式
(b)常见的错误描述方式
同时Verilog的电路描述方式具有多样性,这也决定了对于电路设计的多样性。
例:用Verilog设计数字多路选择器
(a)采用真值表形式的代码
(b)采用逻辑表达式形式的代码
(c)采用结构性描述的代码
2.Verilog组合逻辑电路
组合电路的特点是:电路中任意时刻的稳态输出仅仅取决于该时刻的输入,而与电路原来的状态无关。
组合电路的设计需要从以下几个方面考虑:
- 所用的逻辑器件数目最少,器件的种类最少,且器件之间的连线最简单。这样的电路称“最小化"电路;
- 其次,为了满足速度要求,应使级数尽量少,以减少门电路的延迟;电路的功耗应尽可能的小,工作时稳定可靠。
描述组合逻辑电路有四种方式:结构描述、逻辑代数、真值表、抽象描述。
例如:设计一个3个裁判的表决电路,当两个或两个以上裁判同意时,判决器输出"1",否则输出"0" 。
方法1:真值表方式
真值表是对电路功能最直接和简单的描述方式。根据电路的功能,可以通过真值表直接建立起输出与输入之间的逻辑关系。本例有三个输入端A、B、C和一个输出端OUT 。
A | B | C | OUT |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
在Verilog中,可以使用“case”语句对电路进行描述性设计,根据上表设计:
方法2:逻辑代数方式
对于组合电路的另一种表达方法是逻辑代数方法。主要思想是将真值表用卡诺图表示,然后化简电路,得出逻辑函数表达式。
通过对卡诺图的化简,可以得到组合电路逻辑输出与输入之间的逻辑函数表达式:
根据逻辑函数表达式可以很方便写出采用逻辑代数描述方式的Verilog:
module desingn(OUT,A,B,C);
output OUT;
input A,B,C;
assign OUT = (A&B) | (B&C) | (A&C);
endmodule
方法3:结构描述方式
结构性描述方式是对电路最直接的表示,早期的数字电路设计通常采用的原理图设计实际上就是一种结构性描述方式。
module desingn(OUT,A,B,C):
output OUT;
input A,B,C;
and U1(w1,A,B);
and U2(w2,B,C);
and U3(w3,A,C);
or U4(OUT,w1,w2,w3);
endmodule
方法4:抽象描述方式
Verilog还提供了采用抽象描述进行电路设计的方法,可以直接从电路功能出发,编写代码。例如判决器设计,将三个输入的判决相加,当判决成功时相加器之和大于1 , 即表示投票成功。
module desingn(OUT,A,B,C);
output OUT;
input A,B,C;
wire [1:0} sum;
reg OUT;
assign sum = A + B + C;
always@(sum)
if(sum > 1)
OUT = 1;
else
OUT = 0;
endmodule
2.1 数字加法器
数字加法器是最为常用的一种数字运算逻辑,被广泛用于计算机、通信和多媒体数字集成电路中
例如:2输入1bit信号全加器。考虑了来自低位的进位那么该运算就为全加运算,实现全加运算的电路称为全加器。
代数逻辑表示为:
对应的电路如下:
Verilog可以用不同的描述方式写出一位全加器,其综合电路是相同的,只是描述风格不同。
(1)利用连续赋值语句实现
module one_bit_fulladder(SUM, C_OUT, A, B, C_IN);
input A, B, C_IN;
output Sum, C_OUT;
assign SUM = (A ^ B) ^ C_IN;
assign C_OUT = (A & B) | ((A ^ B) & C_IN);
endmodule
(2)利用行为描述实现
module one_bit_fulladder(SUM, C_OUT, A, B, C_IN);
input A, B, C_IN;
output SUM, C_OUT;
assign {C_OUT,SUM} = A + B + C_IN;
endmodule
采用行为描述可以提高设计的效率,对于一个典型的多位加法器的行为描述设计,仅需改变代码中输入和输出信号的位宽即可,例如一个2输入8bits 加法器:
例:4位超前进位加法器
超前进位加法器是一种高速加法器,每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可以提高运算速度。
根据对于输入信号位宽为N的全加器,其进位信号是:
输出的加法结果是
超前进位标志信号是
进位产生函数是
进位传输函数是
上述公式中N为加法器位数,在4位加法器中,N=4。由式可以推出各级进位信号表达式,并构成快速进位逻辑电路。
4位超前进位加法器的电路图如下
4位超前进位加法器的Verilog代码:
2.2 数据比较器
数据比较器是用来对两个二进制数的大小进行比较,或检测是否相等的逻辑电路。数据比较器包含两个部分:一是比较两个数的大小;二是检测两个数是否一致。
例:4位数值比较器
多位数值比较器的比较过程是由高位到底位逐位进行比较,而且只有在高位相等时,才进行低位比较。4位数值比较器中进行A3A2A1A0和B3B2B1B0的比较时,应首先比较最高位A3和B3。如果A3>B3,那么不管其它几位数为何值,结果为A>B;若A3<B3,为A< B。如果A3=B3,就必须通过比较低一位A2和B2来判断A和B的大小。如果A2=B2,还必须通过比较更低一位A1和B1来判断,直到最后一位的比较。如果完全相等,则由前一级结果C(级联输入)确定。
module four_bits_comp(F, A, B,C);
parameter comp_width = 4;
output [2:0] F;
input [comp_width-1:0] A;
input [comp_width-1:0] B;
ref [2:0] F;
always@(A or B or C)
if(A>B)
F = 3'b100;
else if(A<B)
F = 3'b001;
else
F = C;
endmodule
2.3 数据选择器
数据选择器又称多路选择器(Multiplexer,简称MUX),它有n位地址输入、2n位数据输入,1位数据输出。每次在输入地址的控制下,从多路输入数据中选择一路输出,其功能类似于一个单刀多掷开关,如图:
例,8选1数据选择器
8选1数据选择器可以由多个2选1选择器组成:
(1)多个2选1数据选择器的结构级描述
module mux8to1(d_out, d_in, sel);
output d_out;
input[7:0] d_in;
input [2:0] sel;
wire[3:0] w1;
wire[1:0] w2;
assign w1 = sel[0] ? {d_in[7], d_in[5], d_in[3], d_in[1]} : {d_in[6], d_in[4], d_in[2], d_i