第2题:7 裁判电路设计
逻辑描述
三种不同的设计方式,实现7裁判电路设计。7位输入,1位输出,0表示不同意,1表示同意。
信号类型 | 变量数据类型及位宽 | 变量含义 |
---|---|---|
input | wire a,b,c,d,e,f,g | 七个裁判的输入信号,1表示同意,0表示不同意 |
output | wire out | 输出信号,1表示同意,0表示不同意 |
内部变量 | wire[2:0] sum | 计数有几个裁判同意 |
模块代码
- 方法一:assign语句:
module main(a,b,c,d,e,f,g,out); // 模块定义
input a,b,c,d,e,f,g; // 输入
output out; // 输出,1:表决通过,0:表决不通过
wire[2:0] sum;
assign sum=a+b+c+d+e+f+g;
assign out=sum[2]?1:0;
endmodule
- 方法二:模块调用
module main(a,out);
output out;
input[6:0] a;
wire[2:0] out1;
test lab001(a,out1);
assign out=out1[2]?1:0;
endmodule
module test(a,out);//子模块定义
input[6:0] a;
output[2:0] out;
assign out=a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6];
endmodule
- 方法三:always语句
module main(a,b,c,d,e,f,g,out);// 模块定义
input a,b,c,d,e,f,g;// 7位输入,1:同意,0:不同意
output out;// 输出,1:表决通过,0:表决不通过
reg[2:0] sum;
assign sum=a+b+c+d+e+f+g;
always@(a,b,c,d,e,f,g)
begin
if(sum[2]) out=1;
else out=0;
end
endmodule
测试代码
`timescale 1 ps/ 1 ps//自动生成大部分
module main_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg a;
reg b;
reg c;
reg d;
reg e;
reg f;
reg g;
// wires
wire out;
integer i;
// assign statements (if any)
main i1 (
// port map - connection between master ports and signals/registers
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g),
.out(out)
);
initial
begin
a=0; b=0; c=0; d=0; e=0; f=0; g=0;
for(i=0;i<128;i=i+1) // 对应二进制 0000000~1111111
begin
a=(i/1)%2;
b=(i/2)%2;
c=(i/4)%2;
d=(i/8)%2;
e=(i/16)%2;
f=(i/32)%2;
g=(i/64)%2;
#10; // 延时
end
$display("Running testbench");
end
initial
$monitor($realtime,,,"input:%d %d %d %d %d %d %d output:%d",a,b,c,d,e,f,g,out);
endmodule
测试结果
- 波形图
- 文本输出
结果分析
经过文本输出与波形图显示检验,有四个及以上1输入时输出为1,否则输出为0,符合七裁判电路的要求。
第3题:8-3优先编码显示电路
逻辑描述
现在由7----0(优先级高到低)八路输入(高电平1为有效电平),转换为3位二进制,进而转换为7位输出信号用于七段数码管的输出。
信号类型 | 变量数据类型及位宽 | 变量含义 |
---|---|---|
input | wire[7:0] in | 8个输入 |
output | reg[6:0] out | 输出信号,用于七段数码管显示 |
模块代码
module main(in,out);
input [7:0] in; // 8输入,1有效
output reg[6:0] out;// 7输出,用于七段管十进制数的显示
always@(in)
begin//开始编码,由于是优先编码器,所以从高位开始判断
if(in[7])
out=7'b1111000;
else if(in[6])
out=7'b0000010;
else if(in[5])
out=7'b0010010;
else if(in[4])
out=7'b0011001;
else if(in[3])
out=7'b0110000;
else if(in[2])
out=7'b0100100;
else if(in[1])
out=7'b1111001;
else if(in[0])
out=7'b1000000;
else
out=7'b1111111;
end
endmodule
测试代码
`timescale 1 ps/ 1 ps
module main_vlg_tst();
reg [7:0] in;
wire [6:0] out;
integer i;
main i1 (
.in(in),
.out7(out)
);
//上面都是自己生成的,莫改
initial
begin
for(i=0;i<256;i=i+1)
begin
// 十进制转二进制
in[0]=(i/1)%2;
in[1]=(i/2)%2;
in[2]=(i/4)%2;
in[3]=(i/8)%2;
in[4]=(i/16)%2;
in[5]=(i/32)%2;
in[6]=(i/64)%2;
in[7]=(i/128)%2;
#10; //延时10ms
end
end
initial
$monitor($realtime,,,"%b %b",in,out);
endmodule
测试结果
- 波形图
- 文本输出
结果分析
经过文本输出与波形图显示检验,本模块可以将8路输入信号转换成用于七段数码管显示的7路输出信号,经过与七段数码管原理图对比,本模块检验正确。
第4题:二进制数显示电路
逻辑描述
将8个拨动开关作为8位并行输入,即对应数码为 00000000---11111111,十进制数值为0-255,将编码对应的十进制数值显示在三个七段管上。
信号类型 | 变量数据类型及位宽 | 变量含义 |
---|---|---|
input | wire[7:0] in | 8路输入,高电平1为有效电平 |
output | reg[6:0] out1,out2,out3 | 三个数码管显示 |
内部变量 | wire[3:0] bai,shi,ge | 分别保存百十个位的值 |
模块代码
module main(in,out1,out2,out3);
input [7:0] in; // 8路输入,高电平1为有效电平
output reg[6:0] out1; //个位的数码管
output reg[6:0] out2; // 十位的数码管
output reg[6:0] out3; // 百位的数码管
wire[3:0] bai;
wire[3:0] shi;
wire[3:0] ge;
assign ge=in%10; // 个位赋值
assign shi=(in/10)%10; // 十位赋值
assign bai=in/100; // 百位赋值
always@(in)
begin
if(in<10)
begin
show(ge,out1); // 第一个七段管 显示个位
out2=7'b1111111; // 第二个七段管不显示
out3=7'b1111111; // 第三个七段管不显示
end
else if(in<100)
begin
show(ge,out1); // 第一个七段管 显示个位
show(shi,out2); // 第二个七段管 显示十位
out3=7'b1111111; // 第三个七段管不显示
end
else
begin
show(ge,out1); // 第一个七段管 显示个位
show(shi,out2); // 第二个七段管 显示十位
show(bai,out3); // 第三个七段管 显示百位
end
end
task show;//参考周孟卿的代码
input integer decc; // 输入,十进制数
output reg[6:0] outt; // 输出,7位二进制数值
if(decc==0) outt=7'b1000000; // 七段管显示0
else if(decc==1) outt=7'b1111001; // 七段管显示1
else if(decc==2) outt=7'b0100100; // 七段管显示2
else if(decc==3) outt=7'b0110000; // 七段管显示3
else if(decc==4) outt=7'b0011001; // 七段管显示4
else if(decc==5) outt=7'b0010010; // 七段管显示5
else if(decc==6) outt=7'b0000010; // 七段管显示6
else if(decc==7) outt=7'b1111000; // 七段管显示7
else if(decc==8) outt=7'b0000000; // 七段管显示8
else if(decc==9) outt=7'b0011000; // 七段管显示9
else outt=7'b1111111; // 七段管不显示
endtask
endmodule
测试代码
`timescale 1 ps/ 1 ps
module main_vlg_tst();
reg [7:0] in;
wire [6:0] out1;
wire [6:0] out2;
wire [6:0] out3;
integer i;
main i1 (
.in(in),
.out1(out1),
.out2(out2),
.out3(out3)
);
//以上为生成代码,以下是输入信号
initial
begin
// i对应二进制 00000000~11111111(8位),用于遍历in所有情况
for(i=0;i<256;i=i+1)
begin
in[0]=(i/1)%2;
in[1]=(i/2)%2;
in[2]=(i/4)%2;
in[3]=(i/8)%2;
in[4]=(i/16)%2;
in[5]=(i/32)%2;
in[6]=(i/64)%2;
in[7]=(i/128)%2;
#10; //延时10ms
end
$display("begin");
end
initial
$monitor($realtime,,,"dec:%d bit:%b %b %b",in,out3,out2,out1); //监视器
endmodule
测试结果
- 波形图
- 文本输出
结果分析
经过文本输出与波形图显示检验,本模块可以将8路输入信号转换成3位十进制数,并通过三个七段数码管输出,符合要求。
第5题:8 位二进制乘法
逻辑描述
两个8位二进制数a,b,c=a*b;将输入a,b和结果c显示到七段管上。
信号类型 | 变量数据类型及位宽 | 变量含义 |
---|---|---|
input | wire[7:0] ina,inb | 两个8路输入啊和b |
output | reg[6:0] out1,out2,out3,out4,out5 | 5个数码管显示 |
output | reg[15:0] out | a和b的乘积 |
output | reg[3:0] result1,result2,result3,result4,result5 | 乘积的每一位 |
模块代码
module main(ina,inb,out,out1,out2,out3,out4,out5,result1,result2,result3,result4,result5);
input[7:0] ina;
input[7:0] inb;
output reg[3:0] result1;
output reg[3:0] result2;
output reg[3:0] result3;
output reg[3:0] result4;
output reg[3:0] result5;
output reg[15:0] out;
output reg[6:0] out1;
output reg[6:0] out2;
output reg[6:0] out3;
output reg[6:0] out4;
output reg[6:0] out5;
always@(ina,inb)
begin
out=ina*inb;
result1=out/10000;
result2=out/1000%10;
result3=out/100%10;
result4=out/10%10;
result5=out%10;
if(out<=9)
begin
out1=7'b1111111;
out2=7'b1111111;
out3=7'b1111111;
out4=7'b1111111;
show(result5,out5);
end
else if(out<=99)
begin
out1=7'b1111111;
out2=7'b1111111;
out3=7'b1111111;
show(result4,out4);
show(result5,out5);
end
else if(out<=999)
begin
out1=7'b1111111;
out2=7'b1111111;
show(result3,out3);
show(result4,out4);
show(result5,out5);
end
else if(out<=9999)
begin
out1=7'b1111111;
show(result2,out2);
show(result3,out3);
show(result4,out4);
show(result5,out5);
end
else
begin
show(result1,out1);
show(result2,out2);
show(result3,out3);
show(result4,out4);
show(result5,out5);
end
end
task show;
input integer result;
output[6:0] out;
if(result==0) out=7'b0111111;
else if(result==1) out=7'b0000110;
else if(result==2) out=7'b1011011;
else if(result==3) out=7'b1001111;
else if(result==4) out=7'b1100110;
else if(result==5) out=7'b1101101;
else if(result==6) out=7'b1111101;
else if(result==7) out=7'b0000111;
else if(result==8) out=7'b1111111;
else if(result==9) out=7'b1100111;
else out=7'b1111111;
endtask
endmodule
测试代码
`timescale 1 ps/ 1 ps
module main_vlg_tst();
reg eachvec;
reg [7:0] ina;
reg [7:0] inb;
wire [6:0] out1;
wire [6:0] out2;
wire [6:0] out3;
wire [6:0] out4;
wire [6:0] out5;
wire [15:0] out;
wire [3:0] result1;
wire [3:0] result2;
wire [3:0] result3;
wire [3:0] result4;
wire [3:0] result5;
integer i,j;//添加变量
main i1 (
.ina(ina),
.inb(inb),
.out1(out1),
.out2(out2),
.out3(out3),
.out4(out4),
.out5(out5),
.out(out),
.result1(result1),
.result2(result2),
.result3(result3),
.result4(result4),
.result5(result5)
);
//以上为自动生成,以下为输入信号
initial
begin
for(i=0;i<256;i=i+1)
begin
inb=i;
for(j=0;j<256;j=j+1)
begin
ina=j;
#10;
end
end
$display("begin");
end
initial
$monitor($realtime,,,"ina: %b inb: %b out1: %b out2: %b out3: %b out4: %b out5: %b out: %d result1: %d result2: %d result3: %d result4: %d result5: %d",ina,inb,out1,out2,out3,out4,out5,out,result1,result2,result3,result4,result5);
endmodule
测试结果
- 波形图
- 文本输出
结果分析
经过文本输出与波形图显示检验,本模块可以将两路8位输入相乘得到一个最多五位十进制的数字,并通过5个七段数码管输出,符合要求。