一,简答题
1.组合逻辑电路与时序逻辑电路有什么区别?是判断下列波形是组合电路还是时序电路,确定输入量和输出量,简要给出理由。 (10 分)
My answer:
组合逻辑电路和时序逻辑电路的区别
比较项目 | 组合逻辑电路 | 时序逻辑电路(状态机)(同步) |
---|---|---|
输入输出关系 | 任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关 | 不仅仅取决于当前的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关 |
有无存储单元 | 无(不能包含) | 包含 |
结构特点 | 只包含门电路 | 组合逻辑电路+存储电路 输出状态必须反馈到组合电路的输入端,与输入信号共同决定组合逻辑的输出 |
分析方法 | 从电路的输入到输出逐级写出逻辑函数式,最后得到表示输出与输入关系的逻辑函数式。 然后用公式化简法或者卡诺图化简法得到函数式的化简或变换,以使逻辑关系简单明了。 有时还可以将逻辑函数式转换为真值表的形式 | 组合逻辑电路+存储电路,输出状态必须反馈到组合电路的输入端,与输入信号共同决定组合逻辑的输出 1、写出每个触发器的驱动方程 2、将驱动方程带入触发器的特性方程得到状态方程组 3、根据逻辑图写出电路的输出方程状态转换过程描述:状态转换表、状态转换图、状态机流程图、时序图 |
设计方法 | 1、逻辑抽象 2、写出逻辑函数式 3、选定器件类型 4、将逻辑函数式化简或者变换成适当的形式 5、画出逻辑电路的连接图 6、工艺设计 | 1、逻辑抽象得到状态转换图或者状态转换表 2、状态化简 3、状态分配(状态编码) 4、选触发器求出状态方程、驱动方程和输出方程 5、根据方程式画出逻辑图 6、检查设计的电路能否自启动 |
常用逻辑电路 | 编码器 译码器 数据选择器 加法器 数值比较器 | 锁存器 触发器 寄存器 移位寄存器 存储器 |
verilog描述 | 逻辑中不牵涉跳变沿信号的处理,组合逻辑的verilog描述方式有两种: always @(电平敏感信号列表) (1):always模块的敏感列表为所有判断条件信号和输入信号,但一定要注意敏感列表的完整性。在always 模块中可以使用if、case 和for 等各种RTL 关键字结构。由于赋值语句有阻塞赋值和非阻塞赋值两类,建议读者使用阻塞赋值语句“=”。always 模块中的信号必须定义为reg 型,不过最终的实现结果中并没有寄存器。这是由于在组合逻辑电路描述中,将信号定义为reg型,只是为了满足语法要求。 (2):assign描述的赋值语句。 信号只能被定义为wire型。 | 电路里面有存储元件(各类触发器,在FPGA 芯片结构中只有D 触发器)用于记忆信息,从电路行为上讲,不管输入如何变化,仅当时钟的沿(上升沿或下降沿)到达时,才有可能使输出发生变化。 与组合逻辑不同的是: (1)在描述时序电路的always块中的reg型信号都会被综合成寄存器,这是和组合逻辑电路所不同的。 (2)时序逻辑中推荐使用非阻塞赋值“<=”。 (3)时序逻辑的敏感信号列表只需要加入所用的时钟触发沿即可,其余所有的输入和条件判断信号都不用加入,这是因为时序逻辑是通过时钟信号的跳变沿来控制的。 |
【考场作答省流版】
1、组合逻辑电路特点:任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。
2、时序逻辑电路特点:任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。
判断下列波形式组合电路还是时序电路
假设该电路为组合电路,依据组合电路的当前输入确定,可以唯一确定输出,而与系统之前的状态无关的特性的特性,做如下分析
基于该电路式是组合逻辑电路的假设:
1. 若X,Y为输入,Z为输出,如上图1中所示,同一输入下输出不同,矛盾(若X,Y分别单独为输入,另两信号为输出的 情况同理)
2. 若Y,Z为输入,X为输出,如上图2中所示,同一输入下输出不同,矛盾(若Y,Z分别单独为输入,另两信号为输出的情况同理)
3. 若X,Z为输入,Y为输出,如上图3中所示,同一输入下输出不同,矛盾(若X,Z分别单独为输入,另两信号为输出的情况同理)
综上所述,假设不成立,该电路为时序逻辑电路。
确定输入量和输出量
认为X是输出量,Y和Z是输入量,理由如下
1. XY不变时,Z有变化,故Z不是输出
2. XZ不变时,Y有变化,故Y不是输出
3. X变化时Y和Z必然变化,故X是输出
2.将下列逻辑函数化简为最简或与式。式中 a’表示 a 的非。(10 分)
F(a,b,c,d)=ab′c′d + a′bc + abc + abd′ + a′bd + abd + acd′
My answer:
step1 做出卡诺图
step 2 由卡诺图可知,最简与或式共有四项如图,一种化简结果为
F
(
a
,
b
,
c
,
d
)
=
(
b
+
c
‾
+
d
‾
)
(
a
+
b
)
(
b
+
d
+
d
)
(
a
+
c
+
d
)
F(a,b,c,d)=(b+\overline{c}+\overline{d})(a+b)(b+d+d)(a+c+d)
F(a,b,c,d)=(b+c+d)(a+b)(b+d+d)(a+c+d)
3.简述摩尔型时序电路与米里型时序电路的区别(10 分)
米里型状态机和摩尔型状态机的区别
【考场作答省流版】
输出与现态和输入都有关的时序电路称为米里型时序电路,输出仅与现态有关的时序电路称为摩尔型时序电路。
二,分析设计题
1.组合电路设计(20分)
①试设计 1 位全加器,并给出模块图,标注输入输出信号。
全加器的逻辑表达式
S
=
A
⊕
B
⊕
C
i
C
o
=
A
⋅
B
+
A
⋅
C
i
+
B
⋅
C
i
S= A \oplus B \oplus Ci \\Co=A\cdot B+A\cdot Ci+B\cdot Ci
S=A⊕B⊕CiCo=A⋅B+A⋅Ci+B⋅Ci
②给出 3 位全加器设计。
③使用 3 位全加器和逻辑门实现 3 位全减器电路(电路图与 Verilog HDL 语言)
【思路分析】列写出加法器和减法器的表达式
{
C
o
,
S
[
2
:
0
]
}
=
A
+
B
+
C
i
{
C
o
,
D
[
2
:
0
]
}
=
A
−
B
−
C
i
\{Co,S [2:0]\}=A+B+Ci \\ \{Co,D[2:0]\}=A-B-Ci
{Co,S[2:0]}=A+B+Ci{Co,D[2:0]}=A−B−Ci
【电路图】
关于我认为比较注意的点:
- 由于是全减器,可能作为更高位的减法器的组成部分,故给更高位的借位Co和给更低位的借位Ci必须保留,而不能直接置位为1
- 计算2-4来验证设计,不难得到 C o = 1 , D = 6 [ 110 ] 2 C_o=1,D=6[110]_2 Co=1,D=6[110]2 C o = 1 C_o=1 Co=1表示2-4的过程中需要向更高位借位。为什么 2 [ 010 ] 2 − 4 [ 100 ] 2 = 6 [ 110 ] 2 2[010]_2-4[100]_2=6[110]_2 2[010]2−4[100]2=6[110]2而不是-2的模值 [ 010 ] 2 [010]_2 [010]2?实际上是因为这里由于全减器可以向高位借位,故计算结果一定是正数。
也可以将3位全减器作为一个8位减法器的零部件去考虑就能明白,考虑40-24
其中红框部分是三位全减器承担的工作,正是
2
[
010
]
2
−
4
[
100
]
2
2[010]_2-4[100]_2
2[010]2−4[100]2,实际上它的计算结果是
6
[
110
]
2
6[110]_2
6[110]2才能使得两个八位数相减的结果是正确的。
【verilog语言】
module sub3();
input [2:0]A,[2:0]B;
input Ci;
output [2:0]D;
sadd3 add3(S,Co,A,!B,Ci);
assign D=!S;
endmodule
module sadd3();
input [2:0]A,[2:0]B;
input Ci;
output Co;
output [2:0]S
assign {Co,S}=A+B+Ci;
endmodule
2.时序电路设计(20分)
2.试设计一流水灯控制电路,灯循环变化规律为:从左到右点亮 4个灯,具体如图所示,每秒变化一次。此过程不断重复。
①试画出模块图,并标注输入输出信号。
②试给出状态转移图。
一般rst一般不作为输入信号,规范的写法可能是下面这种
③实现该时序电路(电路图与Verilog HDL描述都可以)
module LED();
input clk,rst;
output [3:0]LED;
parameter idle=0,s01,s1=2,s2=3,s3=4,s4=5;
always@(posedge clk)
if(rst)state<=idle;
else
state<=nstate;
always@(*) begin
case(state)
idle:begin nstate<=s0; LED<=4'b0000 end
s0: begin nstate<=s1; LED<=4'b0000 end
s1: begin nstate<=s2; LED<=4'b1000 end
s2: begin nstate<=s3; LED<=4'b1100 end
s3: begin nstate<=s4; LED<=4'b1110 end
s4: begin nstate<=s0; LED<=4'b1111 end
endcase
end
三,应用设计题
1.自动保温杯控制单元设计
某保温杯已经配有温度/电压转换器,温度采用摄氏度,其输出电压值=温度值/100(V),大于 100°C 输出 1V,小于 0°C 输出 0V。设计要求温度保持在 70°C 左右,采用 PWM 信号控制电热丝加热。
① 采用 ADC 对温度值进行测量,ADC 参考电压为 1V,温度测量精度可达 0.1°C。拟采用并行输出的 ADC,试确定输出位数,给出必要理由。(5 分)
【My Answer】
测量精度(分辨率)
Δ
=
0.
1
∘
C
\Delta=0.1 ^\circ C
Δ=0.1∘C,又由于需要区分的满量程为
F
S
R
=
10
0
∘
C
FSR=100^\circ C
FSR=100∘C,从ADC分辨率理论上讲
Δ
=
F
S
R
/
2
n
\Delta=FSR/2^n
Δ=FSR/2n
可以计算出输出位数n至少为10
②PWM 产生单元提供 3 种不同脉宽的 PWM 信号,脉宽分别为 0.2s、0.5s、0.8s,周期均为 1s。已知输入时钟为 1kHz,给出 PWM 产生单元的 Verilog HDL 描述,并进行必要的注释。(5 分)
【思路分析】
- 由时钟频率知1秒内1000个时钟周期
- 控制计数器翻转比较的数值CCR实现三种脉宽的切换
【顶层代码(My Answer)】
module pwm_gen();
input clk,rst;//时钟和复位,时钟为1KHz
input [10:0]ccr;
output pwm;//脉冲信号
reg[10:0]m;//时间计数
//计数器
always@(posedge clk or negedge rst) begin
if(!rst) m<=0;
else if(m==999)
m<=0;
else
m<=m+1;
end
//脉冲生成
always@(posedge clk or negedge rst)begin
if(!rst) pwm<=0;
else if(m==ccr)
pwm<=0;
else if(m==0)
pwm<=1;
end
endmodule
2、CPU相关
将 8 位数据D 保存至通用寄存器 R0、R1、R2、R3 之一。2 位信号 LS 用来选择目标寄存器,信号 LE 为锁存使能。所要保存的数据有两个来源,一个是运算结果 DT,另一个是存储器总线上的数据 DI。当保存存储器总线上的数据时,此时存储器读取控制信号 nRD 必为低电平,利用该信号来进行数据源选择。选择后的数据也可以用来更新 PC 值,数据 D 重定义为 PPC。其电路结构如图所示。
① 根据题意,补充功能表:
My Answer
② 试用Verilog实现该电路
【顶层代码(My answer)】
module RF();
input clk,LE,nRD;
input [7:0]DI,DT;
input [1:0]LS;
output [7:0]R0,[7:0]R1,[7:0]R2,[7:0]R3;
always@(posedge clk)begin
if(LE)
case({nRD,LS})
3'b000:R0<=DI;
3'b001:R0<=DT;
3'b010:R1<=DI;
3'b011:R1<=DT;
3'b100:R2<=DI;
3'b101:R2<=DT;
3'b110:R3<=DI;
3'b111:R3<=DT;
endcase
end
endmodule
3、片上系统
GPIO设备主要完成二进制量的输入与输出。GPIO接口电路有8位地址输入端A0- A7,1位数据输入输出端D0,读控制线nRD、写控制线nWR,GPIO端口P0。
① 1.假定GPIO端口基地址为0xF0,CR的地址为0xF0,ODR和IDR的片内地址皆为0x01。外部输入地址A7-A0,其中A0用于片内地址来选择寄存器,A7-A1则用来选择 GPIO接口,生成片选信号。填写功能表:
② 试用Verilog语言实现该接口。
【思路分析】
三态门的verilog实现是难点,可以采用inout双向端口实现
Verilog 双向端口
module dinout(din,z,clk,dout,dinout)
input [7:0] din;
input z;
input clk;
output [7:0] dout;
inout [7:0] dinout;
reg [7:0] dout;
reg [7:0] din_reg;
assign dinout = (!z)?din_reg:8’bz;
always @(posedge clk)
begin
if(!z)
din_reg=din;
else
dout=dinout;
end
endmodule
【My Answer】
module GPIO();
input D0;
nWR,nRD;
input A0;//位选
inout P0;
reg CR,IFR,ODR;
reg nCRE,nDRE;
assign P0=CR?ODR:1'bz;//三态门描述
always@(*) begin//位选译码器
case(A0)
1'b1:nCRE=0;
1'b0:nDRE=0;
endcase
end
always@(*) begin//CR寄存器
if({nRD,nCRE}==0)
CR<=D;
end
always@(*) begin//ODR寄存器
if({nRD,nDRE}==0)
ODR<=D;
end
always@(*)begin//IDR寄存器
if({nWR,nDRE}==0)
IDR<=P0;
end
endmodule
小结
- 考虑卷面代码均为手书,无调试机会,上文所有代码均未经过调试验证。
- 片上系统的题型一般会有正确合理的框图描述,verilog实现时尽量忠实地描述框图而少去做简化和改动