Thông báo

Collapse
No announcement yet.

thiết kê FIFO dựa trên synch dual port ram

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

  • thiết kê FIFO dựa trên synch dual port ram

    tình hình là em đang ôn luyện phần thiết kế số, gặp cái bộ đệm fifo này thấy trong sách của thày có nói đến cách thiết kế FIFO dựa trên dual ram, thì như em thấy em đã viết đựoc cho khối dual ram, còn khối FIFO state,write_FIFO,read_FIFO thì vẫn chưa hiểu lắm, nhờ các bác giải đáp giùm:
    về khối FIFO_state thì đựoc gợi ý như thé này, khối này tạo ra 2 tín hiệu là FIFO_empty và FIFO_full bằng cách sử dụng 1 bộ đếm, nếu giá trị đếm =0 thì FIFO_empty=1 còn nếu giá trị đếm đạt max thì FIFO_full=1, nếu chỉ đọc và không ghi thì giá trị đếm giảm đi 1, còn nếu chỉ ghi mà không đọc thì giá trị đếm tămg 1, nêu vừa có cả ghi và đọc thì giá trị đếm không đổi, khối này thì em nghĩ là em đã viết đựoc rồi nhưng còn 2 khối còn lại
    write_FIFO dùng port A, theo như trong hình theo khối này cũng sẽ sử dụng 1 bộ đếm để tạo ra giá trị cho địa chỉ của port A, data như vậy sẽ đựoc lưu vào các ngăn theo giá trị định sẵn, và chỉ ghi vào khi bộ nhớ vẫn còn chống đến khi nó lấp đầy hết mà tính hiệu vẫn đưa vào thì phải làm sao để không nhận dự liệu nữa ????
    read_FIFO dùng port B, em thì hơi yếu về ram, trứoc h ít khi đụng vào nhưng nhìn như thế này em thấy nó hơi lạ là 2 port này độc lập với nhau, đó là nếu đầu vào là data_inA thì đầu ra sẽ là data_outA (tưong tự cho port B) vậy nếy đến khối write_FIFO ở portA read_FIFO ở port B thì làm sao đọc tín hiệu ra được ( câu này em hỏi hơi ngu, tại em cũng chưa tra cứu kỹ)???

    Click image for larger version

Name:	FIFO.PNG
Views:	2
Size:	51.8 KB
ID:	1421590
    Last edited by boyzzun; 13-06-2014, 16:07.

  • #2
    Hình của bạn nhỏ tẹo ... không thấy gì cả

    Comment


    • #3
      ừ nhỉ, sao nó lại bé thế nhỉ
      đc ròi bác ak
      Attached Files
      Last edited by boyzzun; 13-06-2014, 16:11.

      Comment


      • #4
        Nguyên văn bởi boyzzun Xem bài viết
        [ATTACH=CONFIG]87646[/ATTACH] ừ nhỉ, sao nó lại bé thế nhỉ
        đc ròi bác ak
        2 port này dùng chung một mảng chứa data, nên data ghi vào ở A sẽ đọc ra ở B được.

        Cần dùng 2 port để có thể thực hiện ghi và đọc trong 1 clock cycle

        Comment


        • #5
          Địa chỉ của A và B được tăng lên sau mỗi lần ghi/đọc ... Bạn phải có logic ở trong module này hoặc ở ngoài, không cho phép ghi nũa ghi FIFO_full = 1, nếu không địa chỉ ghi sẽ vượt qua địa chỉ đọc ==> SAI ...

          Comment


          • #6
            Nguyên văn bởi jefflieu Xem bài viết
            2 port này dùng chung một mảng chứa data, nên data ghi vào ở A sẽ đọc ra ở B được.

            Cần dùng 2 port để có thể thực hiện ghi và đọc trong 1 clock cycle
            có nghĩa là data đi vào A thì ngay trong xung này sẽ đc đoc luôn ra ở B hả bác, còn nếu ghi vào A mà đọc ra cũng tại A thì phải chờ thêm 1 xung clk nữa đúng không bác

            Comment


            • #7
              Ghi ở A và đọc ở B trong cùng 1 clock nhưng không phải củng 1 địa chỉ ...
              Data đi vào và đi ra là 2 data khác nhau ở 2 ô nhớ khác nhau ...

              Comment


              • #8
                Nguyên văn bởi jefflieu Xem bài viết
                Ghi ở A và đọc ở B trong cùng 1 clock nhưng không phải củng 1 địa chỉ ...
                Data đi vào và đi ra là 2 data khác nhau ở 2 ô nhớ khác nhau ...
                vậy thì hơi khó hiểu,nếu đã không phải cùng 1 data thì việc đọc ghi đồng thời được sử dụng trong hoàn cảnh này ntn, bác chỉ rõ cho em được không, vì em tự viết dual ram bằng tay nên khả năng là viết sai

                Comment


                • #9
                  Nguyên văn bởi boyzzun Xem bài viết
                  vậy thì hơi khó hiểu,nếu đã không phải cùng 1 data thì việc đọc ghi đồng thời được sử dụng trong hoàn cảnh này ntn, bác chỉ rõ cho em được không, vì em tự viết dual ram bằng tay nên khả năng là viết sai
                  FIFO hay dùng để buffering ...
                  1 Ví dụ là khi gửi gói data có chứa âm thanh, ghi gủi qua network chẳng hạn, data sẽ đến với dạng packet và không đều ... nhưng khi play-out, âm thanh phải được play-out với tấng số bằng tầng số lấy mẫu .... (tốc độ đểu) ...
                  Cho nên FIFO được dùng để buffer các gói đến, chờ đó và đọc ra vói tốc độ đểu.

                  Ghi :__----------_______________----------______________----------__________________________----------_____________________----------______________________
                  Đọc:_____-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__

                  Sẽ có một số thời điểm data đựoc ghi vào và đọc ra cùng lúc nhưng data đó khác nhau ..

                  Comment


                  • #10
                    Nguyên văn bởi jefflieu Xem bài viết
                    FIFO hay dùng để buffering ...
                    1 Ví dụ là khi gửi gói data có chứa âm thanh, ghi gủi qua network chẳng hạn, data sẽ đến với dạng packet và không đều ... nhưng khi play-out, âm thanh phải được play-out với tấng số bằng tầng số lấy mẫu .... (tốc độ đểu) ...
                    Cho nên FIFO được dùng để buffer các gói đến, chờ đó và đọc ra vói tốc độ đểu.

                    Ghi :__----------_______________----------______________----------__________________________----------_____________________----------______________________
                    Đọc:_____-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__-__

                    Sẽ có một số thời điểm data đựoc ghi vào và đọc ra cùng lúc nhưng data đó khác nhau ..
                    nhưng mà em vẫn chưa hiểu lắm, 2 cái read_FIFO với write_FIFO là 2 khối trong 1 FIFO hay là 2 FIFO riêng biệt vậy, vì nếu là 2 khối trong 1 FIFO thì làm sao để đưa dữ liệu vào A rồi lại đưa dữ liệu ra B (cùng là 1 dứ liệu data ử cùng 1 ô nhớ)

                    Comment


                    • #11
                      theo mình thấy thì nó nên nằm trong 1 khối và có đường dữ liệu I/O .... và FIFO nên có 2 biến đếm. 1 biến đếm cho đọc (nó nằm ở đầu của hàng đợi) , 1 biến đếm cho ghi ( nó nằm ở đỉnh phía cuối của hàng đợi )
                      nếu địa chỉ read< write => okie
                      nếu địa chỉ read= write => empty
                      nếu địa chỉ write= max => full => cần có cơ chế sử dụng quay vòng của hàng đợi đẻ tránh bị tràn - hoặc là phải dịch toàn bộ hàng đợi sau mỗi lần đọc ra.
                      nếu địa read > write => không hợp lệ

                      Comment


                      • #12
                        Nguyên văn bởi boyzzun Xem bài viết
                        nhưng mà em vẫn chưa hiểu lắm, 2 cái read_FIFO với write_FIFO là 2 khối trong 1 FIFO hay là 2 FIFO riêng biệt vậy, vì nếu là 2 khối trong 1 FIFO thì làm sao để đưa dữ liệu vào A rồi lại đưa dữ liệu ra B (cùng là 1 dứ liệu data ử cùng 1 ô nhớ)
                        FIFO = first in first out ...
                        Cái hình bạn đưa lên là 1 FIFO ..
                        read_FIFO nên gọi là read_control
                        write_FIFO nên gọi là write_control

                        Comment


                        • #13
                          Nguyên văn bởi tan0710 Xem bài viết
                          theo mình thấy thì nó nên nằm trong 1 khối và có đường dữ liệu I/O .... và FIFO nên có 2 biến đếm. 1 biến đếm cho đọc (nó nằm ở đầu của hàng đợi) , 1 biến đếm cho ghi ( nó nằm ở đỉnh phía cuối của hàng đợi )
                          nếu địa chỉ read< write => okie
                          nếu địa chỉ read= write => empty
                          nếu địa chỉ write= max => full => cần có cơ chế sử dụng quay vòng của hàng đợi đẻ tránh bị tràn - hoặc là phải dịch toàn bộ hàng đợi sau mỗi lần đọc ra.
                          nếu địa read > write => không hợp lệ
                          Dùng read < write hay read>write không ổn vì write pointer se quay vòng lại ... Giả sử FIFO của bạn có 8 ô thì sẽ có lúc:
                          read_pointer = 6, write pointer = 3 ... data chủa đọc ra năm trong địa chỉ: 6 7 0 1 2
                          Tốt nhất là giữ 1 register nũa đếm số data chưa đọc ra

                          Comment


                          • #14
                            Nguyên văn bởi tan0710 Xem bài viết
                            theo mình thấy thì nó nên nằm trong 1 khối và có đường dữ liệu I/O .... và FIFO nên có 2 biến đếm. 1 biến đếm cho đọc (nó nằm ở đầu của hàng đợi) , 1 biến đếm cho ghi ( nó nằm ở đỉnh phía cuối của hàng đợi )
                            nếu địa chỉ read< write => okie
                            nếu địa chỉ read= write => empty
                            nếu địa chỉ write= max => full => cần có cơ chế sử dụng quay vòng của hàng đợi đẻ tránh bị tràn - hoặc là phải dịch toàn bộ hàng đợi sau mỗi lần đọc ra.
                            nếu địa read > write => không hợp lệ
                            cách của bác là viết FIFO dựa trên con trỏ thì phải, em cũng tháy trên mạng, nhưng dựa vào dual ram thì hình như nó có khác một chút

                            Comment


                            • #15
                              Nguyên văn bởi jefflieu Xem bài viết
                              FIFO = first in first out ...
                              Cái hình bạn đưa lên là 1 FIFO ..
                              read_FIFO nên gọi là read_control
                              write_FIFO nên gọi là write_control
                              câu quan trọng nhất bác vẫn chưa trả lời, làm sao để cùng 1 dữ liệu vào từ port A ra đc port B

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X