数字逻辑实验报告
西安工程大学
实 验 报 告
课 程 __FPGA 数字逻辑设计教程__________ 系 别 __计算机科学学院_________________ 实 验 日 期 _2012_ 年_11_ 月_10_ 日----_26_ 日 专 业 班 级 _软件工程11级02班___________ 实 验 报 告 日 期 _2012_ 年_11_ 月_27_ 日 姓 名 __王林庆__________ 学 号 __[1**********]______
教 师 审 批 评 分________________________________
实验一 2输入逻辑门的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真 2、学会程序下载
二、实验步骤
1、编写文本文件并编译 2、软件仿真 3、进行硬件配置
(后面实验相同) 三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台 2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同 3、图所示电路包含6个不同的逻辑门
a b
Z[5]
Z[4]
Z[3]
Z[2]
Z[1]
Z[0]
四、实验体会
实验过程中遇到了的问题:
1、实验源代码中有语法错误,标点符号运用不当,与C 语言混淆。 2、在仿真的时候不能出现正确的仿真图,原因是在仿真时没有在add simulate here 添加待测的变量。
实验体会:虽然有了实验指导书上详细的指导步骤,看似很简单,但做起
来很难,对整个流程不熟,做起来很慢。之前这个软件在电脑上总是安装不了,头都大了,只得在同学的电脑上做,勉强做完了第一个实验,有了点感觉,还得练练。
五、实验源代码
1、2输入逻辑门的源代码
module gates2 (
input wire a, input wire b, output wire[5:0]z );
assign z[5] = a&b; assign z[4] = ~(a&b); assign z[3] = a|b;
assign z[2] = ~(a|b);
assign z[1] = a^b; assign z[0] = a~^b; endmodule
2、测试代码: #200
a
#200
b
a
2、2输入逻辑门的约束条件:
NET "a" LOC = "T5"; NET "b" LOC = "V8"; NET "z[0]" LOC = "T11"; NET "z[1]" LOC = "R11"; NET "z[2]" LOC = "N11"; NET "z[3]" LOC = "M11"; NET "z[4]" LOC = "V15"; NET "z[5]" LOC = "U15";
#200 b
六、实验仿真结果
实验二 2位比较器的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真 2、学会程序下载
二、实验步骤
1、编写文本文件并编译 2、软件仿真 3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台 2、用ISE 软件进行设计开发时基于相应器件型号的。
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同。 3、图为二位比较器的真值表
b[1] b[0] a[1] d[0]0 0 0 00 0 0 10 0 1 00 0 1 10 1 0 00 1 0 10 1 1 00 1 1 11 0 0 01 0 0 11 0 1 01 0 1 11 1 0 01 1 0 11 1 1 01 1 1 1
a_eq_b a_gt_b a_lt_b
1 0 00 1 00 1 00 1 0 0 0 1 1 0 00 1 00 1 00 0 10 0 11 0 00 1 00 0 10 0 10 0 11 0 0
四、实验体会
实验过程中遇到的问题:
1、在仿真的时候没有出现的正确的仿真图,是因为没有先综合,就直接仿真导致出现了错误。
2、在实现时map 出现警示,不知道是什么原因
实验体会:做实验要认真,同样的错误不要反复出现。虽然照着实验指导书
磕磕碰碰的做出来了,但有些地方还是不懂,又觉得老师上课讲了,看来上课还得认真听啊。相比上次实验,有点小进步。
五、实验源代码
1、2位比较器的源代码:
module comp2bit(
input wire [1:0] a, input wire [1:0] b, output wire a_eq_b, output wire a_gt_b, output wire a_lt_b );
assign a_eq_b = ~b[1] & ~b[0] & ~a[1] & ~a[0]
| ~b[1] & b[0] & ~a[1] & a[0] | b[1] & ~b[0] & a[1] & ~a[0] | b[1] & b[0] & a[1] & a[0]; assign a_gt_b = ~b[1] & a[1] | ~b[1] & ~b[0] & a[0]
| ~b[0] & a[1] & a[0]; assign a_lt_b = b[1] & ~a[1]
|b[1] & b[0] & ~a[0] | b[0] & ~a[1] & ~a[0]; endmodule
2、测试代码:
# 200;
a = 0; b = 0; #200 a=0; b=1; # 200; a=1; b=0; # 200; a=1; b=1; 3、2位比较器的约束文件:
NET "a[0]" LOC = "T5"; NET "a[1]" LOC = "V8"; NET "b[0]" LOC = "M8"; NET "b[1]" LOC = "V9"; NET "a_eq_b" LOC = "T11"; NET "a_gt_b" LOC = "R11"; NET "a_lt_b" LOC = "N11";
六、实验仿真结果
实验三 4位2选一多路选择器
的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真 2、学会程序下载
二、实验步骤
1、编写文本文件并编译 2、软件仿真 3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台 2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同 3、图所示为4位2选1多路选择器原理图
[a3..a0]
[b3..b0]
0a 1b
四、实验体会
实验过程中遇到了的问题:无法显示仿真结果,原因是没有把工程管理区中
view 选项设置为Simulation 。
实验体会:这个实验做得不是很顺,把指导书看了半天,又在同学的帮助,
下才有了结果 。不容易啊,为什么老师三下五除二就搞定了,我费了九牛二虎之力才出来?只能说对问题只知其一,不知其二,要下大功夫,不然真就白学了。
五、实验源代码
1、4位2选一多路选择器: module mux24a(
input wire [3:0] a, input wire [3:0] b, input wire s,
output wire [3:0] y);
assign y = {4{~s}} & a | {4{s}} & b; endmodule
2、测试代码:
a = 0; b = 0; s = 0; #100; a=0; b=0; s=1; #100; a=0; b=0; s=1; #100;
a=0; b=1; s=0; #100; a=0; b=1; s=1; #100; a=1; 3、实验的约束文件:
NET "a[0]" LOC = "T5"; NET "a[1]" LOC = "V8"; NET "a[2]" LOC = "U8"; NET "a[3]" LOC = "N8"; NET "b[0]" LOC = "M8"; NET "b[1]" LOC = "V9"; NET "b[2]" LOC = "T9"; NET "b[3]" LOC = "T10"; NET "s" LOC = "C9";
NET "y[0]" LOC = "T11"; NET "y[1]" LOC = "R11"; NET "y[2]" LOC = "N11"; NET "y[3]" LOC = "M11";
b=0; s=0; #100; #100; b=0; #100; #100; a=1; b=0; s=0; a=1; s=1; a=1; b=1; s=0; a=1; b=1; s=1;
六、实验仿真结果
实验四 7段译码器的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真 2、学会程序下载
二、实验步骤
1、编写文本文件并编译 2、软件仿真 3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台 2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同 3、图所示为7段译码器原理图
1 = off0 = onb d c
四、实验体会
实验过程中遇到了的问题:有了之前问题解决的基础,这次实验没
出大问题,一些小问题属于粗心。
实验体会:实验要多练才会有感觉。对着指导书的每一步很流畅的 做下去,只要理解了就没什么大问题。多尝试,比如说
ISE 上其他功能键的作用,点击试一下也能多了解些。
做了四个实验,对实验流程也有了大概的了解,也有信
心做好下面实验。
五、实验源代码
1、七段译码器的源代码:
module hex7seg (
input wire [3:0] x,
output reg [6:0] a_to_g,
output wire [3:0] an
);
assign an=4'b0000;
always @ ( * )
case (x)
0: a_to_g = 7'b0000001;
1: a_to_g = 7'b1001111;
2: a_to_g = 7'b0010010;
3: a_to_g = 7'b0000110;
4: a_to_g = 7'b1001100;
5: a_to_g = 7'b0100100;
6: a_to_g = 7'b0100000;
7: a_to_g = 7'b0001111;
8: a_to_g = 7'b0000000;
9: a_to_g = 7'b0000100;
'hA: a_to_g = 7'b0001000;
'hB: a_to_g = 7'b1100000;
'hC: a_to_g = 7'b0110001;
'hD: a_to_g = 7'b1000010;
'hE: a_to_g = 7'b0110000;
'hF: a_to_g = 7'b0111000;
default: a_to_g = 7'b0000001; // 0
endcase
endmodule
2、测试代码:
#200;
x=0;
#200;
x=1;
3、七段数码管的约束文件:
NET "x[0]" LOC = "T5";
NET "x[1]" LOC = "V8";
NET "x[2]" LOC = "U8";
NET "x[3]" LOC = "N8";
NET "a_to_g[0]" LOC = "L14";
NET "a_to_g[1]" LOC = "N14";
NET "a_to_g[2]" LOC = "M14";
NET "a_to_g[3]" LOC = "U18";
NET "a_to_g[4]" LOC = "U17";
NET "a_to_g[5]" LOC = "T18";
NET "a_to_g[6]" LOC = "T17";
NET "an[0]" LOC = "N16";
NET "an[1]" LOC = "N15";
NET "an[2]" LOC = "P18";
NET "an[3]" LOC = "P17";
六、实验仿真结果
实验五 7段显示管的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真
2、学会程序下载
二、实验步骤
1、编写文本文件并编译
2、软件仿真
3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台
2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同
3、在2个7段显示管上显示一个2位的十六进制数
四、实验体会
实验过程中遇到了的问题:忘在工程中添加UCF 文件
实验体会:因为这个实验老师在课上演示过,做起来还比较顺利,所
以说认真上课也是实验的基础 。而且做了这些实验,对生活中的一些机器的工作原理有了点概念,虽然比较模糊。
五、实验源代码
1、七段显示管的源代码:
module x7seg (
input wire [7:0] x,
input wire clk,
input wire clr,
output reg [6:0] a_to_g,
output reg [3:0] an,
output wire dp
);
wire s;
reg [3:0] digit;
wire [3:0] aen;
reg [19:0] clkdiv;
assign dp = 1;
assign s = clkdiv[19]; // count every 5.2 ms
assign aen = 4'b1111; // enable all digits
// 4位 4选1 MUX: mux44
always @ ( * )
case (s)
0: digit = x[3:0];
1: digit = x[7:4];
default: digit = x[3:0];
endcase
// 7段数码管:hex7seg
always @ ( * )
case (digit)
0: a_to_g = 7'b0000001;
1: a_to_g = 7'b1001111;
2: a_to_g = 7'b0010010;
3: a_to_g = 7'b0000110;
4: a_to_g = 7'b1001100;
5: a_to_g = 7'b0100100;
6: a_to_g = 7'b0100000;
7: a_to_g = 7'b0001111;
8: a_to_g = 7'b0000000;
9: a_to_g = 7'b0000100;
'hA: a_to_g = 7'b0001000;
'hB: a_to_g = 7'b1100000;
'hC: a_to_g = 7'b0110001;
'hD: a_to_g = 7'b1000010;
'hE: a_to_g = 7'b0110000;
'hF: a_to_g = 7'b0111000;
default: a_to_g = 7'b0000001; // 0
endcase
// Digit select: ancode
always @ ( * )
begin
an = 4'b1111;
if (aen[s] == 1)
an[s] = 0;
end
// 时钟分频器
always @ (posedge clk or posedge clr)
begin
if (clr == 1)
clkdiv
else
clkdiv
end
endmodule
2、测试代码:
x = 0;
clk = 0;
clr = 0;
#100;
x = 0;
clk = 0;
clr = 1;
#100;
x = 0;
clk = 1;
clr = 0;
#100;
x = 1;
clk = 0;
clr = 0;
#100;
x = 1;
clk = 0;
clr = 1;
3、七段数码管的约束文件:
NET "x[0]" LOC = "T5";
NET "x[1]" LOC = "V8";
NET "x[2]" LOC = "U8";
NET "x[3]" LOC = "N8";
NET "x[4]" LOC = "M8";
NET "x[5]" LOC = "V9";
NET "x[6]" LOC = "T9";
NET "x[7]" LOC = "T10";
NET "clr" LOC = "C9";
NET "clk" LOC = "V10";
NET "a_to_g[0]" LOC = "L14";
NET "a_to_g[1]" LOC = "N14";
NET "a_to_g[2]" LOC = "M14";
NET "a_to_g[3]" LOC = "U18";
NET "a_to_g[4]" LOC = "U17";
NET "a_to_g[5]" LOC = "T18";
NET "a_to_g[6]" LOC = "T17";
NET "an[0]" LOC = "N16";
NET "an[1]" LOC = "N15";
NET "an[2]" LOC = "P18";
NET "an[3]" LOC = "P17";
NET "dp" LOC = "M13";
六、实验仿真结果
实验六 3-8译码器的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真
2、学会程序下载
二、实验步骤
1、编写文本文件并编译
2、软件仿真
3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台
2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同
3、图所示为3-8译码器的真值表
四、实验体会
实验过程中遇到了的问题:
1、无法显示仿真结果,原因是没有把工程管理区中view 选项设置为Simulation 。
2、在仿真的时候不能出现正确的仿真图,原因是在仿真时没有在add simulate here 添加待测的变量。
实验体会:感觉有点难,但用心做还是做出来了,前面的实验也不是白
做的。
五、实验源代码
1、3-8译码器:
module decode38a(
input wire [2:0] a,
output wire [7:0] y
);
assign y[0] = ~a[2] & ~a[1] & ~a[0];
assign y[1] = ~a[2] & ~a[1] & a[0];
assign y[2] = ~a[2] & a[1] & ~a[0];
assign y[3] = ~a[2] & a[1] & a[0];
assign y[4] = a[2] & ~a[1] & ~a[0];
assign y[5] = a[2] & ~a[1] & a[0];
assign y[6] = a[2] & a[1] & ~a[0];
assign y[7] = a[2] & a[1] & a[0];
endmodule
2、测试代码:
a[0] = 0;
a[1] = 0;
a[2] = 0;
// Wait 100 ns for global reset to finish
3、3-8译码器的约束文件:#100; // Add stimulus here #100 a[0] = 0; a[1] = 0; a[2] = 1; #100 a[0] = 0; a[1] = 1; a[2] = 0; #100 a[0] = 0; a[1] = 1; a[2] = 1; #100 a[0] = 1; a[1] = 0; a[2] = 0; #100 a[0] = 1; a[1] = 0; a[2] = 1; #100 a[0] = 1; a[1] = 1; a[2] = 0; #100 a[0] = 1; a[1] = 1; a[2] = 1;
NET "a[0]" LOC = "T5";
NET "a[1]" LOC = "V8";
NET "a[2]" LOC = "U8";
NET "y[0]" LOC = "T11";
NET "y[1]" LOC = "R11";
NET "y[2]" LOC = "N11";
NET "y[3]" LOC = "M11";
NET "y[4]" LOC = "V15";
NET "y[5]" LOC = "U15";
NET "y[6]" LOC = "V16";
NET "y[7]" LOC = "U16";
六、实验仿真结果
实验七 8-3优先编码器的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真
2、学会程序下载
二、实验步骤
1、编写文本文件并编译
2、软件仿真
3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台
2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同
3、图所示为8-3优先编码器的真值表
四、实验体会
这次实验做得比较顺利,过程中没出现什么问题,对实验步骤也熟悉了不
少,熟能生巧就是这样的吧,感觉很好。
五、实验源代码
1、8-3优先编码器:
module pencode83(
input wire [7:0] x,
output reg [2:0] y,
output reg valid
);
integer i;
always @ ( * )
begin
y = 0;
valid = 0;
for (i = 0; i
if (x[i] ==1)
begin
y = i;
valid = 1;
end
end
endmodule
2、测试代码:
x[0] = 0;
x[1] = 0;
x[3] = 0;
x[4] = 0;
x[5] = 0;
x[6] = 0;
x[7] = 0;
#100;
x[0] = 0;
x[1] = 0;
x[2] = 0;
x[3] = 0;
x[4] = 0;
x[5] = 0;
x[6] = 0;
x[7] = 1;
#100;
x[0] = 0;
x[1] = 0;
x[2] = 0;
x[3] = 0;
x[4] = 0;
x[5] = 0;
x[6] = 1;
x[7] = 0;
#100;
x[0] = 0;
x[1] = 0;
x[2] = 0;
x[3] = 0;
x[4] = 0;
x[5] = 1;
x[6] = 0;
x[7] = 0;
#100;
x[0] = 0;
x[1] = 0;
x[2] = 0;
x[3] = 0;
x[4] = 1;
x[5] = 0;
x[6] = 0;
x[7] = 0;
#100;
x[0] = 0;
x[2] = 0;
x[3] = 1;
x[4] = 0;
x[5] = 0;
x[6] = 0;
x[7] = 0;
#100;
x[0] = 0;
x[1] = 0;
x[2] = 1;
x[3] = 0;
x[4] = 0;
x[5] = 0;
x[6] = 0;
x[7] = 0;
#100;
x[0] = 0;
x[1] = 1;
x[2] = 0;
x[3] = 0;
x[4] = 0;
x[5] = 1;
x[6] = 0;
x[7] = 0;
#100;
x[0] = 0;
x[1] = 1;
x[2] = 0;
x[3] = 0;
x[4] = 0;
x[5] = 0;
x[6] = 1;
x[7] = 1;
#100;
x[0] = 0;
x[1] = 0;
x[2] = 1;
x[3] = 0;
x[4] = 0;
x[5] = 1;
x[6] = 0;
x[7] = 1;
#100;
x[1] = 1;
x[2] = 1;
x[3] = 1;
x[4] = 1;
x[5] = 1;
x[6] = 1;
x[7] = 1;
3、83优先编码器的约束文件:
NET "x[0]" LOC = "T5";
NET "x[1]" LOC = "V8";
NET "x[2]" LOC = "U8";
NET "x[3]" LOC = "N8";
NET "x[4]" LOC = "M8";
NET "x[5]" LOC = "V9";
NET "x[6]" LOC = "T9";
NET "x[7]" LOC = "T10";
NET "y[0]" LOC = "T11";
NET "y[1]" LOC = "R11";
NET "y[2]" LOC = "N11";
NET "valid" LOC = "M11";
六、实验仿真结果
实验八 4位二进制-BCD 码转换器
的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真
2、学会程序下载
二、实验步骤
1、编写文本文件并编译
2、软件仿真
3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台
2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同
3、图8所示为4位二进制-BCD 码转换器的真值表
四、实验体会
实验过程中遇到了的问题:在仿真的时候不能出现正确的仿真图,原因是
在仿真时没有在add simulate here 添加待测的变量。
实验体会:不得不承认实验指导书是个很好的老师,感觉自己现在做得挺
不错的,相比之前不会做有了很大的进步。做实验时,流程已慢慢
在心中形成,做实验的时间也少了。
五、实验源代码
1、4位BCD 吗转换器:
assign p[1] = b[3] & b[2] & ~b[1] | ~b[3] & b[1];
2、测试文件:module binbcd4( input wire [3:0] b, output wire [4:0] p ); assign p[4] = b[3] & b[2] | b[3] & b[1]; assign p[3] = b[3] & ~b[2] & ~b[1]; assign p[2] = ~b[3] & b[2] | b[2] & b[1]; assign p[0] = b[0]; endmodule
b[0]=0;
b[1]=0;
b[2]=0;
b[3]=0;
#100;
b[0]=0;
b[1]=0;
b[2]=1;
b[3]=0;
#100;
b[0]=0;
b[1]=1;
b[2]=0;
b[3]=1;
#100;
b[0]=0;
b[1]=1;
b[2]=1;
b[3]=0;
#100;
b[0]=1;
b[1]=0;
b[2]=0;
b[3]=1;
#100;
b[0]=1;
b[1]=0;
b[2]=1;
b[3]=1;
#100;
b[0]=1;
b[1]=1;
b[2]=0;
b[3]=0;
#100;
b[0]=1;
b[1]=1;
b[2]=1;
b[3]=0;
3、4位BCD 码转换器的约束文件:
NET "b[3]" LOC ="T5";
NET "b[2]" LOC ="V8";
NET "b[1]" LOC ="U8";
NET "b[0]" LOC ="N8";
NET "p[4]" LOC ="T11";
NET "p[3]" LOC ="R11";
NET "p[2]" LOC ="N11";
NET "p[1]" LOC ="M11";
NET "p[0]" LOC ="V15
六、实验仿真结果
实验九 4位加法器的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真
2、学会程序下载
二、实验步骤
1、编写文本文件并编译
2、软件仿真
3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台
2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同
3、图所示为4位加法器框图
四、实验体会
虽然实验过程中出了点小错误,但总体还是比较顺利,已经基本可以脱离指导书了,有点成就感。
五、实验源代码
1、4位加法器:
module adder4a(
input wire [3:0]a,
input wire [3:0]b,
output wire [3:0]s,
output wire cf,
output wire ovf
);
wire [4:0] c;
assign c[0]=0;
assign s = a ^ b ^ c[3:0];
assign c[4:1] = a & b | c[3:0] & (a ^ b);
assign cf = c[4];
assign ovf = c[3] ^ c[4];
endmodule
2、测试代码:
a[0] = 0;
a[1]=0;
a[2]=0;
a[3]=0;
b[0]= 0;
b[1]=0;
b[2]=0;
b[3]=0;
#100;
a[0] = 0;
a[1]=1;
a[2]=0;
a[3]=1;
b[0]= 0;
b[1]=0;
b[2]=1;
b[3]=1;
#100;
a[0] = 0;
a[1]=1;
a[2]=1;
a[3]=1;
b[0]= 1;
b[1]=0;
b[2]=1;
b[3]=1;
3、4位加法器的约束文件:
NET "a[0]" LOC = "T5";
NET "a[1]" LOC = "V8";
NET "a[2]" LOC = "U8";
NET "a[3]" LOC = "N8";
NET "b[0]" LOC = "M8";
NET "b[1]" LOC = "V9";
NET "b[2]" LOC = "T9";
NET "b[3]" LOC = "T10";
NET "s[0]" LOC = "T11";
NET "s[1]" LOC = "R11";
NET "s[2]" LOC = "N11";
NET "s[3]" LOC = "M11";
NET "ovf" LOC = "U15";
六、实验仿真结果
实验十 4位移法器的设计与实现
一、实验目标
1、使用ISE 软件设计并仿真
2、学会程序下载
二、实验步骤
1、编写文本文件并编译
2、软件仿真
3、进行硬件配置
三、实验原理
1、ISE 软件是一个支持数字系统设计的开发平台
2、用ISE 软件进行设计开发时基于相应器件型号的
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同
3、图所示为4位移位器框图和功能表
s2
s1
s0s2 s1 s0
000
001
010
011
100
101
110
111noshift shr shl ror rol asr ror2noshift d30d2d0d2d3d1d3d2d3d1d3d1d30d2d1d2d0d2d0d2d3d1d0d10d1d3d1d2d0
四、实验体会
做实验时,感觉很得心应手,基本脱离了实验指导书,就可以做出来,对ISE 工具的使用也变的熟悉了,整个的实验做的很有收获。
五、实验源代码
1、4移加法器的代码:
module shift4(
input wire [3:0] d,
input wire [2:0] s,
output reg [3:0] y
);
always@(*)
case(s)
0: y = d; // noshift
1: y= {1'b0,d[3:1]}; // shr
2: y= {d[2:0],1'b0}; // shl
3: y= {d[0],d[3:1]}; // ror
4: y= {d[2:0],d[3]}; // rol
5: y= {d[3],d[3:1]}; // asr
6: y= {d[1:0],d[3:2]}; // ror2
7: y= d; // noshift
default: y = d;
endcase
endmodule
2、测试代码:
1、d[0] = 0;
d[1]=0;
d[2]=0;
d[3]=0;
s[0]= 0;
s[1]=0;
s[2]=0;
#100;
d[0] = 0;
d[1]=0;
d[2]=0;
d[3]=0;
s[0]= 0;
s[1]=0;
s[2]=1;
#100;
d[0] = 0;
d[1]=0;
d[2]=0;
d[3]=0;
s[0]= 0;
s[1]=1;
s[2]=0;
#100;
d[0] = 0;
d[1]=1;
d[2]=0;
d[3]=1;
s[0]= 1;
s[1]=1;
s[2]=0;
#100;
d[0] = 0;
d[1]=1;
d[2]=1;
d[3]=1;
s[0]= 0;
s[1]=1;
s[2]=0;
#100;
d[0] = 1;
d[1]=1;
d[2]=0;
d[3]=1;
s[0]= 0;
s[1]=1;
s[2]=0;
2、d = 0;
s = 0;
#100;
3、4位移法器的约束文件:
NET "d[3]" LOC ="T5";
NET "d[2]" LOC ="V8";
NET "d[1]" LOC ="U8";
NET "d[0]" LOC ="N8";
NET "s[2]" LOC ="M8";
NET "s[1]" LOC ="V9";
NET "s[0]" LOC ="T9";
NET "y[3]" LOC ="T11";
NET "y[2]" LOC ="R11";
NET "y[1]" LOC ="N11";
NET "y[0]" LOC ="M11";
六、实验仿真结果
实验十一 带有置位和清零端的
边沿D 触发器的设计与实现
一、实验介绍
这个实验将指导你通过使用ISE 软件进行带有置位和清零端的边沿D 触发器的设计与实现。
二、实验目标
∙ 使用ISE 软件设计并仿真。
∙ 学会程序下载。
三、实验步骤
1. 编写文本文件并编译
2. 软件仿真
3. 进行硬件配置
四、实验原理
1.ISE 软件是一个支持数字系统设计的开发平台
2.用ISE 软件进行设计开发时基于相应器件型号的。
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同。
3.图11-1所示为带有置位和清零端的边沿D 触发器的逻辑图,本实验中用Verilog 语句来描述。
q
~q
图11-1
五、实验代码
1.带有置位和清零端的边沿D 触发器的verilog 源代码
module flipflopcs (
input wire clk,
input wire D,
input wire set,
input wire clr,
output q,
output notq
);
wire f1, f2, f3, f4, f5, f6;
assign #5 f1 = ~ (f4 & f2 & ~set);
assign #5 f2 = ~(f1 & f5 & ~clr);
assign #5 f3 = ~(f6 & f4 & ~set);
assign #5 f4 = ~(f3 & clk & ~clr);
assign #5 f5 = ~(f4 & clk & f6 & ~set);
assign #5 f6 = ~(f5 & D & ~clr);
assign q = f1;
assign notq = f2;
endmodule
2.带有置位和清零端的边沿D 触发器的约束文件
NET "clk" LOC ="V10";
NET "D" LOC ="T5";
NET "set" LOC ="T9";
NET "clr" LOC ="T10";
NET "q" LOC ="T11";
NET "notq" LOC ="R11";
六、实验结果
实验十二 位移位寄存器的设计与实现
一、实验介绍
这个实验将指导你通过使用ISE 软件进行4位移位寄存器的设计与实现。
二、实验目标
∙ 使用ISE 软件设计并仿真。
∙ 学会程序下载。
三、实验步骤
1. 编写文本文件并编译
2. 软件仿真
3. 进行硬件配置
四、实验原理
1.ISE 软件是一个支持数字系统设计的开发平台
2.用ISE 软件进行设计开发时基于相应器件型号的。
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同。
3.图12-1所示为4位移位寄存器的逻辑图,本实验中用Verilog 语句来描述。
clk
clr
图12-1
五、实验代码
1.4位移位寄存器的verilog 源代码
module ShiftReg (
input wire clk,
input wire clr,
input wire data_in,
output reg [3:0] q
);
reg [24:0] q1;
//25位计数器
always @ (posedge clk or posedge clr)
begin
if (clr == 1)
q1
else
q1
end
assign mclk = q1[24]; // 1.5 Hz
// 4位移位寄存器
always @ (posedge mclk or posedge clr)
begin
if (clr == 1)
q
else
begin
q[3]
q[2:0]
end
end
endmodule
2.4位移位寄存器的约束文件
NET "clk" LOC ="V10";
NET "data_in" LOC ="T5";
NET "clr" LOC ="T10";
NET "q[3]" LOC ="T11";
NET "q[2]" LOC ="R11";
NET "q[1]" LOC ="N11";
NET "q[0]" LOC ="M11";
六、实验结果
实验十三 模-5计数器的设计与实现
一、实验介绍
这个实验将指导你通过使用ISE 软件进行模-5计数器的设计与实现。
二、实验目标
∙ 使用ISE 软件设计并仿真。
∙ 学会程序下载。
三、实验步骤
1. 编写文本文件并编译
2. 软件仿真
3. 进行硬件配置
四、实验原理
1.ISE 软件是一个支持数字系统设计的开发平台
2. 用ISE 软件进行设计开发时基于相应器件型号的。
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相
同。
3. 模-5计数器就是从0到4重复计数。也就是说,它一共要经历5个状态,输出从000变到100然后再回到000。本实验中用Verilog 语句来描述。
. 五、实验代码
1.模-5计数器的verilog 源代码 module mod5cnt (
input wire clr,
input wire clk,
output reg [2:0] q
);
reg [24:0] q1;
//25位计数器
always @ (posedge clk or posedge clr)
begin
if (clr == 1)
q1
else
q1
end
assign mclk = q1[24]; // 1.5 Hz
// 模-5计数器
always @ (posedge mclk or posedge clr)
begin
if (clr == 1)
q
else if (q == 4)
q
else
q
end
endmodule
2.模-5计数器的约束文件
NET "clk" LOC ="V10";
NET "clr" LOC ="T10";
NET "q[2]" LOC ="R11";
NET "q[1]" LOC ="N11";
NET "q[0]" LOC ="M11";
六、实验结果
实验十四 8分频器的设计与实现
一、实验介绍
这个实验将指导你通过使用ISE 软件进行8分频器的设计与实现。
二、实验目标
∙ 使用ISE 软件设计并仿真。
∙ 学会程序下载。
三、实验步骤
1. 编写文本文件并编译
2. 软件仿真
3. 进行硬件配置
四、实验原理
1. ISE 软件是一个支持数字系统设计的开发平台
2. 用ISE 软件进行设计开发时基于相应器件型号的。
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同。
3. 8分频器的真值表如图14-1所示,其最高位q 2的输出就是对输
入信号的8分频。本实验中用Verilog 来实现。 q D D0
现态次态
s0
s1
s2
s3
s4
s5
s6
s70 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 10 0 10 1 00 1 11 0 01 0 11 1 01 1 10 0 0clk ~qq0D1q clk ~qq1 D2D q q2
图14-1
五、实验代码
1.8分频器的verilog 源代码
module count3a (
input wire clr,
input wire clk,
output reg [2:0] q
);
wire [2:0] D;
assign D[2] = ~q[2] & q[1] & q[0] clk ~q
| q[2] & ~q[1] | q[2] & ~q[0];
assign D[1] = ~q[1] & q[0]
| q[1] & ~q[0];
assign D[0] = ~q[0];
// 3个D 触发器
always @ (posedge clk or posedge clr)
if (clr == 1)
q
else
q
endmodule
2.8分频器的约束文件
NET "clr" LOC="T10";
NET "clk" LOC="V10";
NET "q[0]" LOC ="T12";
NET "q[1]" LOC ="V12";
NET "q[2]" LOC ="N10";
六、实验结果
实验十五 开关数据加载到寄存器并显示的设计与实现
一、实验介绍
这个实验将指导你通过使用ISE 软件进行开关数据加载到寄存器并
显示的设计与实现。
二、实验目标
∙ 使用ISE 软件设计并仿真。
∙ 学会程序下载。
三、实验步骤
1. 编写文本文件并编译
2. 软件仿真
3. 进行硬件配置
四、实验原理
1. ISE 软件是一个支持数字系统设计的开发平台
2. 用ISE 软件进行设计开发时基于相应器件型号的。
注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同。
3. 设计一个可以把4个开关的内容存储到一个4位寄存器的电路,
并在最右边的7段显示管上显示这个寄存器中的十六进制数字。我
们使用到去抖动模块clock_pulse, 用btn [0]作为输入;8位寄
存器模块,用btn [1]作为加载信号;7段显示管上的显示模块
x7segb c ;分频模块clkdiv ,用以产生模块clock _pulse和x7segbc
的clk190时钟信号。图15-1给出了这个设计的的顶层设计。
clr dp
图15-1
五、实验代码
1. 开关数据加载到寄存器并显示的verilog 源代码
顶层设计:
module sw2regtop (
input wire mclk,
input wire clr,
input wire [1:0] btn,
input wire [3:0] sw,
output wire [3:0] ld,
output wire [6:0] a_to_g,
output wire [3:0] an,
output wire dp
);
wire [3:0] q;
wire clk190, clkp;
wire [3:0] x;
assign x = q;
assign ld = sw;
clkdiv U1 ( .mclk(mclk),
.clr(clr),
.clk190(clk190)
);
clock_pulse U2 ( .inp(btn[0]),
.cclk(clk190), .clr(clr), .outp(clkp) );
register # ( .N(4))
U3 ( .load(btn[1]),
.clk(clkp),
.clr(clr),
.d(sw),
.q(q)
);
x7segbc U4 (.x(x),
.a_to_g(a_to_g), .an(an),
.dp(dp)
);
Endmodule
分频模块:
module clkdiv (
input wire mclk,
input wire clr,
output wire clk190
);
reg [24:0] q;
// 25位计数器
always @ (posedge mclk or posedge clr)
begin
if (clr == 1)
q
else
q
end
assign clk190 = q[17]; // 190 Hz
endmodule
去抖动模块:
module clock_pulse (
input wire inp,
input wire cclk,
input wire clr,
output wire outp
);
reg delay1;
reg delay2;
reg delay3;
always @ (posedge cclk or posedge clr)
begin
if (clr == 1)
begin
delay1
delay2
delay3
end
else
begin
delay1
delay2
delay3
end
end
assign outp = delay1 & delay2 & ~delay3;
endmodule
寄存器模块:
module register
# (parameter N =4)
( input wire load,
input wire clk,
input wire clr,
input wire [N-1:0] d,
output reg [N-1:0] q
);
always @ (posedge clk or posedge clr)
if (clr == 1)
q
else if (load == 1)
q
endmodule
7段显示管显示模块:
module x7segbc (
input wire [3:0] x,
output reg [6:0] a_to_g,
output wire [3:0] an,
output wire dp
);
assign dp = 1; // decimal points off
assign an =4'b1110;
// 7段解码器:hex7seg
always @ ( * )
case (x)
0: a_to_g = 7'b0000001;
1: a_to_g = 7'b1001111;
2: a_to_g = 7'b0010010;
3: a_to_g = 7'b0000110;
4: a_to_g = 7'b1001100;
5: a_to_g = 7'b0100100;
6: a_to_g = 7'b0100000;
7: a_to_g = 7'b0001111;
8: a_to_g = 7'b0000000;
9: a_to_g = 7'b0000100;
'hA: a_to_g = 7'b0001000;
'hB: a_to_g = 7'b1100000;
'hC: a_to_g = 7'b0110001;
'hD: a_to_g = 7'b1000010;
'hE: a_to_g = 7'b0110000;
'hF: a_to_g = 7'b0111000;
default: a_to_g = 7'b0000001; // 0
endcase
endmodule
2.开关数据加载到寄存器并显示的约束文件 NET "mclk" LOC="V10";
NET "clr" LOC="T10";
NET "btn[1]" LOC="V9";
NET "btn[0]" LOC="M8";
NET "sw[3]" LOC="T5";
NET "sw[2]" LOC="V8";
NET "sw[1]" LOC="U8";
NET "sw[0]" LOC="N8";
NET "ld[3]" LOC="T11";
NET "ld[2]" LOC="R11";
NET "ld[1]" LOC="N11";
NET "ld[0]" LOC="M11";
NET "a_to_g[0]" LOC = "L14"; NET "a_to_g[1]" LOC = "N14"; NET "a_to_g[2]" LOC = "M14"; NET "a_to_g[3]" LOC = "U18"; NET "a_to_g[4]" LOC = "U17"; NET "a_to_g[5]" LOC = "T18"; NET "a_to_g[6]" LOC = "T17"; NET "an[0]" LOC = "N16";
NET "an[1]" LOC = "N15";
NET "an[2]" LOC = "P18";
NET "an[3]" LOC = "P17";
NET "dp" LOC = "M13";
六、实验结果
实验总体心得
这次实验收获很大,不论是对知识的理解方面还是在动手能力方面,都得到了很大的提升。刚开始安装ISE时,总是出现问题,想着别人装好了再去问别人,结果最后一直拖着还得自己搞定,所以说是要自己做,不能总靠别人。上课看老师做的很轻松,心想又有指导书,问题应该不大。结果真的做实验时,很茫然,事情并不是想得那么简单。上课不认真听讲,知识理解不透彻,在实验上寸步难行。在做实验时,虽然是按着指导书的步骤来做的,但问题还是很多,有粗心造成的,也有不懂得,只得请教会做的同学。从不会到会,从生数到熟悉,慢慢的也有了感觉,有了新发现。整个实验的过程中让我认识到:纸上得来终觉浅,绝知此事要躬行。只有动手才能发现问题,解决问题是知识理解的最好途径,只要敢于尝试,所有的问题都将迎刃而解,同时,自身的能力也会有一定的提高。在今后的学习中,怕麻烦嫌累学不到东西,只有认真对待才能有进步,才能学得更多。