天天看点

第二课:3-8译码器

设计模块

module my_3_8(a,b,c,out);
	input a;
	input b;
	input c;
	output[7:0] out;
	//always里面的赋值语句无论最后在综合时是电路还是寄存器,在verilog语句中都要赋值为reg形式
	reg[7:0] out;
	[email protected](a,b,c)begin//表示a、b、c只要有任何值发生变动,都要执行里面的语句
		case({a,b,c})
			3'b000:
				out = 8'b00000001;
			3'b001:
				out = 8'b00000010;
			3'b010:
				out = 8'b00000100;
			3'b011:
				out = 8'b00001000;
			3'b100:
				out = 8'b00010000;
			3'b101:
				out = 8'b00100000;
			3'b110:
				out = 8'b01000000;
			3'b111:
				out = 8'b10000000;
			default:
				out = 8'b0;
		endcase
	end

endmodule 
           

验证模块

`timescale 1ns/1ps
module my_3_8_tb;
	
	reg a;
	reg b;
	reg c;
	wire[7:0] out;//out为8位的线网型,故需要定义长度:[7:0],最左边为最高位:out[7],反之为最低位:out[0]
	
	my_3_8 u0(
		.a(a),
		.b(b),
		.c(c),
		.out(out)
	);

	initial begin
		a=0;b=0;c=0;
		#100;
		a=0;b=0;c=1;
		#100;	
		a=0;b=1;c=0;
		#100;
		a=0;b=1;c=1;
		#100;	
		a=1;b=0;c=0;
		#100;
		a=1;b=0;c=1;
		#100;	
		a=1;b=1;c=0;
		#100;
		a=1;b=1;c=1;
		#100;	
		$stop;
	end
endmodule 
           

输出波形

第二课:3-8译码器

总结

教之第一课中的二选一多路器,这个模块主要有两个不同,

  1. 变量的位数增加,这个实验使用了8位的out变量,故在类型定义时有所不同。
  2. 这个实验“设计模块”中的out在综合时无论为寄存器型还是线网型,在always语句内部都要定义为寄存器reg型。虽然在这个always语句里面可以用assign语句进行替代,但使用了always语句,就要用reg型,如果替换成assign语句,就要用wire型。