实验4位乘法器实验报告姓名:X XX 学号:X XX 专业:计算机科学与技术课程名称:计算机组成同组学生姓名:无实验时间:实验地点:指导老师:XXX一、实验目的和要求1.熟练掌握乘法器的工作原理和逻辑功能二、实验内容和原理实验内容:根据课本上例3-7的原理,来实现4位移位乘法器的设计。
具体要求:1. 乘数和被乘数都是4位2. 生成的乘积是8位的3. 计算中涉及的所有数都是无符号数4.需要设计重置功能5.需要分步计算出结果(4位乘数的运算,需要四步算出结果)实验原理:1.乘法器原理图2.本实验的要求:1.需要设计按钮和相应开关,来增加乘数和被乘数2.每按一下M13,给一个时钟,数码管的左边两位显示每一步的乘积3.4步计算出最终结果后,LED灯亮,按RESET重新开始计算三、主要仪器设备1.Spartan-III开发板1套2.装有ISE的PC机1台四、操作方法与实验步骤实验步骤:1.创建新的工程和新的源文件2.编写verilog代码(top模块、display模块、乘法运算模块、去抖动模块以及UCF引脚)3.进行编译4.进行Debug 工作,通过编译。
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 detectorinitialbegini_r <= 16'h1122; //0x1122i_s <= 16'h3344; //0x3344endalu 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); endmoduleDISPLAY: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)begincase (count[15:14])2'b00 :begino_sel <= 4'b1110;code <= disp_num[3:0];end2'b01 :begino_sel <= 4'b1101;code <= disp_num[7:4];end2'b10 :begino_sel <= 4'b1011;code <= disp_num[11:8];end2'b11 :begino_sel <= 4'b0111;code <= disp_num[15:12];endendcasecase (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;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;endcasecount <= count + 1;endendmoduleUCF: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 个拨动开关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;initialbegini_r <= 16'h1122; //0x1122i_s <= 16'h3344; //0x3344endaluc 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); endmoduleinput 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)begincase (count[15:14])2'b00 :begino_sel <= 4'b1110;code <= disp_num[3:0];end2'b01 :begino_sel <= 4'b1101;code <= disp_num[7:4];end2'b10 :begino_sel <= 4'b1011;code <= disp_num[11:8];end2'b11 :begino_sel <= 4'b0111;code <= disp_num[15:12];endendcasecase (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;ALUC:module aluc(input wire[7:2] switch,output reg[2:0] alu);always@(switch)beginif(switch[2]==0&&switch[3]==0)alu=3’b010;else if(switch[2]==0&&switch[3]==1)alu=3’b110;elseif(switch[2]==1&&switch[4]==0&&switch[5]==0&&switch[6]==0&&switch[7]==0) alu=3’b010;elseif(switch[2]==1&&switch[4]==0&&switch[5]==0&&switch[6]==1&&switch[7]==0) alu=3’b110;elseif(switch[2]==1&&switch[4]==0&&switch[5]==1&&switch[6]=0&&switch[7]==0) alu=3’b000;elseif(switch[2]==1&&switch[4]==0&&switch[5]==1&&switch[6]=0&&switch[7]==1) alu=3’b001;elseif(switch[2]==1&&switch[4]==1&&switch[5]==0&&switch[6]=1&&switch[7]==1) alu=3’b111;endendmodule五、实验结果与分析程序运行成功后,将代码下载到实验板spartan3上验证。