数字部件设计实验一:使用Verilog语言实现一个四位的ALU运算单元

使用Verilog语言实现一个四位的ALU运算单元

设计思路主要来自这里,不过原文的乘法实现有一些小问题,我做了一些修改。

实验内容

设计一个算术逻辑单元
输入信号:A B 2组4位输入信号(A3~A0, B3~B0)
输出信号:F 1组8位输出信号(F7~F0)

需要实现的功能

功能如下表所示:
op, A, B, F的功能表 :

opfunction
00F=A+B
01F=A - B
10F=~A
11F=A*B

注:加法器和减法器皆为半加器,不考虑进位输入Cin,但是要考虑进位输出Count。

设计思路

将输入信号和输出信号存在A、B中,op存操作符,输入用F表示。ALU的实现使用了case语句,加法和减法就用计算机内置的运算实现,乘法单独写一个函数来实现。
设计源文件中的代码如下:

module ALU_4bit(
    F, A, B, op, EN
    );
    input [3:0] A, B; //输入操作数
    input [1:0] op;//操作符
    input EN;       //EN=1允许运算
    output reg[7:0] F;//输出
    
always @(*)
begin
    if(!EN)
    F = 8'B0;
    else
    ALUtask(A, B, op, F);
end
task ALUtask;
    input [3:0] A, B;
    input [1:0] op;
    output reg[7:0] F;
begin
    case(op)
        2'B00:F = A + B;
        2'B01:F = A - B;
        2'B10:F = ~A;
        2'B11:F = multi(A, B);//调用函数
    endcase
 end
 endtask
 //function multi
 function [7:0]multi; //乘法实现
    input [3:0] A, B;
    reg [7:0] count;
    integer i;
    begin
        count = 0;
        for(i = 0; i < 4; i = i+1)
            begin
                if(A[i])
                    count = count + (B<<i);
            end
                multi = count; //返回值通过函数名返回
     end
 endfunction
 
endmodule

约束文件

我是用vivado写的代码,测试就直接用这个做了,不过我们还需要一个约束文件,约束文件的写法可以有很多种,下面的是我写的:

# Nexys4 Pin Assignments
############################
# On-board Slide Switches  #
############################
set_property PACKAGE_PIN J15 [get_ports {A[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {A[0]}]
set_property PACKAGE_PIN L16 [get_ports {A[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {A[1]}]
set_property PACKAGE_PIN M13 [get_ports {A[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {A[2]}]
set_property PACKAGE_PIN R15 [get_ports {A[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {A[3]}]
set_property PACKAGE_PIN R17 [get_ports {B[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {B[0]}]
set_property PACKAGE_PIN T18 [get_ports {B[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {B[1]}]
set_property PACKAGE_PIN U18 [get_ports {B[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {B[2]}]
set_property PACKAGE_PIN R13 [get_ports {B[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {B[3]}]
set_property PACKAGE_PIN T8 [get_ports {op[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {op[0]}]
set_property PACKAGE_PIN U8 [get_ports {op[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {op[1]}]
############################
# On-board led             #
############################
set_property PACKAGE_PIN H17 [get_ports F[0]]
set_property IOSTANDARD LVCMOS33 [get_ports F[0]]
set_property PACKAGE_PIN K15 [get_ports F[1]]
set_property IOSTANDARD LVCMOS33 [get_ports F[1]]
set_property PACKAGE_PIN J13 [get_ports F[2]]
set_property IOSTANDARD LVCMOS33 [get_ports F[2]]
set_property PACKAGE_PIN N14 [get_ports F[3]]
set_property IOSTANDARD LVCMOS33 [get_ports F[3]]
set_property PACKAGE_PIN R18 [get_ports F[4]]
set_property IOSTANDARD LVCMOS33 [get_ports F[4]]
set_property PACKAGE_PIN V17 [get_ports F[5]]
set_property IOSTANDARD LVCMOS33 [get_ports F[5]]
set_property PACKAGE_PIN U17 [get_ports F[6]]
set_property IOSTANDARD LVCMOS33 [get_ports F[6]]
set_property PACKAGE_PIN U16 [get_ports F[7]]
set_property IOSTANDARD LVCMOS33 [get_ports F[7]]

A[0]~A[3]和 B[0]-B[3]是输入信号,op[0]-op[1]存操作符,F[0]-F[7]是输出信号。

测试

接下来就将实验板(如果有的话,没有就进行仿真操作,这里不多叙述)和电脑连接,生成比特流并下载到实验版上进行测试,在实验板上的效果图如下(乘法的实验效果,实例是1001*101=110111):
在这里插入图片描述

最后

这个实验比较简单,这段时间在学数字部件设计,也打算把之前欠的文章都还上,所以最近会一直写数字部件相关的文章,当然了,有其他的有趣的技术也会,最近是没什么学Python的想法了,因为作业和实验太多,之后会尽量每周写一次的(把之前欠的补回来,补回来之后再看时间),毕竟自己还是蛮喜欢和人分享知识的。最后的最后,有CSE大佬吗,这个东西也太南了。

  • 15
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值