自学数字设计,针对《数字系统设计教程》中部分思考题做整理
第5章思考题
1.为什么建议在编写verilog语句时,如果用到if 语句,建议大家把else 情况也考虑在内?
2.用if else if else 语句和用case endcase 表示不同的条件下多个分支是完全相同的,还是有什么不同?
3.如果case语句的分支条件没有覆盖所有的组合可能,定义了default和没有定义有什么不同?
4.仔细阐述case,casex 和casez之间的不同?
5.forever 语句如果运行了,在它下面的语句是否还能运行?它位于begin end 和位于fork join 之间有什么不同?
6.forever 语句和repeat语句是否能独立于过程块存在,即能否不在initial 或者always块中存在?
7.用for循环语句为存储器许多单元赋值时是否需要时间?为什么如果不定义时间延迟,他可以不需要时间就把不管多大的存储器赋值完毕?
8.for循环是否可以表示可以综合的组合逻辑?请举例说明。
9.比较
10.声明一个名为oscillate 的寄存器变量并将它初始化为0,其每30个时间单位进行一次取反操作。不要使用always块
11.设计一个时钟周期为40个时间单位的时钟信号,其占空比为25%。使用always和initial块进行设计,将其在仿真0时刻的值初始化为0
12.见程序
13.12中包括的是非阻塞过程赋值语句,则答案是什么?
14.下面例子中的d最终值是什么?
15.设计带有同步清零信号的D触发器,使用设计出的D触发器输出一个周期为10个时间单位的时钟信号;
16.同15,设计出带有异步清零信号的D触发器
17.用wait语句设计一个电平敏感的锁存器,该锁存器的输入信号为d和clock,输出为q;其功能为clock=1时,q=d;
18.使用条件语句完成四选一多路选择器设计,外部端口必须保持不变
19.使用case语句设计八功能的算术运算单元(ALU)
20.使用While循环语句设计一个时钟信号发生器。其时钟信号的初值为0,周期为十个时间单位。
21.使用for 语句完成寄存器类型数组初始化
22.使用forever 语句完成一个时钟信号,周期为10,占空比为百分之40,初值为0;
答:
1.因为如果没有配套的else语句,在不满足if条件语句时,会保持原来的状态,从而产生一个锁存器,并不是产生高阻态。
2.不是完全相同的,首先case语句更加直观,其次case语句提供了处理分支表达式中存在高阻态z与不定值z的情况
3.产生锁存器的区别
4.case是全等x是x,z是z,casez是z与任何值都相等,不将z进行比较,casex是x和z与任意值都相等,不将x和z进行比较
5.不能运行,fork是并行的,forever并不影响下面语句的运行
6.forever语句不能独立于过程块,而repeat能够独立于过程块
7.for语句如果定义了时间延迟则需要时间,否则不需要时间。因为循环的边界是确定的,那么在综合时该循环语句被认为是重复的硬件结构。
8.for语句实现的乘法器可以综合,可以表示可综合的组合逻辑。
9.第一个不能按照时间节拍进行赋值,第二个可以
10. reg oscillate
initial
beigin oscillate=0;
forever #30 oscillate=~oscillate ; oscillate=!oscillate;
end
11. initial
begin
clock=1; cnt=0;
forever #30 clock=~clock
always #30 clock=~clock
initial
begin
clock=0;
always
begin
#30 clock=0;
#10 clock=1;
end
end
12.
000;
13
顺序不一定,阻塞赋值一共经历35个时间单位,非阻塞赋值一共经历20个时间单位
14. 1 b=0,c=0 b或c=0