与非门
第一种写法
比较简单,可以直接使用内置的与非门。
//2端口与非门
module nand_2(y,a,b);
input a,b;
output y;
nand(y,a,b);
endmodule
综合后的电路:
第二种写法
//2端口与非门 第二种写法
module nand_2(a,b,y);
input a,b;
output y;
reg y;//只有reg型变量可以在always块中被赋值
always@(a,b)
begin
case({a,b})//枚举
2'b00:y=1;
2'b01:y=1;
2'b10:y=1;
2'b11:y=0;
default:y='bx;//否则为高阻 为了安全最好加上default
endcase
end
endmodule
综合后的电路:
因为第二种方法用了case语句,所以会用到2-4译码器。
仿真
`timescale 1ns/1ps //定义仿真时间精度 延时1纳秒/精度为1皮秒
module nand_2_tb;
//激励信号定义,对应连接待测试模块的输入端口
reg signal_a;
reg signal_b;
//待检测信号定义,对应连接到待测试模块的输出端口
wire y;
//例化待测试模块
//将定义的三个端子连接在下面的模块上
nand_2(a,b,y) nand_2_0( //引入模块并命名为led_test0
.a(signal_a),
.b(signal_b),
.y(y);
//产生激励
initial begin //开始仿真
signal_a = 0; signal_b = 0; //三个按键的初始状态
#100; //延时100ns
signal_a = 0; signal_b = 1;
#100; //延时100ns
signal_a = 1; signal_b = 0;
#100; //延时100ns
signal_a = 1; signal_b = 1;
#200;
$stop;//仿真结束,不然会陷入循环
end //这里容易忘记
endmodule
如果仿真的时候显示没有输入,可能是写完仿真文件以后忘了综合。
结果与预期一致。
或非门
第一种写法
//二端口或非门 第一种写法
module nor_2(y,a,b);
input a,b;
output y;
nor(y,a,b);//注意第一个是输出端口
endmodule
综合后的电路:
第二种写法
//二端口或非门 第二种写法
module nor_2(a,b,y);
input a,b;
output y;
reg y;//只有reg型变量可以在always块中被赋值
always@(a,b)
begin
case({a,b})//枚举 这里是非阻塞赋值 为什么呢?
2'b00:y<=1;
2'b01:y<=0;
2'b10:y<=0;
2'b11:y<=0;
default:y='bx;//否则为高阻 为了安全最好加上default
endcase
end
endmodule
仿真
仿真文件可以直接用上面与非门的,改一下名字就行。
仿真之前别忘了先关闭刚刚已经运行一次的modelsim
异或门
第一种写法
//二端口异或门 第一种写法
module xor_2(y,a,b);
input a,b;
output y;
xor(y,a,b);//注意第一个是输出端口
endmodule
第二种写法
//二端口异或门 第二种写法
module xor_2(a,b,y);
input a,b;
output y;
reg y;//只有reg型变量可以在always块中被赋值
always@(a,b)
begin
case({a,b})//枚举 这里是非阻塞赋值 为什么呢?
2'b00:y<=0;
2'b01:y<=1;
2'b10:y<=1;
2'b11:y<=0;
default:y='bx;//否则为高阻 为了安全最好加上default
endcase
end
endmodule
仿真
出了点故障以后有机会再放图。
三态门
第一种写法
//二端口三态门 第一种写法
module tri_gate(dout,din,en);
input din,en;
output dout;
assign dout=en?din:'bz;
endmodule
第二种写法
//二端口三态门 第二种写法
module tri_gate(dout,din,en);
input din,en;
output dout;
reg dout;
always
if(en) dout<=din;
else dout<='bz;
endmodule
这里综合后的电路没区别。