注:相应的源文件在文末的github链接中
实验五 在vivado中进行运算器的设计
一.实验要求
1、采用原理图方式设计4位加/减法器
2、实现4位ALU及应用设计
二.采用四个一位的全加器和附加逻辑设计两个四位数的加/减法器的实现
要求
采用四个一位的全加器和附加逻辑,根据图10设计两个四位数的加/减法器。要求编写与此电路对应的verilog代码。编写激励输入文件,激励文件要求放入实验报告。进行仿真,仿真截图放入实验报告。生成比特流文件,进行下载,下载后进行运行,只需要一张运行照片放入实验报告。
源文件
`timescale 1ns / 1ps
module adder_1bit(s,co,a,b,ci);
input a,b,ci;
output s,co;
wire c1,c2,c3;
and m0 (c1 ,a,b) ;
and m1 (c2 ,b ,ci) ;
and m2 (c3 ,a ,ci) ;
xor m3 (s1 ,a ,b) ;
xor m4 (s , s1,ci) ;
or m5(co ,c1 ,c2,c3) ;
endmodule
//模块 1位加减法
module addsub_1bit(S, Co, A, B, Ctrl, Ci);
input A, B, Ctrl, Ci;
output S, Co;
xor xor2(B1,B,Ctrl);
adder_1bit ad(S,Co,A,B1,Ci);
endmodule
module addsub_4bit(S,Co,Ctrl,A,B);
input[3:0] A,B;
input Ctrl;
output[3:0] S;
output Co;
wire [3:0] C;
wire n1, n2, a1, a2;
addsub_1bit as1_0(S[0], C[0], A[0], B[0], Ctrl, Ctrl);
addsub_1bit as1_1(S[1], C[1], A[1], B[1], Ctrl, C[0]);
addsub_1bit as1_2(S[2], C[2], A[2], B[2], Ctrl, C[1]);
addsub_1bit as1_3(S[3], C[3], A[3], B[3], Ctrl, C[2]);
not not1(n1,Ctrl);
not not2(n2,C[3]);
and and1(a1,C[3],n1);
and and2(a2,Ctrl,n2);
or or1(Co,a1,a2);
endmodule
激励文件(找不到在哪了,建议可以参考下文自己写一个)
三.采用与逻辑、或逻辑和数据选择器设计两个四位数的加/减法器,与运算、或运算的实现
要求
根据图15,采用与逻辑、或逻辑和四选一数据选择器设计两个四位数的加/减法器。要求编写与此电路对应的verilog代码。编写激励输入文件,激励文件要求放入实验报告。进行仿真,仿真截图放入实验报告。生成比特流文件,进行下载,下载后进行运行,只需要一张运行照片放入实验报告。
源文件
`timescale 1ns / 1ps
module adder_1bit(s,co,a,b,ci);
input a,b,ci;
output s,co;
wire c1,c2,c3;
and m0 (c1 ,a,b) ;
and m1 (c2 ,b ,ci) ;
and m2 (c3 ,a ,ci) ;
xor m3 (s1 ,a ,b) ;
xor m4 (s , s1,ci) ;
or m5(co ,c1 ,c2,c3) ;
endmodule
//模块 1位加减法
module addsub_1bit(S, Co, A, B, Ctrl, Ci);
input A, B, Ctrl, Ci;
output S, Co;
xor xor2(B1,B,Ctrl);
adder_1bit ad(S,Co,A,B,Ci);
endmodule
module addsub_4bit(S,Co,Ctrl,A,B);
input[3:0] A,B;
input Ctrl;
output[3:0] S;
output Co;
wire [3:0] C;
wire n1, n2, a1, a2;
addsub_1bit as1_0(S[0], C[0], A[0], B[0], Ctrl, Ctrl);
addsub_1bit as1_1(S[1], C[1], A[1], B[1], Ctrl, C[0]);
addsub_1bit as1_2(S[2], C[2], A[2], B[2], Ctrl, C[1]);
addsub_1bit as1_3(S[3], C[3], A[3], B[3], Ctrl, C[2]);
not not1(n1,Ctrl);
not not2(n2,C[3]);
and and1(a1,C[3],n1);
and and2(a2,Ctrl,n2);
or or1(Co,a1,a2);
endmodule
module myAnd2b4(C,A,B);
input [3:0] A,B;
output [3:0] C;
and and1(C[0],A[0],B[0]);
and and2(C[1],A[1],B[1]);
and and3(C[2],A[2],B[2]);
and and4(C[3],A[3],B[3]);
endmodule
module myOr2b4(C,A,B);
input [3:0] A,B;
output [3:0] C;
or or1(C[0],A[0],B[0]);
or or2(C[1],A[1],B[1]);
or or3(C[2],A[2],B[2]);
or or4(C[3],A[3],B[3]);
endmodule
module Mux4to1(a, b, c, d, select, out);
input wire [1:0] select;
input wire a,b,c,d;
output reg out;
always @(*) begin
case(select)
2'b00: out = 0;
2'b01: out = 0;
2'b10: out = c;
2'b11: out = d;
//default: out = 1'b0; // 如果选择信号无效,输出为0
endcase
end
endmodule
module Mux4to1b4(a, b, c, d, select, out);
input[1:0] select;
input[3:0] a, b, c, d;
output reg[3:0] out;
always @(*) begin
case(select)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
2'b11: out = d;
default: out = 4'b0000; // 如果选择信号无效,输出为0
endcase
end
endmodule
module addsub_4bitmux(C,Co,S,A,B);
input[3:0] A,B;
input[1:0] S;
output[3:0] C;
output reg Co;
wire [3:0] S1,C1,C2;
wire Co1;
Mux4to1b4 m1(S1, S1, C1, C2, S,C);
//Mux4to1 m2(1'b0,1'b0,Co1,Co1,Co);
always@(*) begin
if(S == 2'b00 | S == 2'b01)
Co = 1'b0;
else
Co = Co1;
end
addsub_4bit a4(S1,Co1, S[0],A,B);
myAnd2b4 ma(C1,A,B);
myOr2b4 mo(C2,A,B);
endmodule
激励文件(注意可能需要改变延时时间为自己的学号)
module addsub_4bitmux_tb();
wire[3:0] sum;
wire Co;
reg [3:0] a, b;
reg [1:0] cin;
addsub_4bitmux as4m(sum,Co,cin,a,b);
initial
begin//这个其实就是真值表的应用
a = 4'b0001; b = 4'b1010; cin = 2'b00;
#100 a = 4'b0010; b = 4'b1010; cin = 2'b01;
#100 a = 4'b0010; b = 4'b1110; cin = 2'b10;
#100 a = 4'b0011; b = 4'b1100; cin = 2'b11;
#100 a = 4'b0111; b = 4'b1001; cin = 2'b00;
#100 a = 4'b0001; b = 4'b1100; cin = 2'b01;
#100 a = 4'b0011; b = 4'b1100; cin = 2'b10;
#100 a = 4'b0111; b = 4'b1111; cin = 2'b11;
end
endmodule