XXX 姓名:
课程名称:计算机组成 实验时间:
XXX 学号:
同组学生姓名:无
实验地点:
指导老师: XXX 专业: 计算机科学与技术
一、 实验目的和要求
1. 熟练掌握乘法器的工作原理和逻辑功能
二、实验内容和原理
实验内容:
根据课本上例3-7的原理,来实现4位移位乘法器的设计。 具体要求:1. 乘数和被乘数都是4位 2. 生成的乘积是8位的
3. 计算中涉及的所有数都是无符号数 4.需要设计重置功能
5.需要分步计算出结果(4位乘数的运算,需要四步算出结果)
实验原理:
1. 乘法器原理图
第1页/共10页
2. 本实验的要求:
1. 需要设计按钮和相应开关,来增加乘数和被乘数
2. 每按一下M13,给一个时钟,数码管的左边两位显示每一步的乘
积
3. 4步计算出最终结果后,LED灯亮,按RESET重新开始计算
三、主要仪器设备
1. Spartan-III开发板 2. 装有ISE的PC机
1套 1台
四、操作方法与实验步骤
实验步骤:
1. 创建新的工程和新的源文件
2. 编写verilog代码(top模块、display模块、乘法运算模块、去抖动模块以及UCF引脚) 3. 进行编译
4. 进行Debug 工作,通过编译。
第2页/共10页
5.. 生成FPGA代码,下载到实验板上并调试,看是否与实现了预期功能
操作方法: TOP:
module alu_top(clk, switch, o_seg, o_sel); input wire clk; input wire[4:0] switch; output wire [7:0] o_seg; // 只需七段显示数字,不用小数点 output wire [3:0] o_sel; // 4个数码管的位选 wire[15:0] disp_num; reg [15:0] i_r, i_s; wire [15:0] disp_code; wire o_zf; //zero detector initial begin i_r <= 16'h1122; //0x1122 i_s <= 16'h3344; //0x3344 end alu M1(i_r, i_s, switch[4:2], o_zf, disp_code); display M3(clk, disp_num, o_seg, o_sel); assign disp_num = switch[0]?disp_code:(switch[1] ? i_s : i_r);
endmodule ALU: module alu(i_r, i_s, switch, o_zf, disp_code); input[15:0] i_r, i_s; input[2:0] switch; output reg o_zf; // zero detector output reg[15:0] disp_code; always@(switch[2:0]) begin case(switch) 3'b000: disp_code <= i_r & i_s; 3'b001: disp_code <= i_r | i_s; 3'b010: disp_code <= i_r + i_s; 3'b110: disp_code <= i_r - i_s; 3'b111: disp_code <= i_r < i_s ? 1:0; endcase 第3页/共10页
if(disp_code == 16'b0) o_zf <= 1; end endmodule DISPLAY:
module display(clk, disp_num, o_seg, o_sel); input wire clk; input wire [15:0] disp_num; //显示的数据 output reg [ 7:0] o_seg; //七段,不需要小数点 output reg [ 3:0] o_sel; //4个数码管的位选 reg [3:0] code = 4'b0; reg [15:0] count = 15'b0; always @(posedge clk) begin case (count[15:14]) 2'b00 : begin o_sel <= 4'b1110; code <= disp_num[3:0]; end 2'b01 : begin o_sel <= 4'b1101; code <= disp_num[7:4]; end 2'b10 : begin o_sel <= 4'b1011; code <= disp_num[11:8]; end 2'b11 : begin o_sel <= 4'b0111; code <= disp_num[15:12]; end endcase
case (code)
4'b0000: o_seg <= 8'b11000000; 4'b0001: o_seg <= 8'b11111001; 4'b0010: o_seg <= 8'b10100100;
第4页/共10页
4'b0011: o_seg <= 8'b10110000; 4'b0100: o_seg <= 8'b10011001; 4'b0101: o_seg <= 8'b10010010; 4'b0110: o_seg <= 8'b10000010; 4'b0111: o_seg <= 8'b11111000; 4'b1000: o_seg <= 8'b10000000; 4'b1001: o_seg <= 8'b10010000; 4'b1010: o_seg <= 8'b10001000; 4'b1011: o_seg <= 8'b10000011; 4'b1100: o_seg <= 8'b11000110; 4'b1101: o_seg <= 8'b10100001; 4'b1110: o_seg <= 8'b10000110; 4'b1111: o_seg <= 8'b10001110; default: o_seg <= 8'b10000000; endcase
count <= count + 1; end endmodule UCF:
Net “clk” loc=”T9”;
Net “o_seg[0]” loc=”E14”; Net “o_seg[1]” loc=”G13”; Net “o_seg[2]” loc=”N15”; Net “o_seg[3]” loc=”P15”; Net “o_seg[4]” loc=”R16”; Net “o_seg[5]” loc=”F13”; Net “o_seg[6]” loc=”N16”; Net “o_seg[7]” loc=”P16”; Net “o_sel[0]” loc=”D14”; Net “o_sel[1]” loc=”G14”; Net “o_sel[2]” loc=”F14”; Net “o_sel[3]” loc=”E13”; Net “switch[0]” loc=”M10”; Net “switch[1]” loc=”F3”; Net “switch[2]” loc=”G4”; Net “switch[3]” loc=”E3”; Net “switch[4]” loc=”F4”;
2. ALU控制器的实现:
输入用 2 + 6 = 8 个拨动开关
第5页/共10页
ALUop控制模式:2个拨动开关
功能域Funct控制模式:6个拨动开关
输出用 3 个LED显示
TOP:
module aluc_top(clk, switch, o_seg, o_sel); input wire clk; input wire[7:0] switch; output wire [7:0] o_seg; // 只需七段显示数字,不用小数点 output wire [3:0] o_sel; // 4个数码管的位选 wire[15:0] disp_num; reg [15:0] i_r, i_s; wire [15:0] disp_code; wire [2:0] alu; initial begin i_r <= 16'h1122; //0x1122 i_s <= 16'h3344; //0x3344 end aluc M1(switch[7:2],alu);
alu M2(i_r,i_s,alu,disp_code); display M3(clk, disp_num, o_seg,o_sel); assign disp_num = switch[0]?disp_code:(switch[1] ? i_r: i_s);
endmodule ALU: module alu(i_r, i_s, alu, disp_code); input[15:0] i_r, i_s; input[2:0] alu; output reg[15:0] disp_code; begin case(alu) 3'b000: disp_code <= i_r & i_s; 3'b001: disp_code <= i_r | i_s; 3'b010: disp_code <= i_r + i_s; 3'b110: disp_code <= i_r - i_s; 3'b111: disp_code <= i_r < i_s ? 1:0; endcase end endmodule DISPLAY: module display(clk, disp_num, o_seg, o_sel); 第6页/共10页
input wire clk; input wire [15:0] disp_num; //显示的数据 output reg [ 7:0] o_seg; //七段,不需要小数点 output reg [ 3:0] o_sel; //4个数码管的位选 reg [3:0] code = 4'b0; reg [15:0] count = 15'b0; always @(posedge clk) begin case (count[15:14]) 2'b00 : begin o_sel <= 4'b1110; code <= disp_num[3:0]; end 2'b01 : begin o_sel <= 4'b1101; code <= disp_num[7:4]; end 2'b10 : begin o_sel <= 4'b1011; code <= disp_num[11:8]; end 2'b11 : begin o_sel <= 4'b0111; code <= disp_num[15:12]; end endcase
case (code)
4'b0000: o_seg <= 8'b11000000; 4'b0001: o_seg <= 8'b11111001; 4'b0010: o_seg <= 8'b10100100; 4'b0011: o_seg <= 8'b10110000; 4'b0100: o_seg <= 8'b10011001; 4'b0101: o_seg <= 8'b10010010; 4'b0110: o_seg <= 8'b10000010; 4'b0111: o_seg <= 8'b11111000; 4'b1000: o_seg <= 8'b10000000; 4'b1001: o_seg <= 8'b10010000;
第7页/共10页
4'b1010: o_seg <= 8'b10001000; 4'b1011: o_seg <= 8'b10000011; 4'b1100: o_seg <= 8'b11000110; 4'b1101: o_seg <= 8'b10100001; 4'b1110: o_seg <= 8'b10000110; 4'b1111: o_seg <= 8'b10001110; default: o_seg <= 8'b10000000; endcase count <= count + 1; end endmodule ALUC:
module aluc(input wire[7:2] switch,output reg[2:0] alu); always@(switch) begin if(switch[2]==0&&switch[3]==0) alu=3’b010;
else if(switch[2]==0&&switch[3]==1) alu=3’b110; else
if(switch[2]==1&&switch[4]==0&&switch[5]==0&&switch[6]==0&&switch[7]==0) alu=3’b010; else
if(switch[2]==1&&switch[4]==0&&switch[5]==0&&switch[6]==1&&switch[7]==0) alu=3’b110; else
if(switch[2]==1&&switch[4]==0&&switch[5]==1&&switch[6]=0&&switch[7]==0) alu=3’b000; else
if(switch[2]==1&&switch[4]==0&&switch[5]==1&&switch[6]=0&&switch[7]==1) alu=3’b001; else
if(switch[2]==1&&switch[4]==1&&switch[5]==0&&switch[6]=1&&switch[7]==1) alu=3’b111; end
endmodule UCF: Net “clk” loc=”T9”; Net “o_seg[0]” loc=”E14”; Net “o_seg[1]” loc=”G13”; Net “o_seg[2]” loc=”N15”; 第8页/共10页
Net “o_seg[3]” loc=”P15”; Net “o_seg[4]” loc=”R16”; Net “o_seg[5]” loc=”F13”; Net “o_seg[6]” loc=”N16”; Net “o_seg[7]” loc=”P16”; Net “o_sel[0]” loc=”D14”; Net “o_sel[1]” loc=”G14”; Net “o_sel[2]” loc=”F14”; Net “o_sel[3]” loc=”E13”; Net “switch[0]” loc=”M10”; Net “switch[1]” loc=”F3”; Net “switch[2]” loc=”G4”; Net “switch[3]” loc=”E3”; Net “switch[4]” loc=”F4”; Net “switch[5]” loc=”G5”; Net “switch[6]” loc=”E4”; Net “switch[7]” loc=”H4”; 五、实验结果与分析
程序运行成功后,将代码下载到实验板spartan3上验证。 1. ALU的实现:
1) 拨动SWITCH[1:0]=00,显示操作数A=1122,SWITCH[1:0]=01,显示操作数B=3344.
2) 拨动switch[0]=1,将显示运算结果如下:
2. ALU控制器的实现:
1) 拨动SWITCH[1:0]=00,显示操作数A=1122,SWITCH[1:0]=01,显示操作数B=3344.
2) 拨动switch[0]=1,将显示运算结果如下:
第9页/共10页
六、 讨论、心得
这次实验,我做好好久,中间一直出错。现在反思,关键可能是因为我对乘法器的原理掌握不够和对verilog语言的不熟练。在以后的学习中,一定要注意课本知识和实验应用的结合。
第10页/共10页
因篇幅问题不能全部显示,请点此查看更多更全内容