新聞中心

        EEPW首頁 > EDA/PCB > 設(shè)計(jì)應(yīng)用 > VHDL設(shè)計(jì)進(jìn)階:邏輯綜合的原則以及可綜合的代碼設(shè)計(jì)

        VHDL設(shè)計(jì)進(jìn)階:邏輯綜合的原則以及可綜合的代碼設(shè)計(jì)

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

        4.5.1 always塊語言指導(dǎo)原則

        本文引用地址:http://www.104case.com/article/189515.htm

        使用always塊進(jìn)行可綜合的時(shí)需要注意以下幾個(gè)問題。

        (1)每個(gè)always塊只能有一個(gè)事件控制“@(event-expression)”,而且要緊跟在always關(guān)鍵字后面。

        (2)always塊可以表示時(shí)序或者組合,也可以用always塊既表示電平敏感的透明鎖存器又同時(shí)表示組合。但是不推薦使用這種描述方法,因?yàn)檫@容易產(chǎn)生錯(cuò)誤和多余的電平敏感的透明鎖存器。

        (3) 帶有posedge 或 negedge 關(guān)鍵字的事件表達(dá)式表示沿觸發(fā)的時(shí)序邏輯;沒有posedge 或negedge關(guān)鍵字的表示組合邏輯或電平敏感的鎖存器,或者兩種都表示。在表示時(shí)序和組合邏輯的事件控制表達(dá)式中如有多個(gè)沿和多個(gè)電平,其間必須用關(guān)鍵字“or” 連接 。

        (4)每個(gè)表示時(shí)序邏輯的always塊只能由一個(gè)時(shí)鐘跳變沿觸發(fā),置位或復(fù)位最好也由該時(shí)鐘跳變沿觸發(fā)。

        (5)每個(gè)在always塊中賦值的信號都必需定義成reg型或整型。整型變量缺省為32bit,使用Verilog操作符可對其進(jìn)行二進(jìn)制求補(bǔ)的算術(shù)運(yùn)算。綜合器還支持整型量的范圍說明,這樣就允許產(chǎn)生不是32位的整型量,句法結(jié)構(gòu)如下:

        integer[:]

        (6)always塊中應(yīng)該避免組合反饋回路。每次執(zhí)行always塊時(shí),在生成組合邏輯的always塊中賦值的所有信號必需都有明確的值;否則需要設(shè)計(jì)者在設(shè)計(jì)中加入電平敏感的鎖存器來保持賦值前的最后一個(gè)值。

        只有這樣,綜合器才能正常生成電路。如果不這樣做,綜合器會發(fā)出警告,提示設(shè)計(jì)中插入了鎖存器。如果在設(shè)計(jì)中存在綜合器認(rèn)為不是電平敏感鎖存器的組合回路時(shí),綜合器會發(fā)出錯(cuò)誤信息(例如設(shè)計(jì)中有異步狀態(tài)機(jī)時(shí))。

        用always塊設(shè)計(jì)純組合邏輯電路時(shí),在生成組合邏輯的always塊中,參與賦值的所有信號都必須有明確的值,即在賦值表達(dá)式右端參與賦值的信號都必需在always @(敏感電平列表)中列出。

        如果在賦值表達(dá)式右端引用了敏感電平列表中沒有列出的信號,那么在綜合時(shí),將會為該信號產(chǎn)生一個(gè)隱含的透明鎖存器。這是因?yàn)樵撔盘柕淖兓粫⒖桃鹚x值的變化,而必須等到敏感電平列表中某一個(gè)信號變化時(shí),它的作用才顯現(xiàn)出來。

        也就是相當(dāng)于存在著一個(gè)透明鎖存器把該信號的變化暫存起來,待敏感電平列表中某一個(gè)信號變化時(shí)再起作用,純組合邏輯電路不可能做到這一點(diǎn)。這樣,綜合后所得電路已經(jīng)不是純組合邏輯電路了。這時(shí)綜合器會發(fā)出警告提示設(shè)計(jì)中插入了鎖存器,如下所示:

        input a,b,c;
        reg e,d;
        always @(a or b or c) begin
        e = d a b; //因?yàn)閐沒有在敏感電平列表中,所以d變化時(shí),e不能立刻變化,
        //要等到a或b或c變化時(shí)才體現(xiàn)出來。這就是說實(shí)際上相當(dāng)于存在
        //一個(gè)電平敏感的透明鎖存器在起作用, 把d信號的變化鎖存其中
        d = e | c;
        end

        (7)對一個(gè)寄存器型(reg)或整型(integer)變量的賦值只允許在一個(gè)always塊內(nèi)進(jìn)行,如果在另一always塊也對其賦值,這是非法的。
        (8)把某一信號值賦為'bx,綜合器就把它解釋成無關(guān)狀態(tài),因而綜合器為其生成的硬件電路最簡潔。


        4.5.2 可綜合風(fēng)格的Verilog HDL模塊實(shí)例
        1.組合邏輯電路設(shè)計(jì)實(shí)例


        例4.6:8位帶進(jìn)位端的加法器的設(shè)計(jì)實(shí)例(利用簡單的算法描述)。

        module adder_8(cout,sum,a,b,cin); //模塊聲明
        output cout;
        output [7:0] sum;
        input cin;
        input[7:0] a,b; //端口聲明
        assign {cout,sum} = a + b + cin; //加法器算法
        endmodule

        例4.7:指令譯碼電路的設(shè)計(jì)實(shí)例(利用電平敏感的always塊來設(shè)計(jì)組合邏輯)。

        'define plus 3'd0 //操作碼的宏定義
        'define minus 3'd1
        'define band 3'd2
        'define bor 3'd3'
        'define unegate 3'd4

        module alu(out,opcode,a,b); //模塊聲明
        output [7:0] out;
        input [2:0] opcode;
        input [7:0] a,b; //端口聲明
        reg [7:0] out; //寄存器聲明

        always @(opcode or a or b) begin //用電平敏感的always塊描述組合邏輯
        case(opcode)
        'plus: out = a + b; //算術(shù)運(yùn)算
        'minus: out = a - b;
        'band: out = a b; //位運(yùn)算
        'bor: out = a | b;
        'unegate: out = ~a; //單目運(yùn)算
        default: out = 8'hx;
        endcase
        end
        endmodule

        例4.8:比較后重組信號的組合邏輯(利用task和電平敏感的always塊設(shè)計(jì))。

        module sort4(ra,rb,rc,rd,a,b,c,d); //模塊聲明
        output [t:0] ra, rb, rc, rd;
        input [t:0] a, b, c, d; //端口聲明
        reg [t:0] ra, rb, rc, rd;
        reg [t:0] va, vb, vc, vd; //寄存器聲明
        parameter t=3; //參數(shù)聲明

        always @(a or b or c or d) begin //用電平敏感的always塊描述組合邏輯
        {va,vb,vc,vd}={a,b,c,d};
        sort2(va,vc); //信號重組
        sort2(vb,vd);
        sort2(va,vb);
        sort2(vc,vd);
        sort2(vb,vc);
        {ra,rb,rc,rd}={va,vb,vc,vd};
        end

        task sort2; //x與y互換任務(wù)
        inout [t:0] x,y;
        reg [t:0] tmp;
        if(x > y) begin
        tmp = x; //使用臨時(shí)變量tmp保存x的值
        x = y;
        y = tmp;
        end
        endtask
        endmodule

        例4.9:比較器的設(shè)計(jì)實(shí)例(利用賦值語句設(shè)計(jì)組合邏輯)。

        module compare(equal,a,b); //模塊聲明
        output equal;
        input [size-1:0] a,b; //端口聲明
        parameter size=1; //參數(shù)聲明
        assign equal =(a==b)? 1 : 0; //比較器
        endmodule

        例4.10:3-8譯碼器設(shè)計(jì)實(shí)例(利用賦值語句設(shè)計(jì)組合邏輯)。

        module decoder(out,in); //模塊聲明
        output [7:0] out;
        input [2:0] in; //端口聲明
        assign out = 1'b1in; //把最低位的1左移 in(根據(jù)從in口輸入的值)位
        //將移位結(jié)果賦予out
        endmodule

        例4.11:3-8編碼器的設(shè)計(jì)實(shí)例。
        編碼器設(shè)計(jì)方案一。

        module encoder1(none_on,out,in); //模塊聲明
        output none_on;
        output [2:0] out;
        input [7:0] in; //端口聲明
        reg [2:0] out;
        reg none_on; //寄存器聲明
        always @(in) begin: local //in有變化時(shí),觸發(fā)
        integer i; //變量聲明
        out = 0;
        none_on = 1; //初始化
        for( i=0; i8; i=i+1 ) begin //for循環(huán)語句
        if( in[i] ) begin //將in中值為1的位編碼
        out = i;
        none_on = 0;
        end
        end
        end
        endmodule


        上一頁 1 2 下一頁

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 千阳县| 嵩明县| 浦北县| 台东市| 津市市| 哈密市| 渝中区| 招远市| 卓尼县| 罗源县| 当雄县| 定西市| 依兰县| 定南县| 永德县| 普兰县| 汉中市| 江油市| 新乐市| 黔江区| 盐源县| 杂多县| 全州县| 辉南县| 抚宁县| 香格里拉县| 宁晋县| 资中县| 石首市| 喀喇| 济宁市| 昌黎县| 湖南省| 灵璧县| 弥渡县| 贡山| 涞水县| 漳浦县| 巫溪县| 南江县| 教育|