Verilog没有葵花宝典——day4(组合逻辑)

题目

  1. 什么是竞争和冒险?
  2. 设计一个2-4译码器。
  3. 输入一个8bit数,输出其中1的个数。如果只能使用1bit全加器,最少需要几个?
  4. 如果一个标准单元库只有三个cell:2输入mux(o = s ?a :b;),TIEH(输出常数1),TIEL(输出常数0),如何实现以下功能?
    1. 反相器inv
    2. 缓冲器buffer
    3. 两输入与门and2
    4. 两输入或门or2
    5. 四输入的mux mux4
    6. 一位全加器 fa

1. 什么是竞争和冒险?

这个题以前做过,自己总结了一篇比较详细的内容:通过做verilog99题的第11题学习竞争与冒险

冒险:在信号传输与状态变换时会发生的延迟(Delay)。事实上,由于这些延迟,当输入信号发生变化时,其输出信号不能立即跟随输入信号的变化而变化,而是经过一段过渡时间后才能达到原先所期望的状态,从而可能产生瞬间的错误输出,造成逻辑功能的瞬时紊乱。这种现象被称为逻辑电路的“冒险现象”(Hazard),简称“险象”。

产生冒险的原因——竞争:在组合逻辑电路中,输入信号的变化传输到电路各级门时,在时间上有先有后,这种先后所形成的时间差称为竞争(Competition)。

2. 设计一个2-4译码器。

verilog描述

module decoder2_4(
	input		[1:0]	a,
	output	reg	[3:0]	b
);
always @ (*)
	case(a)
		2'b00:b=4'b1110;
		2'b01:b=4'b1101;
		2'b10:b=4'b1011;
		2'b11:b=4'b0111;
		default:b=4'b1111;
	endcase
endmodule

门级电路图

电路图在下面,因为反相器、与非门和或非门是cmos集成电路的基本单元,所以选择了这样的实现形式。

卡诺图化简 2-4译码器门级电路图

3. 输入一个8bit数,输出其中1的个数。如果只能使用1bit全加器,最少需要几个?

verilog描述

module test_20(
	input 	[7:0]	i_data,
	output	[3:0]	o_count
);
assign o_count = ((i_data[0] + i_data[1] + i_data[2]) + (i_data[3] + i_data[4] +  i_data[5]) + i_data[6]) + i_data[7];

endmodule

本题至少使用几个1bit全加器

下图使用八个1来说明。参考链接

全加器计数

4. 使用2输入mux(o = s ?a :b;),TIEH(输出常数1),TIEL(输出常数0)实现以下功能。

4.1-4.5
4.6
module mux2com(
    input       a,
    input       b,
    input       c,
    input       d,

    input       s0,s1,

    output      f_inv,
    output      f_buffer,
    output      f_and2,
    output      f_or2,
    output      f_mux4,

    output      adder_sum,
    output      adder_carry
    );

assign f_inv = a ? 0 : 1;

assign f_buffer = a ? 1 : 0;

assign f_and2 = a ? b : 0;

assign f_or2 = a ? 1 : b;

assign f_mux4 = s1 ? (s0?a:b) : (s0?c:d);

assign adder_sum = (a?(b?0:1):b)?(c?0:1):c;     
assign adder_carry = (c?b:0)?1:((c?a:0)?1:(b?a:0));
endmodule

即将入行的数字IC设计工程师