Thông báo

Collapse
No announcement yet.

Cần giúp đỡ về Verilog

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Bác nào cho em hỏi về verilog một chút :trong verilog thì khối generate có những tác dụng gì ?
    mdtuyen

    Comment


    • #17
      Nguyên văn bởi MDTUYEN Xem bài viết
      Bác nào cho em hỏi về verilog một chút :trong verilog thì khối generate có những tác dụng gì ?
      Khối "generate" này bắt chước bên VHDL, dùng để lập ra những logic tương tự trong "for loop" body. Ví dụ

      Code:
        generate
            for (i=0; i<8;i++)
               o[i] = a[i] && b[i];
        endgenerate
      sẽ lập ra 8 cổng AND.

      Tony
      Chúc một ngày vui vẻ
      Tony
      email : dientu_vip@yahoo.com

      Comment


      • #18
        Spartan 3E FPGA

        Chào các bạn,

        Mình hiện đang có một card FPGA của digilent (Nexys2 board), và hiện tại mình đang gặp khó khăn trong việc lập trình cho card này. Các bạn có kinh nghiệm lập trình cho Spartan 3E FPGA (bằng Verilog) giúp mình với. Mình cảm ơn rất nhiều!

        Comment


        • #19
          Nguyên văn bởi Nexys2 Xem bài viết
          Chào các bạn,

          Mình hiện đang có một card FPGA của digilent (Nexys2 board), và hiện tại mình đang gặp khó khăn trong việc lập trình cho card này. Các bạn có kinh nghiệm lập trình cho Spartan 3E FPGA (bằng Verilog) giúp mình với. Mình cảm ơn rất nhiều!
          Bạn hỏi chung chung như vậy kô có ai biết bạn bị trở ngại gì để mà giúp. Bạn nên tìm hiểu kỹ càng về vấn đề rồi đặt câu hỏi, càng nhiều chi tiết càng tốt để mọi người hiểu là bạn bị vướng mắc ở chỗ nào. Có ví dụ thì tốt hơn.
          Chúc một ngày vui vẻ
          Tony
          email : dientu_vip@yahoo.com

          Comment


          • #20
            Spartan 3E

            Nguyên văn bởi tonyvandinh Xem bài viết
            Bạn hỏi chung chung như vậy kô có ai biết bạn bị trở ngại gì để mà giúp. Bạn nên tìm hiểu kỹ càng về vấn đề rồi đặt câu hỏi, càng nhiều chi tiết càng tốt để mọi người hiểu là bạn bị vướng mắc ở chỗ nào. Có ví dụ thì tốt hơn.
            Cảm ơn bạn tonyvandinh rất nhiều. Mình mới bắt đầu tìm hiểu FPGA và Verilog nên tất cả mọi thứ đều rất mới với mình. Dưới đây là một chương trình mẫu, mình vẫn chưa hiểu trong cấu trúc "case" này, các bạn jup mình nhé!

            ///
            module gp1(
            input clk,intflag,
            inout d0,d1,d2,d3,d4,d5,d6,d7,
            output reg ad0,ad1,ad2,ad3,
            output reg wrn,rn,csn,
            output start, stop,
            output anode0,anode1,anode2,anode3,
            output segA, segB, segC, segD, segE, segF, segG, segDP);

            reg [7:0] sevenseg;
            reg [3:0] BCD;
            reg anode0_state,anode1_state,anode2_state,anode3_stat e;
            reg [25:0] count;
            reg [15:0] tdc;
            reg [7:0] regval = 8'bZZZZZZZZ;
            reg read = 1'b0;
            reg [2:0] state = 3'b000;
            reg [2:0] count_rw = 3'b000;

            always @(posedge clk)
            count <= count + 1;

            always @(posedge clk)
            case(state)
            3'b000:
            begin
            rn = 1;
            if (count[24:0]==25'b1000000000000000000000000) state <= 3'b001;
            end
            3'b001:
            begin
            if (count_rw == 2'b000)
            begin
            read = 1'b0;
            regval = 8'b00000111;
            {ad3,ad2,ad1,ad0} <= 4'b1011;
            csn = 0;
            wrn = 0;
            end
            if (count_rw == 3'b111)
            begin
            wrn = 1;
            csn = 1;
            state <= 3'b010;
            count_rw <= 3'b000;
            regval = 8'bZZZZZZZZ;
            end
            else
            count_rw <= count_rw + 1;
            end

            3'b010:
            begin
            if (count_rw == 2'b000)
            begin
            regval = 8'b00000001;
            {ad3,ad2,ad1,ad0} <= 4'b0010;
            csn = 0;
            wrn = 0;
            end
            if (count_rw == 3'b111)
            begin
            wrn = 1;
            csn = 1;
            state <= 3'b011;
            count_rw <= 3'b000;
            regval = 8'bZZZZZZZZ;
            end
            else
            count_rw <= count_rw + 1;
            end


            3'b011:
            if (intflag && (~read))
            begin
            if (count_rw == 3'b000)
            begin
            {ad3,ad2,ad1,ad0} <= 4'b0000;
            csn = 0;
            end
            if (count_rw == 3'b010) rn = 0;
            if (count_rw == 3'b111)
            begin
            tdc[7:0] <= {d7,d6,d5,d4,d3,d2,d1,d0};
            state <= 3'b100;
            count_rw <= 3'b000;
            rn = 1;
            csn = 1;
            end
            else
            count_rw <= count_rw + 1;
            end

            ///

            Mình chân thành cảm ơn!

            Comment


            • #21
              Mình thử giải thích cấu trúc case của bạn theo cách hiểu "bằng văn viết" của mình nhé,

              Theo như sự khai báo của bạn, state sẽ gồm 3 flip-flop, trong đó 3 chân CLK được nối chung vào tín hiệu xung clock và giá trị mặc định đầu ra của 3 Flip-flop này là 000.

              Tại mỗi thời điểm có sườn xung clock (xung clock chuyển từ 0-->1) thì
              Giá trị đầu ra của 3 filp-flop sẽ chuyển từ 000 --> 001, hoặc từ 001 --> 010, hoặc từ 010 --> 011, ... nếu điều kiện if thỏa mãn. Nếu điều kiện if không thỏa mãn thì "chắc" nó vẫn giữ nguyên giá trị. Mình đoán trong code của bạn thiếu trường hợp 100, 101, 111.

              Bạn có thể tìm đọc tài liệu về FSM (finite-state-machine) để hiểu thêm về cấu trúc case trên. Ngoài ra còn có một khái niệm là "one-hot coding" bạn cũng có thể nghiên cứu cùng với phần này.

              Hy vọng bài viết có những thông tin có ích với bạn.

              Thân mến.

              Comment


              • #22
                Nguyên văn bởi Nexys2 Xem bài viết
                Cảm ơn bạn tonyvandinh rất nhiều. Mình mới bắt đầu tìm hiểu FPGA và Verilog nên tất cả mọi thứ đều rất mới với mình. Dưới đây là một chương trình mẫu, mình vẫn chưa hiểu trong cấu trúc "case" này, các bạn jup mình nhé!

                ///
                module gp1(
                input clk,intflag,
                inout d0,d1,d2,d3,d4,d5,d6,d7,
                output reg ad0,ad1,ad2,ad3,
                output reg wrn,rn,csn,
                output start, stop,
                output anode0,anode1,anode2,anode3,
                output segA, segB, segC, segD, segE, segF, segG, segDP);

                reg [7:0] sevenseg;
                reg [3:0] BCD;
                reg anode0_state,anode1_state,anode2_state,anode3_stat e;
                reg [25:0] count;
                reg [15:0] tdc;
                reg [7:0] regval = 8'bZZZZZZZZ;
                reg read = 1'b0;
                reg [2:0] state = 3'b000;
                reg [2:0] count_rw = 3'b000;

                always @(posedge clk)
                count <= count + 1;

                always @(posedge clk)
                case(state)
                3'b000:
                begin
                rn = 1;
                if (count[24:0]==25'b1000000000000000000000000) state <= 3'b001;
                end
                3'b001:
                begin
                if (count_rw == 2'b000)
                begin
                read = 1'b0;
                regval = 8'b00000111;
                {ad3,ad2,ad1,ad0} <= 4'b1011;
                csn = 0;
                wrn = 0;
                end
                if (count_rw == 3'b111)
                begin
                wrn = 1;
                csn = 1;
                state <= 3'b010;
                count_rw <= 3'b000;
                regval = 8'bZZZZZZZZ;
                end
                else
                count_rw <= count_rw + 1;
                end

                3'b010:
                begin
                if (count_rw == 2'b000)
                begin
                regval = 8'b00000001;
                {ad3,ad2,ad1,ad0} <= 4'b0010;
                csn = 0;
                wrn = 0;
                end
                if (count_rw == 3'b111)
                begin
                wrn = 1;
                csn = 1;
                state <= 3'b011;
                count_rw <= 3'b000;
                regval = 8'bZZZZZZZZ;
                end
                else
                count_rw <= count_rw + 1;
                end


                3'b011:
                if (intflag && (~read))
                begin
                if (count_rw == 3'b000)
                begin
                {ad3,ad2,ad1,ad0} <= 4'b0000;
                csn = 0;
                end
                if (count_rw == 3'b010) rn = 0;
                if (count_rw == 3'b111)
                begin
                tdc[7:0] <= {d7,d6,d5,d4,d3,d2,d1,d0};
                state <= 3'b100;
                count_rw <= 3'b000;
                rn = 1;
                csn = 1;
                end
                else
                count_rw <= count_rw + 1;
                end

                ///

                Mình chân thành cảm ơn!
                Đây là cách viết FSM (Finite State Machine) thường dùng để điều khiển những tác động ở mỗi trường hợp riêng biệt

                reg [2:0] state = 3'b000;
                state bắt đầu với giá trị 3'b000.

                always @(posedge clk)
                case(state)
                3'b000:
                begin
                rn = 1;
                if (count[24:0]==25'b1000000000000000000000000) state <= 3'b001;
                end
                3'b001:
                Cứ mỗi lần xung clock hướng lên, những tác động (giữa begin và end) ở hiện tại "state" sẽ hoạt động và chuẩn bị cho điều kiện "state" kế tiếp. Trong khúc này, khi state = 3'b000 thì

                rn = 1
                Rồi nếu count[24:0]==25'b1000000000000000000000000 thì state sẽ chuyển qua 3'b001 cho xung clock kế. Nếu không, thì state vẫn ở điều kiện hiện tại (3'b000).

                Bạn có thể google FSM để hiểu thêm về FSM nhe.
                Chúc một ngày vui vẻ
                Tony
                email : dientu_vip@yahoo.com

                Comment


                • #23
                  Trong thread này có một vài bài tôi dùng FSM. Bạn theo dõi để tìm hiểu thêm.

                  http://www.dientuvietnam.net/forums/...ad.php?t=35670
                  Chúc một ngày vui vẻ
                  Tony
                  email : dientu_vip@yahoo.com

                  Comment


                  • #24
                    Cảm ơn bạn hithere123 và tonuvandinh rất nhiều đã phản hồi rất nhanh và giúp đỡ mình. Mình cũng đang theo hướng dẫn của các bạn tìm hiểu thêm về FSM. Đúng là trong cấu trúc case còn thêm một số trường hợp nữa, nhưng nó tùy thuộc vào bài toán của mình phải không ạ, nếu mình chỉ cần một vài trạng thái là mô tả hết các khả năng mình cần. Mình sẽ cố gắng tìm hiểu để chạy được chương trình, mình chắc sẽ cần sự trợ giúp rất nhiều từ các bạn!

                    Thanks so much!

                    Comment


                    • #25
                      Nguyên văn bởi Nexys2 Xem bài viết
                      Cảm ơn bạn hithere123 và tonuvandinh rất nhiều đã phản hồi rất nhanh và giúp đỡ mình. Mình cũng đang theo hướng dẫn của các bạn tìm hiểu thêm về FSM. Đúng là trong cấu trúc case còn thêm một số trường hợp nữa, nhưng nó tùy thuộc vào bài toán của mình phải không ạ, nếu mình chỉ cần một vài trạng thái là mô tả hết các khả năng mình cần. Mình sẽ cố gắng tìm hiểu để chạy được chương trình, mình chắc sẽ cần sự trợ giúp rất nhiều từ các bạn!

                      Thanks so much!
                      Nên hoàn thiện tất cả trường hợp cho "case" bằng cách dùng "default" cho những trường hợp mà không cần tới. Khi mạch bị giật (ESD, Electronics Statis Discharge), những registers cho FSM có thể biến qua trường hợp mà không có đề ra ở "case" và sẽ bị mắc ở trường hợp đó hoài cho đến khi tắt hoặc reset. Dùng "default" sẽ bảo công cụ RTL tổng hợp tạo logic để tránh trường hợp mắc nghẽn này nếu xảy ra.
                      Chúc một ngày vui vẻ
                      Tony
                      email : dientu_vip@yahoo.com

                      Comment


                      • #26
                        Các bạn thân mến, dao động của FPGA mình đang xài là 50M, nếu mình muốn dùng 40M thì mình có thể chia được không? Mình cần một tín hiệu 40M để làm clk-reference. Nếu được các bạn chỉ giúp mình nhé!

                        Cảm ơn các bạn nhiều!

                        Comment


                        • #27
                          Tùy theo loại FPGA nào mới được. Đa số FPGA có DCM hay là PLL bên trong. Bạn có thể dùng những module này để tạo clock với tầng số khác với tần số của clock in. Bạn có thể program DCM div=10, multiply=4 lá có thể tạo clock 40MHz.

                          Comment


                          • #28
                            Nguyên văn bởi Nexys2 Xem bài viết
                            Các bạn thân mến, dao động của FPGA mình đang xài là 50M, nếu mình muốn dùng 40M thì mình có thể chia được không? Mình cần một tín hiệu 40M để làm clk-reference. Nếu được các bạn chỉ giúp mình nhé!

                            Cảm ơn các bạn nhiều!
                            Bạn theo thread dưới đây để tìm hiểu thêm nhe.

                            http://www.dientuvietnam.net/forums/...ad.php?t=35447
                            Chúc một ngày vui vẻ
                            Tony
                            email : dientu_vip@yahoo.com

                            Comment


                            • #29
                              Như mình được biết thì trước khi bắt tay vào viết code cho một project ta phải viết một sofware để mô phỏng khối của chúng ta,nó có tác dụng giúp ta kiểm tra project đó.Bác nào có kiinh nghiệm lập trình FPGA xin chỉ cho em cách viết sofware loại này được không.Sofware này có cần bám theo thuật toán ta sẽ triển khai trên verilog ?
                              mdtuyen

                              Comment


                              • #30
                                Viết "software" thường để kiểm tra thuật toán về mặt ý tưởng .. các cái lợi:
                                - bạn có thể kết hợp với các phần software khác của hệ thống trước, xem hệ thống hoạt động thế nào (profiling), sau đó phần code software này sẽ được thay bởi phần hardware. Như vậy bạn sẽ dễ kiểm tra phần hardware của bạn hơn
                                - tận dùng phần software, bạn có thể tạo được test vector và dùng trong hardware verification.
                                ---------
                                Hiện giờ có cả ngôn ngữ systemC, ngôn ngữ này cho phép bạn mô tả phần software giống với hardware hơn là C/C++. Nghĩa là bạn có thể tạo các registers, bus, và phần software của bạn có "thời gian" (timed) so với ngôn ngữ C bình thường là không có thời gian (untimed).

                                Comment

                                Về tác giả

                                Collapse

                                player Tìm hiểu thêm về player

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X