资源描述
学生学号
0121410870432
实验成绩
学 生 实 验 报 告 书
实验课程名称
逻辑与计算机设计基础
开 课 学 院
计算机科学与技术学院
指导教师姓名
肖敏
学 生 姓 名
付天纯
学生专业班级
物联网1403
2015
--
2016
学年
第
一
学期
译码器的设计与实现
【实验要求】:
(1)理解译码器的工作原理,设计并实现n-2n译码器,要求能够正确地根据输入信号译码成输出信号。(2)要求实现2-4译码器、3-8译码器、4-16译码器、8-28译码器、16-216译码器、32-232译码器。
【实验目的】
(1)掌握译码器的工作原理;
(2)掌握n-2n译码器的实现。
【实验环境】
u Basys3 FPGA开发板,69套。
u Vivado2014 集成开发环境。
u Verilog编程语言。
【实验步骤】
一·功能描述
输入由五个拨码开关控制,利用led灯输出32种显示
二·真值表
三·电路图和表达式
四·源代码
module decoder_5(
input [4:0] a,
output [15:0] d0
);
reg [15:0] d0;
reg [15:0] d1;
always @(a)
begin
case(a)
5'b00000 :{d1,d0}=32'b1000_0000_0000_0000_0000_0000_0000_0000;
5'b00001 :{d1,d0}=32'b0100_0000_0000_0000_0000_0000_0000_0000;
5'b00010 :{d1,d0}=32'b0010_0000_0000_0000_0000_0000_0000_0000;
5'b00011 :{d1,d0}=32'b0001_0000_0000_0000_0000_0000_0000_0000;
5'b00100 :{d1,d0}=32'b0000_1000_0000_0000_0000_0000_0000_0000;
5'b00101 :{d1,d0}=32'b0000_0100_0000_0000_0000_0000_0000_0000;
5'b00110 :{d1,d0}=32'b0000_0010_0000_0000_0000_0000_0000_0000;
5'b00111 :{d1,d0}=32'b0000_0001_0000_0000_0000_0000_0000_0000;
5'b01000 :{d1,d0}=32'b0000_0000_1000_0000_0000_0000_0000_0000;
5'b01001 :{d1,d0}=32'b0000_0000_0100_0000_0000_0000_0000_0000;
5'b01010 :{d1,d0}=32'b0000_0000_0010_0000_0000_0000_0000_0000;
5'b01011 :{d1,d0}=32'b0000_0000_0001_0000_0000_0000_0000_0000;
5'b01100 :{d1,d0}=32'b0000_0000_0000_1000_0000_0000_0000_0000;
5'b01101 :{d1,d0}=32'b0000_0000_0000_0100_0000_0000_0000_0000;
5'b01110 :{d1,d0}=32'b0000_0000_0000_0010_0000_0000_0000_0000;
5'b01111 :{d1,d0}=32'b0000_0000_0000_0001_0000_0000_0000_0000;
5'b10000 :{d1,d0}=32'b0000_0000_0000_0000_1000_0000_0000_0000;
5'b10001 :{d1,d0}=32'b0000_0000_0000_0000_0100_0000_0000_0000;
5'b10010 :{d1,d0}=32'b0000_0000_0000_0000_0010_0000_0000_0000;
5'b10011 :{d1,d0}=32'b0000_0000_0000_0000_0001_0000_0000_0000;
5'b10100 :{d1,d0}=32'b0000_0000_0000_0000_0000_1000_0000_0000;
5'b10101 :{d1,d0}=32'b0000_0000_0000_0000_0000_0100_0000_0000;
5'b10110 :{d1,d0}=32'b0000_0000_0000_0000_0000_0010_0000_0000;
5'b10111 :{d1,d0}=32'b0000_0000_0000_0000_0000_0001_0000_0000;
5'b11000 :{d1,d0}=32'b0000_0000_0000_0000_0000_0000_1000_0000;
5'b11001 :{d1,d0}=32'b0000_0000_0000_0000_0000_0000_0100_0000;
5'b11010 :{d1,d0}=32'b0000_0000_0000_0000_0000_0000_0010_0000;
5'b11011 :{d1,d0}=32'b0000_0000_0000_0000_0000_0000_0001_0000;
5'b11100 :{d1,d0}=32'b0000_0000_0000_0000_0000_0000_0000_1000;
5'b11101 :{d1,d0}=32'b0000_0000_0000_0000_0000_0000_0000_0100;
5'b11110 :{d1,d0}=32'b0000_0000_0000_0000_0000_0000_0000_0010;
5'b11111 :{d1,d0}=32'b0000_0000_0000_0000_0000_0000_0000_0001;
default {d1,d0}=32'bxxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx;
endcase
end
endmodule
五·测试用例
映射:d0[0]:U16... ...d0[15]:LD15从左向右映射低位数段
输入:1111
输出:v16亮
学生学号
0121410870432
实验成绩
学 生 实 验 报 告 书
实验课程名称
逻辑与计算机设计基础
开 课 学 院
计算机科学与技术学院
指导教师姓名
肖敏
学 生 姓 名
付天纯
学生专业班级
物联网1403
2015
--
2016
学年
第
一
学期
数据选择器的设计与实现
【实验要求】:
(1) 理解数据选择器的工作原理,设计并实现2n选1的数据选择器,要求能够正确地根据输入的控制信号选择合适的输出。
(2) 要求实现21选1的数据选择器、22选1 的数据选择器、24选1的数据选择器、25选1的数据选择器,2n选1的数据选择器。
【实验目的】
(1)掌握数据选择器的工作原理;
(2)掌握2n选1的数据选择器的实现。
【实验环境】
u Basys3 FPGA开发板,69套。
u Vivado2014 集成开发环境。
u Verilog编程语言。
【实验步骤】
一.功能描述
由五个拨码开关控制选择,十一个拨码开关控制输入内部定义二十一位数,输出由一个led灯显示。
二·真值表
三. 表达式
四. 函数
module select_32_1(
input [10:0] in_sgn,
input [4:0] add_sgn,
output out_sgn
);
wire [20:0]in_in_sgn;
wire for_out_sgn;
wire back_out_sgn;
assign in_in_sgn=21'b0000_0000_0000_0000_00000;
select_16_1 sel16_1(.in_sgn({in_in_sgn[3:0],in_sgn[10:0]}),.add_sgn(add_sgn[3:0]),.out_sgn(for_out_sgn));
select_16_1 sel16_2(.in_sgn(in_in_sgn[20:4]),.add_sgn(add_sgn[3:0]),.out_sgn(back_out_sgn));
select_2_1 sel2_1(.in_sgn1(for_out_sgn),.in_sgn2(back_out_sgn),.add_sgn(add_sgn[4]),.out_sgn(out_sgn));
endmodule
module select_16_1(
input [11:0] in_sgn,
input [3:0] add_sgn,
output out_sgn
);
wire [3:0]in_in_sgn;
wire for_out_sgn;
wire back_out_sgn;
assign in_in_sgn=4'b0000;
select_8_1 sel8_1(.in_sgn(in_sgn[7:0]),.add_sgn(add_sgn[2:0]),.out_sgn(for_out_sgn));
select_8_1 sel8_2(.in_sgn({in_in_sgn[3:0],in_sgn[11:8]}),.add_sgn(add_sgn[2:0]),.out_sgn(back_out_sgn));
select_2_1 sel2_1(.in_sgn1(for_out_sgn),.in_sgn2(back_out_sgn),.add_sgn(add_sgn[3]),.out_sgn(out_sgn));
endmodule
module select_8_1(
input [7:0] in_sgn,
input [2:0] add_sgn,
output out_sgn
);
wire for_out_sgn;
wire back_out_sgn;
select_4_1 sel4_1(.in_sgn(in_sgn[3:0]),.add_sgn(add_sgn[1:0]),.out_sgn(for_out_sgn));
select_4_1 sel4_2(.in_sgn(in_sgn[7:4]),.add_sgn(add_sgn[1:0]),.out_sgn(back_out_sgn));
select_2_1 sel2_1(.in_sgn1(for_out_sgn),.in_sgn2(back_out_sgn),.add_sgn(add_sgn[2]),.out_sgn(out_sgn));
endmodule
module select_4_1(
input [3:0] in_sgn,
input [1:0] add_sgn,
output out_sgn
);
wire for_out_sgn;
wire back_out_sgn;
select_2_1 sel2_1(.in_sgn1(in_sgn[0]),.in_sgn2(in_sgn[1]),.add_sgn(add_sgn[0]),.out_sgn(for_out_sgn));
select_2_1 sel2_2(.in_sgn1(in_sgn[3]),.in_sgn2(in_sgn[2]),.add_sgn(add_sgn[0]),.out_sgn(back_out_sgn));
select_2_1 sel2_3(.in_sgn1(for_out_sgn),.in_sgn2(back_out_sgn),.add_sgn(add_sgn[1]),.out_sgn(out_sgn));
endmodule
module select_2_1(
input in_sgn1,
input in_sgn2,
input add_sgn,
output out_sgn
);
reg out_sgn;
always@(*)
begin
if(add_sgn==0) out_sgn=in_sgn1;
else out_sgn=in_sgn2;
end
endmodule
四. 电路图
五. 结果检验
选择线从大到小对应从左到右的左边五个拨码开关,输入从大到小对应剩下从左到右十一个拨码开关。任意选led灯一个对应输出。
只将最右边一个拨码开关打开,led灯亮。
学生学号
0121410870432
实验成绩
学 生 实 验 报 告 书
实验课程名称
逻辑与计算机设计基础
开 课 学 院
计算机科学与技术学院
指导教师姓名
肖敏
学 生 姓 名
付天纯
学生专业班级
物联网1403
2015
--
2016
学年
第
一
学期
ALU的设计与实现
【实验要求】:
(1) 理解全加器的工作原理,设计并实现1位,8位,32位全加器,能实现基本的加法运算。
(2) 设计并实现1位,8位,32位补码器,能够计算补码,从而实现加法和减法运算。
【实验目的】
实现1位,8位,32位全加器;实现1位,8位,32位补码运算;实现1位,8位,32位的加减法器。
【实验环境】
u Basys3 FPGA开发板,69套。
u Vivado2014 集成开发环境。
u Verilog编程语言。
【实验步骤】
一.功能描述
输入两个八位二进制数,最高位代表符号位,0代表正1代表负,输出八位led灯,一个代表结果符号,八位代表加减后的结果。
二. 真值表
二.表达式
四. Verilog代码描述
module bumaqi(
input [6:0] value,
Input sign,
output [7:0] comp
);
reg [7:0] comp;
always @(sign)
if(sign==1)
comp={sign,~value[6:0]+1};
Else
comp={sign,value[6:0]};
endmodule
module fulladd_2(
input a,
input b,
input x,
output s,
output c
);
wire s1,c1,c2;
xor xor1(s1,a,b);
xor xor2(s,s1,x);
and and1(c1,a,b);
and and2(c2,s1,x);
or or1(c,c1,c2);
endmodule
module fulljia(
input [7:0] a,
input [7:0] b,
output [7:0] s,
output c
);
wire [6:0] c_mid;
full2 fu1(.a(a[0]),.b(b[0]),.x(0),.c(c_mid[0]),.s(s[0]));
full2 fu2(.a(a[1]),.b(b[1]),.x(c_mid[0]),.c(c_mid[1]),.s(s[1]));
full2 fu3(.a(a[2]),.b(b[2]),.x(c_mid[1]),.c(c_mid[2]),.s(s[2]));
full2 fu4(.a(a[3]),.b(b[3]),.x(c_mid[2]),.c(c_mid[3]),.s(s[3]));
full2 fu5(.a(a[4]),.b(b[4]),.x(c_mid[3]),.c(c_mid[4]),.s(s[4]));
full2 fu6(.a(a[5]),.b(b[5]),.x(c_mid[4]),.c(c_mid[5]),.s(s[5]));
full2 fu7(.a(a[6]),.b(b[6]),.x(c_mid[5]),.c(c_mid[6]),.s(s[6]));
full2 fu8(.a(a[7]),.b(b[7]),.x(c_mid[6]),.c(c),.s(s[7]));
endmodule
module jiajian(
input [7:0] a,
input [7:0] b,
output [7:0] c,
output sign
);
wire [7:0]a_o;
wire [7:0]b_o;
wire [7:0]c_o;
bumaqi bu1(a[6:0],a[7],a_o[7:0]);
bumaqi bu2(b[6:0],b[7],b_o[7:0]);
fulljia fu(a_o[7:0],b_o[7:0],c_o[7:0],sign);
reg [7:0] c;
always@(c_o[7])
if(c_o[7])
c={c_o[7],~(c_o[6:0]-1)};
else
c=c_o[7:0];
if(c_o[7])
sign=0;
endmodule
五.电路图
六.结果检验
输入a为2,b为3,led灯显示正5.
输入a为2,b为负3,led灯显示负1.
学生学号
0121410870432
实验成绩
学 生 实 验 报 告 书
实验课程名称
逻辑与计算机设计基础
开 课 学 院
计算机科学与技术学院
指导教师姓名
肖敏
学 生 姓 名
付天纯
学生专业班级
物联网1403
2015
--
2016
学年
第
一
学期
计数器的设计与实现
【实验要求】:
(1) 利用D触发器设计并实现二进制计数器,要求实现216-1的计数;
(2) 利用D触发器设计并实现十进制计数器(BCD码),要求实现105-1的计数;
(3) 利用D触发器设计并实现3位纽环计数器。
【实验目的】
1. 掌握二进制和十进制计数器的设计与实现;
2. 掌握二进制和十进制计数器的集成;
3. 掌握纽环计数器的实现。
【实验环境】
u Basys3 FPGA开发板,69套。
u Vivado2014 集成开发环境。
u Verilog编程语言。
【实验原理】
【实验步骤】包括:功能描述,真值表,逻辑方程,电路图,Verilog代码实现(硬件映射代码),实验结果或者仿真结果
1)二进制计数器0~22实现
Q1n
Q0n
Q1n+1
Q0n+1
C
0
0
0
1
0
0
1
1
0
0
1
0
1
1
0
1
1
0
0
1
Q1n+1= Q1nQ0n
C=Q1nQ0n
2 十进制计数器
(1)十进制计数器0-9
Q3n
Q2n
Q1n
Q0n
Q3n+1
Q2n+1
Q1n+1
Q0n+1
C
0
0
0
0
0
0
0
1
0
0
0
1
0
0
1
0
0
0
1
0
0
0
1
1
0
0
1
1
0
1
0
0
0
1
0
0
0
1
0
1
0
1
0
1
0
1
1
0
0
1
1
0
0
1
1
1
0
1
1
1
1
0
0
0
1
0
0
0
1
0
0
1
1
0
0
1
0
0
0
0
1
Verilog代码实现
module jishuqi_60(
input clk,
input rst,
output reg [7:0]q
);
second_clk second(clk,clk_1);
wire [3:0]m;
wire c;
reg [3:0] n=4'b0000;
jishuqi_10 jishuqi2(clk_1,rst,m,c);
always@(posedge clk_1)
begin
if(c==1)case(n)
4'b0000: n<=4'b0001;
4'b0001: n<=4'b0010;
4'b0010: n<=4'b0011;
4'b0011: n<=4'b0100;
4'b0100: n<=4'b0101;
4'b0101: n<=4'b0110;
4'b0110: n<=4'b0111;
4'b0111: n<=4'b1000;
4'b1000: n<=4'b1001;
endcase
q<={n[3:0],m[3:0]};
end
endmodule
module jishuqi_10(
input clk_1,
input rst,
output reg [3:0]q,
output reg c
);
always@(posedge clk_1 or posedge rst)
begin
if(rst==1)q<=4'b0000;
case(q)
4'b0000:q<=4'b0001;
4'b0001: q<=4'b0010;
4'b0010: q<=4'b0011;
4'b0011: q<=4'b0100;
4'b0100: q<=4'b0101;
4'b0101: q<=4'b0110;
4'b0110: q<=4'b0111;
4'b0111: q<=4'b1000;
4'b1000: begin
q<=4'b1001;
c<=1;
end
4'b1001:begin
q<=4'b0000;
c<=0;
end
endcase
end
endmodule
module second_clk(
input clk,
output reg second_clk
);
reg [27:0] count=0;
parameter M=2;
always@(posedge clk)
begin
second_clk=0;
count<=count+1;
if(count==M) second_clk<=1;
if(count==2*M)
begin
second_clk<=0;
count<=0;
end
end
endmodule
结果仿真
学生学号
0121410870432
实验成绩
学 生 实 验 报 告 书
实验课程名称
逻辑与计算机设计基础
开 课 学 院
计算机科学与技术学院
指导教师姓名
肖敏
学 生 姓 名
付天纯
学生专业班级
物联网1403
2015
--
2016
学年
第
一
学期
计时器的设计与实现
【实验要求】:
根据计数器原理等设计并实现一个数字计时器,能够计秒、分、小时,在控制电路的作用下具有开机清零、复位清零等功能。并能够通过七段数码管显示时钟的秒和分。
【实验目的】
4. 掌握一些特殊进制(60进制、24进制)计数器的设计与实现;
5. 掌握由basys3提供的100MHZ系统主时钟生成1HZ时钟的方法;
6. 掌握数字计时器的实现方法:描述由1HZ的时钟驱动,秒钟60进1,分钟60进1,时针24进1;
7. 掌握将计时器显示在七段数码管上。
【实验环境】
u Basys3 FPGA开发板,69套。
u Vivado2014 集成开发环境。
u Verilog编程语言。
【实验原理】
【实验步骤】
实验思路:在上一次实验计数器的基础上进行以秒计数,再将一秒划分成两百份,让七段管以五十为刷新率刷新数据。
Verilog代码实现
module shi(
input clk,
input rst,
output reg [3:0] an,
output reg [6:0] b
);
wire [6:0]n;
wire [6:0]m;
wire [6:0]p;
wire [6:0]q;
wire c1,c2,c3,c4;
wire clk_1,clk_2;
reg rst_clk;
jishuqi_3600 jishuqi1(clk,rst,q,c4);
jishuqi_600 jishuqi1(clk,rst,p,c3);
jishuqi_60 jishuqi1(clk,rst,n,c2);
jishuqi_10 jishuqi2(clk,rst,m,c1);
third_clk third2(clk,clk_2);
always@(posedge clk_2 or posedge rst)
begin
rst_clk<=rst;
if(rst_clk)an<=4'b0111;
case(an)
4'b0111:begin an<=4'b1110;b<=m; end
4'b1110:begin an<=4'b1101;b<=n;end
4'b1101:begin an<=4'b1011;b<=p; end
4'b1011:begin an<=4'b0111;b<=q; end
endcase
end
endmodule
module jishuqi_3600(
input clk,
input rst,
output reg [6:0]q,
output reg c
);
second_clk second(clk,clk_1);
wire [6:0]m;
wire c1;
jishuqi_600 jishuqi4(clk,rst,m,c1);
always@(posedge clk_1 or posedge rst)
begin
begin
if(rst==1)q<=7'b0000_001;
end
if(c1==1)
case(q)
7'b0000_001: q<=7'b1001_111;
7'b1001_111: q<=7'b0010_010;
7'b0010_010: q<=7'b0000_110;
7'b0000_110: q<=7'b1001_100;
7'b1001_100: q<=7'b0100_100;
7'b0100_100: begin
q<=7'b0100_000;
c<=1;
end
7'b0100_000: begin
q<=7'b0000_001;
c<=0;
end
endcase
end
endmodule
module jishuqi_600(
input clk,
input rst,
output reg [6:0]q,
output reg c
);
second_clk second(clk,clk_1);
wire [6:0]m;
wire c1;
jishuqi_60 jishuqi3(clk,rst,m,c1);
always@(posedge clk_1 or posedge rst)
begin
begin
if(rst==1)q<=7'b0000_001;
end
if(c1==1)
case(q)
7'b0000_001: q<=7'b1001_111;
7'b1001_111: q<=7'b0010_010;
7'b0010_010: q<=7'b0000_110;
7'b0000_110: q<=7'b1001_100;
7'b1001_100: q<=7'b0100_100;
7'b0100_100: q<=7'b1000_000;
7'b1000_000: q<=7'b0001_111;
7'b0001_111: q<=7'b0000_000;
7'b0000_000: begin
q<=7'b0001_100;
c<=1;
end
7'b0001_100: begin
q<=7'b0000_001;
c<=0;
end
endcase
end
endmodule
module jishuqi_60(
input clk,
input rst,
output reg [6:0]q,
output reg c
);
second_clk second(clk,clk_1);
wire [6:0]m;
wire c1;
jishuqi_10 jishuqi2(clk,rst,m,c1);
always@(posedge clk_1 or posedge rst )
begin
begin
if(rst==1)q<=7'b0000_001;
end
if(c1==1)
case(q)
7'b0000_001: q<=7'b1001_111;
7'b1001_111: q<=7'b0010_010;
7'b0010_010: q<=7'b0000_110;
7'b0000_110: q<=7'b1001_100;
7'b1001_100: q<=7'b0100_100;
7'b0100_100: begin
q<=7'b0100_000;
c<=1;
end
7'b0100_000: begin
q<=7'b0000_001;
c<=0;
end
endcase
end
endmodule
module jishuqi_10(
input clk,
input rst,
output reg [6:0]q,
output reg c
);
second_clk second(clk,clk_1);
always@(posedge clk_1 or posedge rst)
begin
if(rst==1)q<=7'b0000_001;
case(q)
7'b0000_001: q<=7'b1001_111;
7'b1001_111: q<=7'b0010_010;
7'b0010_010: q<=7'b0000_110;
7'b0000_110: q<=7'b1001_100;
7'b1001_100: q<=7'b0100_100;
7'b0100_100: q<=7'b0100_000;
7'b0100_000: q<=7'b0001_111;
7'b0001_111: q<=7'b0000_000;
7'b0000_000:
begin
q<=7'b0001_100;
c<=1;
end
7'b0001_100:
begin
q<=7'b0000_001;
c<=0;
end
endcase
end
endmodule
module second_clk(
input clk,
output reg second_clk
);
reg [27:0] count=0;
parameter M=4;
always@(posedge clk)
begin
second_clk=0;
count<=count+1;
if(count==M) second_clk<=1;
if(count==2*M)
begin
second_clk<=0;
count<=0;
end
end
endmodule
module third_clk(
input clk,
output reg second_clk
);
reg [27:0] count=0;
parameter M=50000000;
always@(posedge clk)
begin
second_clk=0;
count<=count+1;
if(count==M) second_clk<=1;
if(count==2*M)
begin
second_clk<=0;
count<=0;
end
end
endmodule
仿真代码
module test_shi();
reg clk,rst;
wire [3:0]a;
wi
展开阅读全文