一,简答题
1.数字电路与模拟电路有什么区别?数字电路有哪些优点,试举例说明。(10分)
My answer:
模拟电路与数字电路的区别
(1)处理的信号不同,模拟电路处理的是时间和幅度连续变化的模拟信号,而数字电路处理的是用“0”和“1”两个基本数字符号表示的离散信号。
(2)研究的着重点不同 研究模拟电路时关心的是电路输入与输出之间的大小、相位、效率、保真等问题,要计算出信号的实际数值;而研究数字电路时关心的是输入与输出之间的逻辑关系。数字电路只需判别数字信号的有无,不必反映数字信号本身的实际数值。
(3)研究的方法不同 模拟电路主要分析方法有解析法、微变等效电路法、图解法等,而数字电路的主要分析方法有真值表、逻辑代数、卡诺图、波形图等。
数字电路的优点
(1)稳定性好:数字电路不像模拟电路那样易受噪声的干扰。
(2)可靠性高:数字电路中只需分辨出信号的有与无,故电路的组件参数,可以允许有较大的变化(漂移)范围。
(3)可长期存储:数字信息可以利用某种媒介,如磁带、磁盘、光盘等进行长时期的存储。
(4)便于计算机处理:数字信号的输出除了具有直观、准确的优点外,最主要的还是便于利用电子计算机来进行信息的处理。
(5)便于高度集成化:由于数字电路中基本单元电路的结构比较简单,而且又允许组件有较大的分散性,这就使我们不仅可把众多的基本单元做在同一块硅片上,同时又能达到大批量生产所需要的良率。
My Question:
数字电路的优点的例子?
\color{red}数字电路的优点的例子?
数字电路的优点的例子?
2.化简下列逻辑方程。要求画出卡诺图,化简为最简与或式。(10分)
F(a,b,c,d)= ∏ \prod ∏M(0,2,4,5,8,10,12,14)
My answer:
关于逻辑方程化简,该帖讲解详细
https://blog.csdn.net/weixin_66578482/article/details/125931372
step1 由于是要求解最简与或式而非最简或与式,先将上式化简为最小项形式
F
(
a
,
b
,
c
,
d
)
=
∑
m
(
1
,
3
,
6
,
7
,
9
,
11
,
13
,
15
)
F(a,b,c,d)=\sum m(1,3,6,7,9,11,13,15)
F(a,b,c,d)=∑m(1,3,6,7,9,11,13,15)
检查最大项和最小项之和为
2
4
=
16
2^4=16
24=16,说明化简无遗缺
step2 做出卡诺图
step 3 由卡诺图可知,最简与或式共有四项如图,一种化简结果为
F
(
a
,
b
,
c
,
d
)
=
a
‾
b
‾
d
+
a
b
ˉ
c
+
a
d
F(a,b,c,d)=\overline{a} \overline{b}d+a\bar{b}c+ad
F(a,b,c,d)=abd+abˉc+ad
3.假设有两个8位2的补码数,a[7:0]和b[7:0]。这些数字相加以产生s[7:0]。还要计算是否发生了(有符号)溢出。试写出Verilog语言(10分)
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
); //
// assign s = ...
// assign overflow = ...
endmodule
【问题分析】
- 什么是“2的补码数”,理解为二进制补码数可能有助于问题的分析
- 补码的加减法运算, a [ 补码 ] + b [ 补码 ] = ( a + b ) [ 补码 ] a_{[补码]}+b_{[补码]}={(a+b)}_{[补码]} a[补码]+b[补码]=(a+b)[补码]
- 有符号溢出
【逻辑算式】
- s最终的结果也是补码形式
- 需要设计全加器组成带进位的八位全加器,
p
l
u
s
plus
plus表示全加
{ o v e r f l o w , s u m [ 7 : 0 ] } = a p l u s b \{overflow,sum[7:0]\}=a\quad plus\quad b {overflow,sum[7:0]}=aplusb
【模块实现】
- 全加器
module fulladder(s, cout, a, b, cin);
//输入输出端口定义
output s, cout;
input a, b, cin;
//采用行为描述的方式实现1位全加器
assign s = a ^ b ^ cin;
assign cout = a & b | a & cin | b & cin;
endmodule
另一种全加器的描述方法
module fulladder(A,B,CI,S,CO)
input A,B,CI;
output S,CO;
assign {CO,S}=A+B+CI;
endmodule
- 带进位的8位加法器
module 8_fulladder(a,b,sum,overflow);
output [7:0] sum;
output overflow;
input [7:0] a , [7:0] b;
wire [6:0] carry;
fulladder m0(sum[0],carry[0],a[0],b[0],0);
fulladder m1(sum[1],carry[1],a[1],b[1],carry[0]);
fulladder m2(sum[2],carry[2],a[2],b[2],carry[1]);
fulladder m3(sum[3],carry[3],a[3],b[3],carry[2]);
fulladder m4(sum[4],carry[4],a[4],b[4],carry[3]);
fulladder m5(sum[5],carry[5],a[5],b[5],carry[4]);
fulladder m6(sum[6],carry[6],a[6],b[6],carry[5]);
fulladder m7(sum[7],overflow,a[7],b[7],carry[6]);
endmodule
【顶层代码(My answer)】
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow;
); //
wire c0,c1,c2;
assign {c0,s}=a+b;
assign c1=a[6]+b[6];
assign c2=a[7]+b[7];
assign overflow=c1^c2;
endmodule
二,分析设计题
1.组合电路设计(20分)
① 试给出2位4x1多路复用器模块框图,标注输入输出信号
② 试给出2位4x1多路复用器模块框图,标注输入输出信号
③ 使用2位4x1多路复用器实现下列函数(仅使用一个,说明设计思路,用框图实现)
F 1 ( a , b , c ) = a c ˉ + b ˉ c F_1(a,b,c)=a\bar{c}+\bar{b}c F1(a,b,c)=acˉ+bˉc F 2 ( a , b ) = ∑ m ( 1 , 3 ) F_2(a,b)=\sum m(1,3) F2(a,b)=∑m(1,3)
两函数必须仅用一个2位4x1同时实现
2.时序电路设计(20分)
试设计控制电路,每当输入X从0变为1时,Y在两个时钟周期内应保持为1,然后返回到0–即使X仍为1。
①试画出模块图,并标注输入输出信号。
②试给出状态转移图。
③实现该时序电路(电路图与Verilog HDL描述都可以)
module design(X,clk,rst,Y);
input X,clk;
output reg Y;
reg [1:0] count;//计数标志位
reg flag;//触发标志位
//计数器
always@(posegde clk or negedge rst) begin
if(!rst)count<=2'b00;
else if (flag==1'b1 ) begin
if(count==2'b10)
count<=2'b00;
else count<=count+1;
end
end
//上升沿触发
always@(posedge X or negedge rst ) begin
flag<=1'b1;
if(!rst) begin
Y<=1'b0;
flag<=1'b0;
end
else if(count==2'b10 && Y==1'b1) begin
Y<=1'b0;
flag<=1'b0;
end
else begin
Y<=1'b1;
flag<=1'b1;
end
end
三,应用设计题
1.舵机控制单元设计
某舵机的控制需要一个20ms的时基脉冲,该脉冲的高电平部分为0.5ms-2.5ms范围,脉冲的宽度将决定转动的角度。例如:1.5毫秒的脉冲,电机将转向 90 度的位置。如果脉冲宽度小于 1.5 毫秒,那么电机轴向朝向0度方向。如果脉冲宽度大于 1.5 毫秒,轴向就朝向180度方向 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5fb61439c8174cc88cedeedf38e32184.png#pic_center)
① 通过两个按键 key1, key2 来控制 PWM 信号调节舵机转动的角度,key1 每按下一次,角度减少 5°,key2 每按下一次,角度增加 5°。试确定两个按键按下后的调节的脉宽,给出必要计算过程。(5 分)
设两个按键按下后调节的脉宽为
x
x
x,key1按下一次增加
x
x
x,key2按下一次减小
x
x
x,设档位有
y
y
y个
y
=
18
0
∘
5
∘
=
36
y=\frac{180^{\circ}}{5^{\circ}}=36
y=5∘180∘=36
那么在2ms的时钟周期内需要有36个不同的档位,解得
x
≤
2
36
m
s
=
0.05
5
…
m
s
x \leq \frac{2}{36}ms=0.055^…ms
x≤362ms=0.055…ms
取
x
=
0.05
m
s
x =0.05ms
x=0.05ms,当脉冲宽度为0.5ms时,舵机方向为
0
∘
0^{\circ}
0∘,脉冲宽度为1.4ms时,舵机方向为
9
0
∘
90^{\circ}
90∘,脉冲宽度为2.3ms时,舵机方向为
18
0
∘
180^{\circ}
180∘
② 假设输入时钟的频率可以自行设定,给出舵机控制单元的 Verilog HDL 描述,并进行必要的注释。(5 分)
【思路分析】
- 按键最小调节脉宽为0.05ms,以此为时钟周期可以分频产生其他脉冲宽度
- 设计脉冲宽度可调的脉冲发生模块,可以采用计数器实现
【顶层代码(My Answer)】
module pps(clk,rst,q,key1,key2);
input clk,rst;//时钟和复位,时钟为20KHz
input key1,key2;//按键
output reg q;//脉冲信号
reg[10:0]m;//时间计数
reg[10:0]N;//占空比控制
//计数器
always@(posedge clk or negedge rst) begin
if(!rst) m<=0;
else if(m==399)
m<=0;
else
m<=m+1;
end
//脉冲生成
always@(posedge clk or negedge rst)begin
if(!rst) q<=0;
else if(m==N)
q<=0;
else if(m==0)
q<=1;
end
//占空比调节
always@(*)begin
if(!rst) N<=10;
else begin
case({key1,key2}):
2'b10:N<=N+1;
2'b01:N<=N-1;
2'b00:N<=N;
2'b11:N<=N;
default:N<=N;
endcase
end
end
endmodule
2、CPU相关
假定 ALU 只支持 8 位二进制数的加、减、与、或、非、左移 1 位、右移 1 位、赋值等操作,如图所示。两个 8 位输入 S1 和 S2,一个 8 位输出 DT,另一个输出为进位标志位 FLG。
① 根据题意,补充功能表:
My answer
修正:
ARM中进位标志位C的四种置位情况
C 可以有4种方法设置C的值:
- 加法运算(包括CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
- 减法运算(包括CMP):当运算时产生了借位时(无符号数溢出),C=0,否则C=1。
- 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
- 对于其它的非加/减运算指令,C的值通常不会改变。
② 试用Verilog实现该电路
【思路分析】
- 规范写法应该构建全加器全减器模块,考试时间原因,采用快速的方法
- 考虑到8位数运算结果的复杂程度和应用,与或非采用按位与或非而不采用逻辑与或非,二者区别可参见下面博客总结【HDLbits刷题笔记 】01-verilog语法-基础部分
【顶层代码(M与answer)】
module ALU(opr,s1,s2,dst,flg);
input [7:0]s1,[7:0]s2;
input[2:0]opr;
output [7:0]dst;
output flg;
always@(*)begin
case(opr)
3'b001:{flg,dst}<=s1+s2;
3'b010:{flg,dst}<=s1-s2;
3'b011:{flg,dst}<={1'b0,s1&s2};
3'b100:{flg,dst}<={1'b0,s1|s2};
3'b101:{flg,dst}<={1'b0,~s1};
3'b110:{flg,dst}<={2'b0,s1[6:0]};
3'b111:{flg,dst}<={s1[7],s1[6:0],1'b0};
default:{flg,dst}<=0;
endcase
end
endmodule
3、片上系统
PWM设备接口电路有8位地址输入端A0-A7,8位数据输入输出端D0-D7,写控制线 nWR,设备端口PWM 。
①该接口有三个寄存器,CR、ARR和CCR的片内地址分别为0、1和2,采用两个地址线进行译码。假定接口基地址为0xF4,则CR、ARR和CCR地址分别为0xF4、0xF5和0xF6。填写功能表:
②试用Verilog语言实现该接口。
My answer
①填写功能表:
②Verilog实现
【问题分析】对一个接口的verilog实现,第一步是确定顶层模块的接口输入输出,整个大的模块是阴影部分,仅有一个输出是PWM,其他信号均为这个模块的输入。第二步是分析其中各个模块的输入输出以及模块的逻辑(组合or时序)
【My answer】
module port();
input CLK,nWR;
input [7:0] A,[7 :0]D;
output PWM;
reg [7:0]CR,ARR,CCR;
//地址读取,片选
always@(*)begin
if(!nWR)
case(A)
0xF4:CR<=D;
0xF5:ARR<=D;
0xF6:CCR<=D;
endcase
end
//减法计数器
always@(posedge CLK)begin
if(CR) begin
if(Q>0)
Q<=Q-1;
else if(Q==0)
Q<=ARR;
end
end
//PWM生成
always@(*)begin
if(Q>CCR)
PWM<=1'b1;
else
PWM<=1'b0;
end
endmodule
小结
- 考虑卷面代码均为手书,无调试机会,上文所有代码均未经过调试验证。
- 数电模拟题中,考虑到时长为2小时,分析时尽可能不要将问题复杂化
- verilog实现是多种实现方式中较快捷的方式。