计算机组成原理实验之一:32位ALU的设计

Verilog HDL 实现简单的32位ALU算术逻辑运算器

接触到EDA软件也有差不多七八个月了,如今学了计算机组成原理,正巧有计组的实验,于是就打算写个系列的博客。
转载需注明出处!

直接上代码

module alu_32_top(
    input clkin,
    input [2:0]sel,
    output [7:0] scan,
    output [7:0] seg7
    );
    
    wire [31:0] data_temp;
    alu_32 u0(.sel(sel),.y(data_temp));
     led_seg7 u1(.clkin(clkin),.datain(data_temp),.scan(scan),.seg7(seg7));  
endmodule
module alu_32(sel,y);
    input [2:0] sel;
    output [31:0] y;
    
    reg[31:0] y;
    reg [31:0] dataA = 32'h00ffbb11, dataB = 32'h0000fffa;
    always@(sel)begin
       if(sel==3'b000) y = dataA + dataB; 
       else if(sel==3'b001) y = dataA - dataB;
       else if(sel==3'b010) y = dataA * dataB;
       else if(sel==3'b011) y = dataA / dataB;
       else if(sel==3'b100) y = dataA & dataB;
       else if(sel==3'b101) y = dataA | dataB;
       else y =8'b0;
       //此处可以自己添加其他的逻辑计算,例如移位等等
     end    
endmodule
module led_seg7(
input clkin,
input [31:0] datain,
output [7:0] scan,
output [7:0] seg7
    );
    
 reg [7:0] scan;
 reg [7:0] seg7=0;
 reg [2:0] cnt1=0;
 reg [3:0] data_temp;
 reg clkout=0;
 
 reg[31:0] cnt=0;
 reg clk_temp=0;
 
 //50MHZ,20ns,500000*20ns=100ms
 always @(posedge clkin) begin
     case(cnt)
         32'd50000: begin            
             clk_temp <= ~clk_temp;
             cnt <= 0;
             end             
         default: begin
             cnt <= cnt + 1;
             end
     endcase
     clkout <= clk_temp;
 end
    
 always @(posedge clkout)
   begin
       // if(~reset) 
      //      begin
      //          cnt1 = 3'b000;
      //         scan = 8'b11111111;              
     //       end
       
             if(cnt1 == 3'b111) 
                cnt1 = 3'b000;                
             else
                cnt1 = cnt1 + 1 ;     
            //end
   end
   
   always @(cnt1)
   begin     
       case(cnt1)
            3'b000 : begin scan <= 8'b11111110; data_temp <= datain[3:0];    end   
            3'b001 : begin scan <= 8'b11111101; data_temp <= datain[7:4];    end  
            3'b010 : begin scan <= 8'b11111011; data_temp <= datain[11:8];   end      
            3'b011 : begin scan <= 8'b11110111; data_temp <= datain[15:12];  end
            3'b100 : begin scan <= 8'b11101111; data_temp <= datain[19:16];  end      
            3'b101 : begin scan <= 8'b11011111; data_temp <= datain[23:20];  end   
            3'b110 : begin scan <= 8'b10111111; data_temp <= datain[27:24];  end      
            3'b111 : begin scan <= 8'b01111111; data_temp <= datain[31:28];  end   
            default: begin scan <= 8'b11111111; data_temp <= 32'd0;  end
        endcase    
       
        case(data_temp)
                  4'b0000 : seg7 <= 8'b00111111;    
                  4'b0001 : seg7 <= 8'b00000110;  
                  4'b0010 : seg7 <= 8'b01011011;        
                  4'b0011 : seg7 <= 8'b01001111;
                  4'b0100 : seg7 <= 8'b01100110;
                  4'b0101 : seg7 <= 8'b01101101;
                  4'b0110 : seg7 <= 8'b01111101;
                  4'b0111 : seg7 <= 8'b00000111;
                  4'b1000 : seg7 <= 8'b01111111;
                  4'b1001 : seg7 <= 8'b01101111;
                  4'b1010 : seg7 <= 8'b01110111;
                  4'b1011 : seg7 <= 8'b01111100;
                  4'b1100 : seg7 <= 8'b00111001;
                  4'b1101 : seg7 <= 8'b01011110;   
                  4'b1110 : seg7 <= 8'b01111001;
                  4'b1111 : seg7 <= 8'b01110001;                                         
                  default : seg7 <= 8'b00000000;
        endcase
 end
endmodule

这是文件的组织结构,保存后会自动形成这样的一个结构

本实验采用的开发板是:xc7a200tfbg676-2
约束文件内容如下:

set_property PACKAGE_PIN D3 [get_ports {scan[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {scan[7]}]
set_property PACKAGE_PIN D25 [get_ports {scan[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {scan[6]}]
set_property PACKAGE_PIN D26 [get_ports {scan[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {scan[5]}]
set_property PACKAGE_PIN E25 [get_ports {scan[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {scan[4]}]
set_property PACKAGE_PIN E26 [get_ports {scan[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {scan[3]}]
set_property PACKAGE_PIN G25 [get_ports {scan[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {scan[2]}]
set_property PACKAGE_PIN G26 [get_ports {scan[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {scan[1]}]
set_property PACKAGE_PIN H26 [get_ports {scan[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {scan[0]}]
set_property PACKAGE_PIN C4 [get_ports {seg7[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[7]}]
set_property PACKAGE_PIN C3 [get_ports {seg7[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[6]}]
set_property PACKAGE_PIN E6 [get_ports {seg7[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[5]}]
set_property PACKAGE_PIN B2 [get_ports {seg7[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[4]}]
set_property PACKAGE_PIN B4 [get_ports {seg7[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[3]}]
set_property PACKAGE_PIN E5 [get_ports {seg7[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[2]}]
set_property PACKAGE_PIN D4 [get_ports {seg7[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[1]}]
set_property PACKAGE_PIN A2 [get_ports {seg7[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg7[0]}]
set_property PACKAGE_PIN AC21 [get_ports {sel[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[2]}]
set_property PACKAGE_PIN AD24 [get_ports {sel[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[1]}]
set_property PACKAGE_PIN AC22 [get_ports {sel[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[0]}]
set_property PACKAGE_PIN AC19 [get_ports clkin]
set_property IOSTANDARD LVCMOS33 [get_ports clkin]

之后的上实验板验证就不再过多的赘述了

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机组成原理是计算机科学与技术领域的一门基础课程,它研究计算机硬件如何组成和工作的原理与方法。其中的32位ALU设计实验是该课程的实践环节,旨在通过设计实现32位ALU来加深对计算机原理的理解。 华中科技大学的32位ALU设计实验通常包括以下几个步骤: 首先,需要对ALU进行功能分析与设计。根据计算机原理的知识和需求,确定该ALU需要具备的基本运算功能,如加法、减法、与、或等。然后,根据需求设计ALU辑电路图,明确控制信号和数据输入、输出的位数。 接下来,需要使用计算机辅助工具(如EDA软件)进行电路仿真与验证。通过仿真,可以验证设计的正确性与有效性,发现并解决可能存在的问题。 然后,进行实际的电路布线与制造。根据设计的电路图,进行电路的布线布道,将辑电路转化为物理电路。这一步需要严谨的操作和精确的测量技术。 最后,进行ALU的功能测试与调试。通过编写测试程序,验证ALU运算结果是否正确。根据测试结果,修复可能存在的错误与问题,以确保ALU的稳定和可靠。 在整个设计实验的过程中,需要充分理解和运用计算机原理的相关知识,如数字电路设计、布线与制造技术等。同时,需要具备一定的实际操作能力和团队协作精神。 通过参与该实验,学生能够深入理解计算机系统的组成原理,加深对数字电路和设计的理解,并提高实践操作与问题解决的能力。这对于培养学生的计算机科学与技术素养具有重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值