デジタル部品設計実験1:Verilog言語を用いて4ビットのALU演算ユニットを実現する

3963 ワード

Verilog言語で4ビットのALU演算ユニットを実現
  • 実験内容
  • が実現すべき機能
  • 設計構想
  • 拘束ファイル
  • テスト
  • 最後の
  • 設計構想は主にここから来ているが、原文の乗算実現にはいくつかの小さな問題があり、私はいくつかの修正をした.
    実験内容
    算術論理ユニット入力信号を設計する:A B 2群4ビット入力信号(A 3~A 0,B 3~B 0)出力信号:F 1群8ビット出力信号(F 7~F 0)
    必要な機能
    機能は以下の表に示す:op,A,B,Fの機能表:
    op
    function
    00
    F=A+B
    01
    F=A - B
    10
    F=~A
    11
    F=A*B
    注:加算器も減算器もハーフ加算器で、キャリー入力Cinは考慮されませんが、キャリー出力Countは考慮されます.
    せっけい構想
    入力信号と出力信号をA,Bに存在させ,opはオペレータを格納し,入力はFで表す.ALUの実装はcase文を用い,加算と減算はコンピュータ内蔵の演算で実現し,乗算は単独で関数を1つ書いて実現する.設計元ファイルのコードは次のとおりです.
    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<

    コンストレイントファイル
    私は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=10111).
    最後に
    この実験は比较的简単で、この时间はデジタル部品の设计を学んで、前に借りた文章をすべて返すつもりで、だから最近ずっとデジタル部品の関连する文章を书いて、もちろん、その他の面白い技术もあって、最近Pythonの考えを学ぶことは何もなくて、作业と実験のため多すぎて、あとはなるべく週に1回くらい書きますが(前に借りたものを補って、補ってから時間を見ます)、結局自分は人と知識を共有するのが好きです.最後の最後に、CSEの大物はいますか、これは南すぎます.