小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

初識FPGA:各種RTL小型電路模塊的設(shè)計

 aixuexidewau1 2019-04-19

一、4選1多路選擇器

1、實現(xiàn)代碼舉例

module top(out,in0,in1,in2,in3,sel);

parameter wl=2;

Output out;

input  in0,in1,in2,in3;

input [wl-1:0]  sel;

reg  out;

always @(in0 or in1 or in2 or in3 or sel) //敏感信號列表

begin

case(sel)

2'b00: out=in0;

2'b01: out=in1;

2'b10: out=in2;

2'b11: out=in3;

default: out=0;

endcase

end

endmodule  

2、仿真RTL圖

3、仿真波形圖

二、4X4路交叉開關(guān)

實際上是選擇器的組合體,通常用在復雜一些的信號選通的場合。每一個輸出端都有對應(yīng)的選通信號,用選通信號控制輸出端選通到哪個輸入端。當輸入和輸出的端口增加時,該電路會消耗非常多的電路資源。

1、實現(xiàn)代碼舉例

module top(  IN0,  IN1 ,IN2 , IN3 , SEL0,SEL1,SEL2,SEL3,OUT0,OUT1,OUT2, OUT3);

parameter wl=2;

input  IN0,IN1,IN2,IN3;

input [wl-1:0]SEL0, SEL1, SEL2, SEL3;

output OUT0, OUT1,OUT2,OUT3;

reg  OUT0, OUT1,OUT2,OUT3;

always @ (IN0 or IN1 or IN2 or IN3 or SEL0 ) begin

 case(SEL0)

    2'b00: OUT0 = IN0;

    2'b01: OUT0 = IN1;

    2'b10: OUT0 = IN2;

    2'b11: OUT0 = IN3;

 endcase

end

always @ (IN0 or IN1 or IN2 or IN3 or SEL1 ) begin

 case(SEL1)

    2'b00: OUT1 = IN0;

    2'b01: OUT1 = IN1;

    2'b10: OUT1 = IN2;

    2'b11: OUT1 = IN3;

 endcase

end

always @ (IN0 or IN1 or IN2 or IN3 or SEL2 ) begin

 case(SEL2)

    2'b00: OUT2 = IN0;

    2'b01: OUT2 = IN1;

    2'b10: OUT2 = IN2;

    2'b11: OUT2 = IN3;

 endcase

end

always @ (IN0 or IN1 or IN2 or IN3 or SEL3 ) begin

 case(SEL3)

    2'b00: OUT3 = IN0;

    2'b01: OUT3 = IN1;

    2'b10: OUT3 = IN2;

    2'b11: OUT3 = IN3;

 endcase

end

endmodule

2、仿真RTL圖

三、8輸入的優(yōu)先編碼器

1、實現(xiàn)代碼舉例

module top( IN , OUT );

input [7:0] IN;

output[3:0] OUT;

reg   [3:0] OUT;

always @ (IN) begin

   if(IN[7])       

     OUT = 4'b0111;

   else if(IN[6])  

     OUT = 4'b0110;

   else if(IN[5])  

     OUT = 4'b0101;

   else if(IN[4])  

     OUT = 4'b0100;

   else if(IN[3])  

     OUT = 4'b0011;

   else if(IN[2])  

     OUT = 4'b0010;

   else if(IN[1])  

     OUT = 4'b0001;

    else if(IN[0])         

     OUT = 4'b0000;

     else            // 什么都沒有檢測到

     OUT = 4'b1111;  // 輸出值可自定義,不和上面的輸出值混淆即可

end

endmodule

2、仿真RTL圖

四、4-16譯碼器

1、實現(xiàn)代碼舉例

module top( IN,OUT); 

input [3:0] IN;

output[15:0] OUT;

reg   [15:0] OUT;

always @ (IN) begin

  case(IN)

    4'b0000: OUT = 16'b0000000000000001;

    4'b0001: OUT = 16'b0000000000000010;

    4'b0010: OUT = 16'b0000000000000100;

    4'b0011: OUT = 16'b0000000000001000;

    4'b0100: OUT = 16'b0000000000010000;

    4'b0101: OUT = 16'b0000000000100000;

    4'b0110: OUT = 16'b0000000001000000;

    4'b0111: OUT = 16'b0000000010000000;

    4'b1000: OUT = 16'b0000000100000000;

    4'b1001: OUT = 16'b0000001000000000;

    4'b1010: OUT = 16'b0000010000000000;

    4'b1011: OUT = 16'b0000100000000000;

    4'b1100: OUT = 16'b0001000000000000;

    4'b1101: OUT = 16'b0010000000000000;

    4'b1110: OUT = 16'b0100000000000000;

    4'b1111: OUT = 16'b1000000000000000;

    //  full case 不需要寫default,否則一定要有default

  endcase

end

endmodule

2、仿真RTL圖

輸入序列位數(shù)越大,仿真的資源開銷越大

五、加法器

1、無符號加法器

(1)實現(xiàn)代碼舉例(四輸入四輸出)

module top( IN1,IN2,OUT);

input[3:0] IN1, IN2;

output[3:0] OUT;

reg[3:0] OUT;

always@(IN1 or IN2) begin // 生成組合邏輯的always 塊

  OUT = IN1 + IN2;

end

endmodule

(2)仿真波形圖

如果增加輸入位數(shù),波形延遲也將增加,一旦輸出超出給定的位寬,波形將從最低位開始顯示,高位將顯示不了。

2、有符號加法器

(1)實現(xiàn)代碼舉例(四輸入四輸出)

module top( IN1   ,IN2   , OUT   );

input signed [3:0] IN1, IN2;

output signed [3:0] OUT;

reg signed [3:0] OUT;

always@(IN1 or IN2) begin // 生成組合邏輯的always 塊

  OUT = IN1 + IN2;

end

endmodule

(2)仿真波形圖

3、帶流水線的加法器

(1)實現(xiàn)代碼舉例(八輸入五輸出,含兩級流水線)

module top( IN1   ,IN2   ,CLK   ,OUT   );

input  [7:0] IN1, IN2;

input CLK;

output  [4:0] OUT;

reg [7:0] in1_d1R, in2_d1R,in11_d1R, in22_d1R;

reg  [4:0] adder_out1,OUT;

always@(posedge CLK) begin // 生成D觸發(fā)器的always塊

  in1_d1R <= IN1;

  in2_d1R <= IN2;

  in11_d1R <= in1_d1R;

  in22_d1R <= in2_d1R;

  OUT     <= adder_out1;

end

always@(in11_d1R or in22_d1R) begin // 生成組合邏輯的always 塊

  adder_out1=in11_d1R+in22_d1R;

end

endmodule

(2)仿真RTL圖

(3)仿真波形圖

和不帶流水線的加法器相比,毛刺的時間長度變短變少,因為加入的D觸發(fā)器使得對應(yīng)的輸入和輸出同步起來,總體輸出晚了四個時鐘。輸入數(shù)據(jù)和其對應(yīng)的結(jié)果不在一個時鐘周期。

六、帶流水線的無符號乘法器

1、實現(xiàn)代碼舉例

module top( IN1   , IN2   ,CLK   , OUT   );

 input [3:0] IN1, IN2;

 input  CLK   ;

 output [7:0] OUT;

 reg [3:0] in1_d1R, in2_d1R;

reg  [7:0] adder_out, OUT;

always@(posedge CLK) begin // 生成D觸發(fā)器的always塊

  in1_d1R <= IN1;

  in2_d1R <= IN2;

  OUT     <= adder_out;

end

always@(in1_d1R or in2_d1R) begin // 生成組合邏輯的always 塊

  adder_out = in1_d1R * in2_d1R;

end

endmodule

2、仿真RTL圖

3、仿真波形圖

沒有硬件乘法器的FPGA芯片編譯之后的資源開銷遠遠增大。和不帶流水線的乘法器相比,毛刺的時間長度變短變少,因為加入的D觸發(fā)器使得對應(yīng)的輸入和輸出同步起來,總體輸出晚了3個時鐘。輸入數(shù)據(jù)和其對應(yīng)的結(jié)果不在一個時鐘周期。

七、計數(shù)器

1、實現(xiàn)代碼舉例

module top(
  RST   , // 異步復位, 高有效in
  CLK   , // 時鐘,上升沿有效in
  EN    , // 輸入的計數(shù)使能,高有效
  CLR   , // 輸入的清零信號,高有效
  LOAD  , // 輸入的數(shù)據(jù)加載使能信號,高有效
  DATA  , // 輸入的加載數(shù)據(jù)信號
  CNTVAL,
  cnt_next, // 輸出的計數(shù)值信號
  OV    );// 計數(shù)溢出信號,計數(shù)值為最大值時該信號為1

input RST   , CLK   , EN    , CLR   , LOAD  ;
input [3:0] DATA ;
output [3:0] CNTVAL,cnt_next;
output OV; 

reg [3:0] CNTVAL, cnt_next;

reg OV;
// 電路編譯參數(shù),最大計數(shù)值
parameter CNT_MAX_VAL = 9;

// 組合邏輯,生成cnt_next
// 計數(shù)使能最優(yōu)先,清零第二優(yōu)先,加載第三優(yōu)先
always @(EN or CLR or LOAD or DATA or CNTVAL)
begin//1
  if(CLR)
   begin // 清零有效
     cnt_next=0;
    end
  else
  begin//clr wuxiao  
    if(EN)
    begin  //en youxiao
      if(LOAD)
      begin // 加載有效
        cnt_next = DATA;
      end
      else
      begin     // 加載無效,正常計數(shù)
        // 使能有效,清零和加載都無效,根據(jù)當前計數(shù)值計算下一值
        if(CNTVAL < CNT_MAX_VAL)
        begin // 未計數(shù)到最大值, 下一值加1
          cnt_next = CNTVAL + 1'b1;
        end
        else
        begin // 計數(shù)到最大值,下一計數(shù)值為0
          cnt_next = 0;
        end
    
      end//load wuxiao
    end //en youxiao
    else
     begin  // 使能無效,計數(shù)值保持不動
     cnt_next = CNTVAL;
     end // else EN wuxiao
       
  end //clr wuxiao
end  //1
// 時序邏輯 更新下一時鐘周期的計數(shù)值
// CNTVAL 會被編譯為D觸發(fā)器
always @ (posedge CLK or posedge RST)
begin
  if(RST)
    CNTVAL <= 0;
  else
    CNTVAL <= cnt_next;
end

// 組合邏輯,生成OV
always @ (CNTVAL)
 begin
  if(CNTVAL == CNT_MAX_VAL)
    OV = 1;
  else
    OV = 0;
 end

endmodule

2、仿真RTL圖

該計數(shù)器帶有多種信號,其中同步清零CLR的優(yōu)先級最高,使能EN次之,LOAD最低。

八、狀態(tài)機

設(shè)計一個用于識別2進制序列“1011”的狀態(tài)機,電路每個時鐘周期輸入1比特數(shù)據(jù),當捕獲到1011的時鐘周期,電路輸出1,否則輸出0,給電路添加輸入使能端口,只有輸入使能EN為1的時鐘周期,才從輸入的數(shù)據(jù)端口向內(nèi)部獲取1比特序列數(shù)據(jù)。

1、實現(xiàn)代碼舉例

module top(
  CLK       ,   // clock
  RST       ,
  EN        ,   // reset
  CENT1IN   ,   // input 1 cent coin
  TINOUT    );  // output 1 tin cola

input  CLK       ;
input  RST   ,EN    ;
input  CENT1IN   ;
output TINOUT    ;

parameter ST_0_CENT = 0;
parameter ST_1_CENT = 1;
parameter ST_2_CENT = 2;
parameter ST_3_CENT = 3;
parameter ST_4_CENT = 4;
reg [4-2:0]stateR       ;
reg [4-2:0]next_state   ;
reg        TINOUT       ;

// calc next state
always @ (CENT1IN or stateR or EN)
begin
  if(EN)
begin
  case (stateR)
    ST_0_CENT :begin if(CENT1IN) next_state = ST_1_CENT ; else next_state = ST_0_CENT; end
    ST_1_CENT :begin if(CENT1IN) next_state = ST_2_CENT ; else next_state = ST_0_CENT; end
    ST_2_CENT :begin if(CENT1IN) next_state = ST_0_CENT ; else next_state = ST_3_CENT; end
    ST_3_CENT :begin if(CENT1IN) next_state = ST_4_CENT ; else next_state = ST_0_CENT; end
    ST_4_CENT :begin next_state = ST_0_CENT; end
  endcase

  if(stateR == ST_4_CENT)

  begin

  TINOUT = 1'b1;
  end
  else
  begin

  TINOUT = 1'b0;
  end
  end
  else //en
  begin
  next_state = ST_0_CENT;
  end
  end

always @ (posedge CLK or posedge RST)begin
  if(RST)
    stateR <= ST_0_CENT;
  else
    stateR <= next_state;
end

endmodule

2、仿真波形圖

九、移位寄存器

帶加載使能和移位使能的并入串出的移位寄存器

1、實現(xiàn)代碼舉例

module top(
  RST   ,   // 異步復位, 高有效
  LOAD  ,
  CLK   ,   // 時鐘,上升沿有效
  EN    ,   // 輸入數(shù)據(jù)串行移位使能
  IN  ,
 // 輸入串行數(shù)據(jù)
  OUT   );  // 并行輸出數(shù)據(jù)
input RST, CLK, EN,LOAD;
input [3:0] IN;
output OUT;
reg OUT;
reg [2:0] shift_R;
always @ (posedge CLK or posedge RST )
begin//1
if(RST)
  begin//2
  shift_R[2:0] <= 0;
  OUT <= 0;
  end //2  
else //RST
    begin//3
    if(EN)
    begin
//    shift_RD[3:0]  <= IN[3:0]  ;
        // begin
         if(LOAD)
         begin
         OUT <= IN[3];
         shift_R[2:0]  <= IN[2:0];
         end 
         else begin // 使能無效保持不動
         OUT <=  shift_R[2];
         shift_R[2:1]  <=  shift_R[1:0];
         shift_R[0]  <=   0;
         end       
    end//8       
    //end//
    else//EN
    begin//5
            shift_R[2:0] <= shift_R[2:0];
            OUT <= OUT;
        
    end
    end        
    end  
endmodule

2、仿真RTL圖

3、仿真波形圖

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多