学习笔记之三人表决器FPGA
新手入门,多多包涵,不足错误之处,望指出
三人表决器,顾名思义就是三人投票,只要达到两票以上,就取胜。
设a,b,c为三个投票的人,输出的为f,投为1,不投为0,两票以上为1,否则为0;其逻辑情况如下表列出:
a | b | c | f |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
我们将这种逻辑关系用verilog语言来表示,过程快用always语句,当然也可以用assign语句来表示,只需求出它的逻辑关系式。
Verilog设计代码如下
module bjq3(a,b,c,f);
input a,b,c;
output f;
reg f;
always@(*)
begin
case({a,b,c})
3'b000 : f = 1'b0;
3'b001 : f = 1'b0;
3'b010 : f = 1'b0;
3'b011 : f = 1'b1;
3'b100 : f = 1'b0;
3'b101 : f = 1'b1;
3'b110 : f = 1'b1;
3'b111 : f = 1'b1;
default : f = 1'b0;
endcase
end
endmodule
RTL级生成电路:
如图所示,直接生成了一个ROM,输入口为a,b,c;输出口为f。
接下来我们需要写一个测试文件,我的测试文件如下:
`timescale 1ns / 1ps
module sim_bjq3();
reg a;
reg b;
reg c;
wire f;
bjq3 il(
.a(a),
.b(b),
.c(c),
.f(f)
);
initial
begin
a = 0;
b = 0;
c = 0;
forever
begin
#({$random}%100)
a = ~a;
#({$random}%100)
b = ~b;
#({$random}%100)
c = ~c;
end
end
endmodule
测试文件我用了随机函数,当然自己设值也是可以的。
仿真图如下:
从仿真图我们可以看出,它与我们想要实现的功能一致。