日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

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

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

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

          編碼器設(shè)計(jì)方案二。

          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語(yǔ)句實(shí)現(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語(yǔ)句進(jìn)行編碼
          assign out2 = outvec[2];
          assign out1 = outvec[1];
          assign out0 = outvec[0];
          endmodule

          編碼器設(shè)計(jì)方案三。

          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語(yǔ)句實(shí)現(xiàn)向量賦值
          else if(g) outvec=4'b0110; //共9個(gè)分支,其中向量的低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:多路器的設(shè)計(jì)實(shí)例。


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

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

          多路器設(shè)計(jì)方案二。

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

          多路器設(shè)計(jì)方案三。

          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語(yǔ)句檢查輸入信號(hào)sel的值
          out = a; //如果為1,輸出out為a
          else
          out = b; //如果為0,輸出out為b
          end
          endmodule

          例4.13:奇偶校驗(yàn)位生成器設(shè)計(jì)實(shí)例。

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

          例4.14:三態(tài)輸出驅(qū)動(dòng)器設(shè)計(jì)實(shí)例(用連續(xù)賦值語(yǔ)句建立三態(tài)門(mén)模型)。
          三態(tài)輸出驅(qū)動(dòng)器設(shè)計(jì)方案一。

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

          三態(tài)輸出驅(qū)動(dòng)器設(shè)計(jì)方案二。

          module trist2( out,in,enable ); //模塊聲明
          output out;
          input in,enable; //端口聲明
          bufif1 mybuf1(out, in, enable); //bufif1是一個(gè) Verilog門(mén)級(jí)原語(yǔ)(primitive)
          //通過(guò)實(shí)例化該原語(yǔ),實(shí)現(xiàn)三態(tài)門(mén)的調(diào)用
          endmodule

          例4.15:三態(tài)雙向驅(qū)動(dòng)器設(shè)計(jì)實(shí)例。

          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)門(mén)的輸入為in
          assign out = tri_inout ^ b; //三態(tài)門(mén)的輸出為b
          endmodule


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

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

          例4.17:電平敏感型鎖存器設(shè)計(jì)實(shí)例一(assign語(yǔ)句)。

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

          例4.18:帶置位和復(fù)位端的電平敏感型鎖存器設(shè)計(jì)實(shí)例二(assign語(yǔ)句)。

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

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

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

          注意 有的綜合器會(huì)產(chǎn)生一個(gè)警告信息,提示將產(chǎn)生了一個(gè)電平敏感型鎖存器。因?yàn)榇死性O(shè)計(jì)的就是一個(gè)電平敏感型鎖存器,所以這個(gè)警告信息是沒(méi)有問(wèn)題的。

          例4.20:移位寄存器設(shè)計(jì)實(shí)例。

          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; //把輸入信號(hào)放入寄存器的最低位
          end
          end
          endmodule


          例4.21:8位計(jì)數(shù)器設(shè)計(jì)實(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 //邊緣檢測(cè)
          if( load ) //加載信號(hào)檢測(cè)
          out = data;
          else
          out = out + cin;
          end
          assign cout= out cin; //只有當(dāng)out[7:0]的所有各位都為1
          //并且進(jìn)位cin也為1時(shí)才能產(chǎn)生進(jìn)位cout
          endmodule

          例4.22:8位計(jì)數(shù)器設(shè)計(jì)實(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 //邊緣檢測(cè)
          out = preout; //觸發(fā)器
          end
          //計(jì)算計(jì)數(shù)器和進(jìn)位的下一個(gè)狀態(tài),為提高性能,load不應(yīng)影響進(jìn)位
          always @( out or data or load or cin ) begin
          {cout, preout} = out + cin; //進(jìn)位操作
          if(load) preout = data; //判斷加載信號(hào)
          end
          endmodule


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉