FPGA学习02—实现简单的组合逻辑电路
组合逻辑是VerilogHDL设计中的一个重要组成部分。从电路本质上讲,组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数,与其他时刻的输入状态无关,无关存储电路,也没有反馈电路。
2.2.1 多路选择器
① 多路选择器的设计思路是两个按键输入(这里命名为in_1和in_2),再设一个按键为选择选择按键(sel),输出设为led灯(out)。绘制的波形图如下2-2-1所示:
图2-2-1
② 代码编写
module mux2_1
(
input wire [0:0] in_1,
input wire in_2,
input wire sel,
output reg out
);
if(sel == 1’b1)
out = in_1;
else
out = in_2;
endmodule
//这里使用了always语句,以及选择条件语句(if…else…),always语句中的*号表示检测该模块中的信号变化情况,当出现了信号跳变时,满足条件,执行该条件语句。
附:三种常用的组合逻辑的赋值方式如下图2-2-2:
图2-2-2
③ 仿真文件编写以及文件仿真,仿真结果如图2-2-3所示
`timescale 1ns/1ns
module tb_mux2_1();
reg in_1;
reg in_2;
reg sel ;
wire out ;
initial
begini
in_1 <= 1’b0;
in_2 <= 1’b0;
sel <= 1’b0;
end
always #10 in_1 <= {$random} %2;
always #10 in_2 <= {$random} %2;
always #sel <= {$random} %2;
initial
begin
$timeformat(-9,0,”ns”,6);
$monitor(“@time %t:in_1=%b in_2=%b out=%b”,$time,in_1,in_2,sel,out;)
end
mux2_1 mux2_1_inst
(
.in_1(in_1),
in_2(in_2),
.sel(sel),
.out(out)
);
endmodule
图2-2-3
④ 仿真结束后进行管脚绑定、综合和上板验证,如图2-2-4和图2-2-5所示,上板验证通过。
图2-2-4
图2-2-5
2.2.2 3-8译码器
译码器是一类多输入多输出组合逻辑电路器件,其可以分为:变量和显示译码两类。设计思路为使用三个按键为输入,8个led灯为输出。(该开发板中没有8个led灯,因此不做上板验证)
① 真值表、波形图以及代码编写(如图2-2-6),代码如下:
module decoder3_8
(
input wire in1 , //输入信号in1
input wire in2 , //输入信号in2
input wire in3 , //输入信号in2
output reg [7:0] out //输出信号out
);
case({in1, in2, in3})
3'b000 : out = 8'b0000_0001; //输入与输出的8种译码对应关系
3'b001 : out = 8'b0000_0010;
3'b010 : out = 8'b0000_0100;
3'b011 : out = 8'b0000_1000;
3'b100 : out = 8'b0001_0000;
3'b101 : out = 8'b0010_0000;
3'b110 : out = 8'b0100_0000;
3'b111 : out = 8'b1000_0000;
default: out = 8'b0000_0001;
endcase
endmodule
//这里使用了case选择语句
图2-2-6
② 仿真结果
图2-2-7 查看rtl视图
图2-2-8 Modelsim仿真
2.2.3 半加器
半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。是实现两个一位二进制数的加法运算电路。设计思路是使用两个按键作为输入的二进制数据,相加的和分别表示为sum和高位的count(使用key按键和led灯实现。)
① 波形图和真值表
图2-2-9 真值表、波形图绘制
② 代码编写
module half_adder
(
input wire int_1,
input wire int_2,
outout wire sum,
output wire count
);
assign {count,sum} = in_1 + im_2;
endmodule
//使用了assign语句做并位的加法,高位为count,低位为sum
③ 仿真结果
图2-2-10
2.2.4 全加器
全加器是在半加器的基础上的升级版,除了加数和被加数加的和外还要加上上一级传进来的进位信号。设计思路是使用两个半加器,再加上一个逻辑器件,如图2-2-11所示。
因为在全加器中要调用半加器的模块,使用半加器的模块实例化,因此要在工程中添加半加器的模块文件。(学习层次化的设计)
图2-2-11
代码编写
module full_adder
(
input wire in1 , //加数1
input wire in2 , //加数2
input wire cin , //上一级的进位
output wire sum , //两个数的加和
output wire cout //加和后的进位
);
wire h0_sum;
wire h0_cout;
wire h1_cout; /
half_adder half_adder_inst0
(
.in1 (in1 ),
.in2 (in2 ),
.sum (h0_sum ),
.cout (h0_cout)
);
half_adder half_adder_inst1
(
.in1 (h0_sum ),
.in2 (cin ),
.sum (sum ),
.cout (h1_cout) ut
);
//cout:总的进位信号
assign cout = h0_cout | h1_cout;
endmodule
//因为实例化后需要说明线路的信号,这里在第一个半加器的cout输出中使用了h0_cout表示,sum使用了h0_sum表示;第二个半加器中的cout使用了h1_cout表示,sum不变。h0_cout 和h1_cout使用assign语句表示。
综合后的结果如图2-2-12
图2-2-12