advertisement

2013年10月21日

FPGA 上課筆記

程序指定(procedural assignment)
    變數名 = 延遲 運算式;

ex   wire [2:0] a,b;
      wire [2:0] sum;
      wire c;
     {c,sum}= a+b;
使用"="號指定方式為阻斷式(blocking)





always@(posedge clk or negedge rst)//錯誤的寫法藍色圖形
  if(rst_) begin
               Q0 = 0;
               Q1 = 0;
               Q2 = 0;
             end
else   begin  ///阻斷式 當 Q0 = Din;執行時,會等其執行完才會執行下個Q1 = Q0;
              Q0 = Din;
              Q1 = Q0;
              Q2 = Q1;
         end

非阻斷式指定(non-blocking assignment)用於彼此之間有關係
         變數名 <= 延遲 運算式;
ex: always@(posedge clk or negedge rst_)//正確的寫法黑色的圖
  if(rst_) begin
               Q0 <= 0;
               Q1 <= 0;
               Q2 <= 0;
             end
else   begin  ///非阻斷式當Q0 <= Din;還沒執行完即會執行 Q1 <= Q0;
              Q0 <= Din;
              Q1 <= Q0;
              Q2 <= Q1;
         end


使用非阻斷式指定可以將彼此有相關之變數指定寫在區塊內

也可以用下列方式結果相同
always@(posedge clk or negedge rst)
if(~rst_)    Q0=0;
else          Q0=Din;

always@(posedge clk or negedge rst)
if(~rst_)    Q1=0;
else          Q1=Q0;
always@(posedge clk or negedge rst)
if(~rst_)    Q2=0;
else          Q2=Q1;

課本p.6-10

1. if 敘述
  if(判斷式)  begin
              運算式1;
                    .
                    .
              運算式2;
              end

2. if(判斷式)   begin
                 運算式1;    ...............   運算式n;
                 end
   else  begin  運算式1;    ...............   運算式n;  end
3.  if(判斷式1)   begin
                 運算式1;    ...............   運算式n;
                 end
    else  if (判斷式2) begin
                 運算式1;    ...............   運算式n;
                 end
           .
           .
else  begin
                 運算式1;    ...............   運算式n;
                 end

閂鎖 latch
always@(load)
        if(load)  s=Din;

四位元比較器p.6-22module comp4(a,b,eq,gt,lt);
        input [3:0] a,b;
        output eq,gt,lt;

        always@(a or b)
        if(a==b) begin
                eq=1;gt=0;lt=0;
                end
        else if(a>b) begin
                eq=0;gt=1;lt=0;
                end     
        else begin eq=0;gt=0;lt=1; end

        always@(a or b)
        begin
                eq=0;gt=0;lt=0;
                if(a==b) eq=1;
                else if(a>b) gt=1;
                else lt=1;
        end

4對1多工器
modulle mux4_1(I[3:0],sel[1:0],y);
        input [3:0] I;
        input [1:0] sel;
        output y;

        reg y;
        always@(I or sel)
                if(sel==0) y=I[0];
                else if(sel==1) y=I[1];
                else if(sel==2) y=I[2];
                else y=I[3];
endmodule

1對4解多工(demultiplexer)
module 1_4demux(I,sel,y0,y1,y2,y3);
        input [3:0] I;
        input [1:0] sel;
        output [3:0] y0,y1,y2,y3;

        reg [3:0] y0,y1,y2,y3;
        always@(I or sel)
        if(sel==0) begin
                y0=I;y1=0;y2=0;y3=0;
                end     
        else if(sel==1) begin
                y0=0;y1=I;y2=0;y3=0;
                end
        else if(sel==2) begin
                y0=0;y1=0;y2=I;y3=0;
                end
        else begin
                y0=0;y1=0;y2=0;y3=I;
                end
endmodule

**case無優先順序
    if 有優先順序

無優先順序之判斷

case(變數)
        數值1; begin
                運算式1;...;運算式n;
                end
        數值2; begin
                運算式1;...;運算式n;
                end
          .
          .
          .
        default: begin
                運算式1;...;運算式n;
                end
endcase


if、case須寫在always內?

4對1多工器
module (I[3:0],sel,y);
        input [3:0]I;
        input [1:0]sel;
        output y;
        reg y;

        always@(I or sel)
        case(sel)
                2'd0: y=I[0];
                2'd1: y=I[1];
                2'd2: y=I[2];
                2'd3: y=I[3];
        endcase
endmodule

七段顯示編碼器
g f e d c b a
p.6-35

module seg7encoder(val[3:0],seg7[6:0]);
        input [3:0] val;
        output [6:0] seg7;

        reg [6:0] seg7;
        always@(val)
                case(val)
                        4'h0:seg7=7'h40;
                        4'h1:seg7=7'h79;
                        4'h2:seg7=7'h24;
                        4'h3:seg7=7'h30;
                        4'h4:seg7=7'h19;
                        4'h5:seg7=7'h12;
                        4'h6:seg7=7'h02;
                        4'h7:seg7=7'h78;
                        4'h8:seg7=7'h0;
                        4'h9:seg7=7'h10;
                        4'ha:seg7=7'h08;
                        4'hb:seg7=7'h03;
                        4'hc:seg7=7'h46;
                        4'hd:seg7=7'h21;
                        4'he:seg7=7'h06;
                        4'hf:seg7=7'h0e;
                        default:seg7=7'h7f;
                endcase
endmodule

`timescale 1ns/100ps
`include "test.v"

module test;
        reg [3:0] val;
        wire [6:0] seg7;

        seg7encoder U1 (val[3:0],seg7[6:0]);

        integer i;
        initial
        begin
                for(i=0;i<=15;i=i+1)
                begin
                        val=i;
                        #20;
                end
        end

        initial
        begin
                $dumpfile("test.vcd");
                $dumpvars;
        end

endmodule

沒有留言:

張貼留言

文章有誤或有問題麻煩您留言告知! 謝謝您~~