新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > VHDL設計進階:邏輯綜合的原則以及可綜合的代碼設計

        VHDL設計進階:邏輯綜合的原則以及可綜合的代碼設計

        作者: 時間:2013-08-27 來源:網(wǎng)絡 收藏

        編碼器設計方案二。

        module encoder2 ( none_on,out2,out1,out0,h,g,f,e,d,c,b,a); //模塊聲明
        input h,g,f,e,d,c,b,a;
        output none_on,out2,out1,out0; //端口聲明
        wire [3:0] outvec; //向量聲明
        assign outvec = //使用assign語句實現(xiàn)輸出向量賦值
        h ? 4'b0111 : g ? 4'b0110 : f ? 4'b0101:
        e ? 4'b0100 : d ? 4'b0011 : c ? 4'b0010 :
        b ? 4'b0001 : a ? 4'b0000 : 4'b1000;
        assign none_on = outvec[3]; //使用assign語句進行編碼
        assign out2 = outvec[2];
        assign out1 = outvec[1];
        assign out0 = outvec[0];
        endmodule

        編碼器設計方案三。

        module encoder3 ( none_on,out2,out1,out0,h,g,f,e,d,c,b,a); //模塊聲明
        input h,g,f,e,d,c,b,a;
        output none_on,out2,out1,out0; //端口聲明
        wire [3:0] outvec; //向量聲明
        assign {none_on,out2,out1,out0} = outvec; //與上例的編碼方式一致
        always @( a or b or c or d or e or f or g or h) begin
        if(h) outvec=4'b0111; //使用if_else語句實現(xiàn)向量賦值
        else if(g) outvec=4'b0110; //共9個分支,其中向量的低3位有8種編碼方式
        else if(f) outvec=4'b0101;
        else if(e) outvec=4'b0100;
        else if(d) outvec=4'b0011;
        else if(c) outvec=4'b0010;
        else if(b) outvec=4'b0001;
        else if(a) outvec=4'b0000;
        else outvec=4'b1000;
        end
        endmodule

        例4.12:多路器的設計實例。


        使用assign賦值語句、case語句或if-else語句可以生成多路器電路。如果條件語句(case或if-else)中分支條件是互斥的話,綜合器能自動地生成并行的多路器。
        多路器設計方案一。

        modul emux1(out,a,b,sel); //模塊聲明
        output out;
        input a,b,sel; //端口聲明
        //使用assign語句檢查輸入信號sel的值
        assign out = sel ? a : b; //當sel為1時,out為a;否則為b
        endmodule

        多路器設計方案二。

        module mux2( out,a,b,sel); //模塊聲明
        output out;
        input a,b,sel; //端口聲明
        reg out;
        always @(a or b or sel) begin //用電平觸發(fā)的always塊來設計多路器的組合
        case( sel ) //使用case語句檢查輸入信號sel的值
        1'b1: out = a; //如果為1,輸出out為a
        1'b0: out = b; //如果為0,輸出out為b
        default: out = 'bx; //默認狀態(tài)
        endcase
        end
        endmodule

        多路器設計方案三。

        module mux3( out,a,b sel); //模塊聲明
        output out;
        input a, b, sel; //端口聲明
        reg out;
        always @( a or b or sel ) begin
        if( sel ) //使用if_else語句檢查輸入信號sel的值
        out = a; //如果為1,輸出out為a
        else
        out = b; //如果為0,輸出out為b
        end
        endmodule

        例4.13:奇偶校驗位生成器設計實例。

        module parity( even_numbits,odd_numbits,input_bus); //模塊聲明
        output even_numbits, odd_numbits;
        input [7:0] input_bus; //端口聲明
        assign odd_numbits = ^input_bus; //當input_bus中1的個數(shù)為奇數(shù)時,輸出為1
        assign even_numbits = ~odd_numbits; //此時輸出even_numbits為0
        endmodule

        例4.14:三態(tài)輸出驅動器設計實例(用連續(xù)賦值語句建立三態(tài)門模型)。
        三態(tài)輸出驅動器設計方案一。

        module trist1( out,in,enable); //模塊聲明
        output out;
        input in, enable; //端口聲明
        assign out = enable? in: 'bz; //使用assign語句判斷enable的值
        endmodule

        三態(tài)輸出驅動器設計方案二。

        module trist2( out,in,enable ); //模塊聲明
        output out;
        input in,enable; //端口聲明
        bufif1 mybuf1(out, in, enable); //bufif1是一個 Verilog門級原語(primitive)
        //通過實例化該原語,實現(xiàn)三態(tài)門的調用
        endmodule

        例4.15:三態(tài)雙向驅動器設計實例。

        module bidir(tri_inout,out,in,en,b); //模塊聲明
        inout tri_inout;
        output out;
        input in,en,b; //端口聲明
        assign tri_inout = en? in : 'bz; //三態(tài)門的輸入為in
        assign out = tri_inout ^ b; //三態(tài)門的輸出為b
        endmodule


        2.時序電路設計實例
        例4.16:觸發(fā)器設計實例。

        module dff( q,data,clk); //模塊聲明
        output q;
        input data,clk; //端口聲明
        reg q;
        always @( posedge clk ) begin //邊緣檢測
        q = data; //通過always語句,實現(xiàn)觸發(fā)器
        end
        endmodule

        例4.17:電平敏感型鎖存器設計實例一(assign語句)。

        module latch1( q,data,clk); //模塊聲明
        output q;
        input data,clk; //端口聲明
        assign q = clk ? data : q; //通過assign語句,實現(xiàn)的是一個鎖存器
        endmodule

        例4.18:帶置位和復位端的電平敏感型鎖存器設計實例二(assign語句)。

        module latch2( q,data,clk,set,reset); //模塊聲明
        output q;
        input data,clk,set,reset; //端口聲明
        assign q= reset ? 0 : ( set? 1:(clk? data : q ) );
        //通過assign語句,實現(xiàn)的是一個鎖存器
        //其中,set為置位端,reset為復位端
        //在clk為高電平時,鎖存data,否則保持q值
        endmodule

        例4.19:電平敏感型鎖存器設計實例三(always塊)。

        module latch3( q, data, clk); //模塊聲明
        output q;
        input data,clk; //端口聲明
        reg q;
        always @(clk or data) begin //電平檢測
        if(clk) //clk為高電平時,q鎖存data值
        q = data;
        end
        endmodule

        注意 有的綜合器會產生一個警告信息,提示將產生了一個電平敏感型鎖存器。因為此例中設計的就是一個電平敏感型鎖存器,所以這個警告信息是沒有問題的。

        例4.20:移位寄存器設計實例。

        module shifter( din,clk,clr,dout); //模塊聲明
        input din,clk,clr;
        output [7:0] dout; //端口聲明
        reg [7:0] dout;
        always @(posedge clk) begin
        if(clr) //清零
        dout = 8'b0;
        else begin
        dout = dout1; //左移一位
        dout[0] = din; //把輸入信號放入寄存器的最低位
        end
        end
        endmodule


        例4.21:8位計數(shù)器設計實例一。

        module counter1( out, cout, data, load, cin, clk); //模塊聲明
        output [7:0] out;
        output cout;
        input [7:0] data;
        input load, cin, clk; //端口聲明
        reg [7:0] out;
        always @(posedge clk) begin //邊緣檢測
        if( load ) //加載信號檢測
        out = data;
        else
        out = out + cin;
        end
        assign cout= out cin; //只有當out[7:0]的所有各位都為1
        //并且進位cin也為1時才能產生進位cout
        endmodule

        例4.22:8位計數(shù)器設計實例二。

        module counter2( out, cout, data, load, cin, clk); //模塊聲明
        output [7:0] out;
        output cout;
        input [7:0] data;
        input load, cin, clk; //端口聲明
        reg [7:0] out;
        reg cout;
        reg [7:0] preout; //寄存器聲明
        always @(posedge clk) begin //邊緣檢測
        out = preout; //觸發(fā)器
        end
        //計算計數(shù)器和進位的下一個狀態(tài),為提高性能,load不應影響進位
        always @( out or data or load or cin ) begin
        {cout, preout} = out + cin; //進位操作
        if(load) preout = data; //判斷加載信號
        end
        endmodule


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 鹤岗市| 天气| 上林县| 玉龙| 陆川县| 石林| 深泽县| 大名县| 深州市| 林西县| 京山县| 洛宁县| 宁德市| 乡宁县| 西昌市| 陆丰市| 泽州县| 凯里市| 金秀| 昭觉县| 德安县| 武清区| 玉林市| 界首市| 大竹县| 铁岭市| 合川市| 疏附县| 文化| 社旗县| 金阳县| 德钦县| 佛教| 板桥市| 偏关县| 五台县| 晋中市| 呼图壁县| 民权县| 大丰市| 陈巴尔虎旗|