Announcement

Collapse
No announcement yet.

[Thử tài thiết kế số] Thiết kế Counter

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Thử tài thiết kế số] Thiết kế Counter

    Chào các bạn,

    Sáng nay vừa đi test bài viết ở Renesas về thì có gặp 2 câu verilog, các bạn thử làm 1 câu này xem sao.

    Đề: Thiết kế Counter có đầu ra clock_1hz, và 2 đầu vào là clock_27Mhz và reset. clock_1hz có duty cycle đúng bằng 1 chu kỳ của clock_27Mhz. Khi reset tích cực mức cao thì clock_1hz (reset bất đồng bộ) được đưa trở lại mức LOW.
    counter_1hz.png

    Chúc các bạn học tốt!
    Last edited by 11520537; 14-04-2015, 04:20.
    Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

  • #2
    đọc đề và e hiểu output nó ra xung như thế này: Untitled.png
    Trong đó: T=1s, Ton=1/27MHz, Toff =1-1/27MHz.
    vậy là: 1 chu kỳ đầu tiên của Clock 27Mhz : out=1. và 26999999 chu kỳ tiếp theo của clock 27HMz thì out=0.
    reset bất đồng bộ khi có cạnh lên của clock 27MHz (còn mức cao gì đó thì em không hình dung được nó bất đồng bộ như thế nào )
    khi đó:
    code verilog:

    module counter(in,out,reset);
    ---input in,reset;
    ---output out;
    ---reg out;
    ---reg [24:0]count=27000000;
    ---always @(posedge in or posedge reset)
    ---begin
    -------if(reset==1'b1)
    ------------out==0;
    -------else
    -------begin
    ----------------if(count==27000000)
    ----------------begin
    ---------------------out=1;
    ---------------------count=count-1;
    ----------------end
    ----------------else if(count>1)
    ----------------begin
    ----------------------out=0;
    ----------------------count=count-1;
    ----------------end
    ----------------else count=27000000;
    ---------end
    ---end
    endmodule
    Last edited by 12520797; 13-04-2015, 01:46.

    Comment


    • #3
      h: :v đính chính em không phải là cú đêm ^_^!!! tại tối qua trước khi đi ngủ, có lướt qua topic. xong định sáng làm mà nằm ngẫm nghĩ cái cycle duty, kiểu như băm xung.
      nghĩ ra cách làm, nên lên chém luôn, nhỡ sáng bận :dreaming: eo ôi nhìn lại là mình viết vớ vẫn phần giải thích cái reset bất đồng bộ (ý em là reset khi có cạnh lên của reset mà viết nhầm thành của clock :3 )và cái dụ non-blocking (chắc thức khuya quá, lú lẫn :v).
      còn code như vậy là em thấy được rồi mà =D if lồng 1 if thì không quá phức tạp!!!!
      module counter(in,out,reset);
      ---input in,reset;
      ---output out;
      ---reg out;
      ---reg [24:0]count=27000000;
      ---always @(posedge in or posedge reset)
      ---begin
      -------if(reset==1'b1)
      -------begin
      ------------out<==0;
      ------------count<=27000000;
      -------end
      -------else
      -------begin
      ----------------if(count==1)
      ----------------begin
      ---------------------out<=1;
      ---------------------count<=27000000;
      ----------------end
      ----------------else
      ----------------begin
      ----------------------out<=0;
      ----------------------count<=count-1;
      ----------------end
      ---------end
      ---end
      endmodule
      Last edited by 12520797; 13-04-2015, 17:33.

      Comment


      • #4
        Originally posted by 12520797 View Post
        h: :v đính chính em không phải là cú đêm ^_^!!! tại tối qua trước khi đi ngủ, có lướt qua topic. xong định sáng làm mà nằm ngẫm nghĩ cái cycle duty, kiểu như băm xung.
        nghĩ ra cách làm, nên lên chém luôn, nhỡ sáng bận :dreaming: eo ôi nhìn lại là mình viết vớ vẫn phần giải thích cái reset bất đồng bộ (ý em là reset khi có cạnh lên của reset mà viết nhầm thành của clock :3 )và cái dụ non-blocking (chắc thức khuya quá, lú lẫn :v).
        còn code như vậy là em thấy được rồi mà =D if lồng 1 if thì không quá phức tạp!!!!
        module counter(in,out,reset);
        ---input in,reset;
        ---output out;
        ---reg out;
        ---reg [24:0]count=27000000;
        ---always @(posedge in or posedge reset)
        ---begin
        -------if(reset==1'b1)
        -------begin
        ------------out<==0;
        ------------count<=27000000;
        -------end
        -------else
        -------begin
        ----------------if(count==1)
        ----------------begin
        ---------------------out<=1;
        ---------------------count<=27000000;
        ----------------end
        ----------------else
        ----------------begin
        ----------------------out<=0;
        ----------------------count<=count-1;
        ----------------end
        ---------end
        ---end
        endmodule
        Chào Đạo,

        Bây giờ đến lượt phân tích bài toán, cách phân tích của bạn mình nghĩ là đúng, và cách thực hiện cũng đúng luôn :happy:. Nhưng bạn sửa lại chỗ này thì mới chạy được này:
        Capture.PNG
        Bạn biết phải sửa cái gì rồi chứ?

        Chúc bạn học tốt, à mà nhớ tham gia UIT-AMO 2015 nha.
        Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

        Comment


        • #5
          Originally posted by 11520537 View Post
          Chào Đạo,

          Bây giờ đến lượt phân tích bài toán, cách phân tích của bạn mình nghĩ là đúng, và cách thực hiện cũng đúng luôn :happy:. Nhưng bạn sửa lại chỗ này thì mới chạy được này:
          Bạn biết phải sửa cái gì rồi chứ?

          Chúc bạn học tốt, à mà nhớ tham gia UIT-AMO 2015 nha.
          ^_^ dạ!! rồi!!! lỗi khó thể tha thứ =D , cảm ơn anh!!! còn UIT-AMO 2015 thì ... )

          Comment


          • #6
            Originally posted by 11520537
            Chào [MENTION=20012]12520797[/MENTION],
            - reset bất đồng bộ là reset tích cực khi tín hiệu reset chuyển trạng thái từ 0 sang 1 (đối với tích cực mức HIGH) hoặc từ 1 sang 0 (đối với tích cực mức LOW).
            Có thể nói vấn đề reset đồng bộ hay bất đồng bộ là một vấn đề muôn thủa của sinh viên (mình đã đọc khá nhiều sách viết về tình trạng này, cộng với kinh nghiệm 2 năm học thiết kế số ở trường): (1) không hiểu bản chất, (2) không hiểu cách thực hiện, (3) không hiểu cả hai.
            Nhưng thật lạ! Bạn hiểu sai nhưng thực hiện reset lại đúng (theo logic học thì 0 -> 1 có kết quả là 1 :kiss. Không biết lỗi này thuộc về ai???

            Chúc bạn học tốt!
            Thầy nhớ có dạy Reset đồng bộ, bất đồng bộ mà. Có minh họa bằng Waveform nữa.
            Rồi cách viết Verilog cho 2 loại trên như thế nào.
            Vậy cũng chưa đủ đô hả ta !!!

            Comment


            • #7
              Originally posted by 12520797 View Post
              :
              module counter(in,out,reset);
              ---input in,reset;
              ---output out;
              ---reg out;
              ---reg [24:0]count=27000000;
              ---always @(posedge in or posedge reset)
              ---begin
              -------if(reset==1'b1)
              -------begin
              ------------out<= 1'b0;
              ------------count<= 25'd27_000_000;
              -------end
              -------else
              -------begin
              ----------------if(count==1)
              ----------------begin
              ---------------------out<=1'b1;
              ---------------------count<=25'd27_000_000;
              ----------------end
              ----------------else
              ----------------begin
              ----------------------out<=1'b0;
              ----------------------count<=count-1;
              ----------------end
              ---------end
              ---end
              endmodule
              Em viết vậy cũng được, nhưng nên viết theo tăng biến đếm --> chuyển về mạch cộng sẽ tiết kiệm resource và power.
              Attached Files
              Last edited by sangnt; 16-04-2015, 10:33.

              Comment


              • #8
                Lại nói đến việc nên viết theo tăng biến đếm hay giảm biến đếm. Như thầy Sang đã đề cập là chuyển về mạch cộng sẽ tiết kiệm về tài nguyên và công suất. Nhưng nếu viết theo giảm biến đếm và giá trị nhỏ nhất bằng 0 thì mọi chuyện có thể chuyển theo một hướng khác khi ta sử dụng biến đếm so sánh với 0, khi đó phần cứng sẽ hiệu quả hơn do mạch đánh giá 1 số n-bit có bằng 0 hay không thì đơn giản hơn rất nhiều so với các mạch so sánh thông thường.
                Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

                Comment


                • #9
                  Originally posted by sangnt View Post
                  Em viết vậy cũng được, nhưng nên viết theo tăng biến đếm --> chuyển về mạch cộng sẽ tiết kiệm resource và power.
                  laster: đủ đô rồi thầy tại hôm đó em bị lú nên viết lung tung :happy:

                  Originally posted by 11520537 View Post
                  Lại nói đến việc nên viết theo tăng biến đếm hay giảm biến đếm. Như thầy Sang đã đề cập là chuyển về mạch cộng sẽ tiết kiệm về tài nguyên và công suất. Nhưng nếu viết theo giảm biến đếm và giá trị nhỏ nhất bằng 0 thì mọi chuyện có thể chuyển theo một hướng khác khi ta sử dụng biến đếm so sánh với 0, khi đó phần cứng sẽ hiệu quả hơn do mạch đánh giá 1 số n-bit có bằng 0 hay không thì đơn giản hơn rất nhiều so với các mạch so sánh thông thường.
                  e cũng đồng ý với a Dương
                  Nhưng nhiều điều nhỏ kéo theo trong thiết kế sẽ xuất hiện: a Dương: so sánh với 0 sẽ tốt hơn rất nhiều so với việc so sánh 1 số khác không,..... và theo thuật tóan đưa ra thì vòng lặp sẽ sảy ra "n lần", và theo e thấy thì, việc set cho biến đếm 1 giá trị khác 0 (n lần) cũng sẽ gây ra việc tiêu tốn tài nguyên nhiều hơn so với việc reset biến đếm đó về 0 (n lần)...... vậy trong thiết kế, việc tối ưu (so sánh tài nguyên) sẽ dừng ở mức nào....... và thấy rằng việc thiết kế thì nhanh hơn việc tốt ưu thiết kế rất nhiều lần
                  Câu hỏi của e đặt ra là khi thiết kế xxx: việc so sánh tài nguyên để tối ưu thiết kế là rất nhọc nhằn........... vậy khi đi làm, thằng thiết kế phải tự tối ưu, hay phải có thêm thằng (level cao hơn) đảm nhiệm cho việc kiểm tra và tối ưu thiết kế của thằng thiết kế :look_down: xin hết

                  Comment


                  • #10
                    Originally posted by 12520797 View Post
                    laster: đủ đô rồi thầy tại hôm đó em bị lú nên viết lung tung :happy:


                    e cũng đồng ý với a Dương
                    Nhưng nhiều điều nhỏ kéo theo trong thiết kế sẽ xuất hiện: a Dương: so sánh với 0 sẽ tốt hơn rất nhiều so với việc so sánh 1 số khác không,..... và theo thuật tóan đưa ra thì vòng lặp sẽ sảy ra "n lần", và theo e thấy thì, việc set cho biến đếm 1 giá trị khác 0 (n lần) cũng sẽ gây ra việc tiêu tốn tài nguyên nhiều hơn so với việc reset biến đếm đó về 0 (n lần)...... vậy trong thiết kế, việc tối ưu (so sánh tài nguyên) sẽ dừng ở mức nào....... và thấy rằng việc thiết kế thì nhanh hơn việc tốt ưu thiết kế rất nhiều lần
                    Câu hỏi của e đặt ra là khi thiết kế xxx: việc so sánh tài nguyên để tối ưu thiết kế là rất nhọc nhằn........... vậy khi đi làm, thằng thiết kế phải tự tối ưu, hay phải có thêm thằng (level cao hơn) đảm nhiệm cho việc kiểm tra và tối ưu thiết kế của thằng thiết kế :look_down: xin hết
                    Chào bạn,

                    Cái này thì mình cũng không chắc lắm, nhưng theo mình biết trong thiết kế số thì 2 "ông tổ" là: (1) diện tích, và (2) tốc độ. Vấn đề bạn đặt ra là tài nguyên, cái này khá là tương đồng với diện tích (vấn đề diện tích còn phụ thuộc vào R&P (Route and Place) nữa). Đây việc của người viết spec, và người viết spec mới là là người thiết kế đúng nghĩa chứ không phải người gõ RTL code, những người viết spec sẽ dựa vào kiến thức và kinh nghiệm để đưa ra các cách thực hiện bài toán sao cho phù hợp. Mình xin lấy 1 ví dụ do chính mình trải qua, đó là chọn kích thước thanh ghi 32 bit hay là 6 bit (vì chỉ cần thanh ghi 6 bit là đã giải quyết được vấn đề trong khi kiến trúc thực hiện là 32 bit):
                    - nếu chọn 32 bit thì việc thuận tiện cho người gõ RTL code, và dễ cho verification sau này.
                    - nếu chọn 6 bit thì sẽ tiết kiệm được tài nguyên nhưng khó cho RTL code, và dễ cho verification sau này (ví dụ như gán/đọc giá trị 32 bit tới/từ thanh ghi thì phải viết code phức tạp hơn một tẹo, thực ra với trường hợp của mình thì cũng dễ thôi. Nhưng trong những bài toán lớn thì là cả 1 vấn đề).
                    Vậy người thiết kế quyết định cái này, và trong trường hợp của mình, mình chọn kích thước 32 bit.
                    Nhưng thật không ngờ, mình không nhớ cái tool mà mình đã sử dụng nữa, sau khi nó nó chạy một lúc, nó lại đưa cái thanh ghi đó về 6 bit với lý do 26 bit còn lại không thỏa mãn cái gì đó rồi mình lại sửa lại code để chọn lại kích thước 6 bit!
                    Như vậy, các EDA cũng đóng góp trong việc tối ưu thiết kế.

                    P/S: Quartus nó cũng có chức năng khá hay, sao chép project để chỉnh sửa sau đó so sánh tài nguyên, tốc độ, ... (bạn có thể đọc tài liệu hướng dẫn của nó để biết thêm).
                    Last edited by 11520537; 20-04-2015, 01:34.
                    Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

                    Comment


                    • #11
                      Originally posted by 11520537 View Post
                      Chào bạn,

                      Cái này thì mình cũng không chắc lắm, nhưng theo mình biết trong thiết kế số thì 2 "ông tổ" là: (1) diện tích, và (2) tốc độ. Vấn đề bạn đặt ra là tài nguyên, cái này khá là tương đồng với diện tích (vấn đề diện tích còn phụ thuộc vào R&P (Route and Place) nữa). Đây việc của người viết spec, và người viết spec mới là là người thiết kế đúng nghĩa chứ không phải người gõ RTL code, những người viết spec sẽ dựa vào kiến thức và kinh nghiệm để đưa ra các cách thực hiện bài toán sao cho phù hợp.

                      P/S: Quartus nó cũng có chức năng khá hay, sao chép project để chỉnh sửa sau đó so sánh tài nguyên, tốc độ, ... (bạn có thể đọc tài liệu hướng dẫn của nó để biết thêm).
                      vâng!!! em cũng biết là 1 thiết kế tốt thì vấn đề được nhìn nhận vào: diện tích (nhỏ gọn ntn?), tốc độ xử lí (nhanh ntn?)... có thể với trước kia là như thế. nhưng với thực tế ngày này thì em thấy, yếu tố về tiêu tốn năng lượng cũng đang và đáng được quan tâm: với mọi thứ đều là smart, di động hóa (với nguồn năng lượng hạn chế là pin).

                      theo em thấy thì: xu hướng tiết kiệm năng lượng hóa cho thiết kế rất được quan tâm...Xin Hết!!! =D

                      p/s: chỉ là em nói lên theo 1 suy nghĩ cá nhân về sư nhìn nhận vấn đề thôi, chứ thực sự thì khả năng của bản thân chưa đến đâu nên không muốn bới móc quá sâu cho việc tối ưu :happy:

                      Comment


                      • #12
                        Originally posted by 11520537 View Post
                        Chào bạn,

                        Cái này thì mình cũng không chắc lắm, nhưng theo mình biết trong thiết kế số thì 2 "ông tổ" là: (1) diện tích, và (2) tốc độ. Vấn đề bạn đặt ra là tài nguyên, cái này khá là tương đồng với diện tích (vấn đề diện tích còn phụ thuộc vào R&P (Route and Place) nữa). Đây việc của người viết spec, và người viết spec mới là là người thiết kế đúng nghĩa chứ không phải người gõ RTL code, những người viết spec sẽ dựa vào kiến thức và kinh nghiệm để đưa ra các cách thực hiện bài toán sao cho phù hợp. Mình xin lấy 1 ví dụ do chính mình trải qua, đó là chọn kích thước thanh ghi 32 bit hay là 6 bit (vì chỉ cần thanh ghi 6 bit là đã giải quyết được vấn đề trong khi kiến trúc thực hiện là 32 bit):
                        - nếu chọn 32 bit thì việc thuận tiện cho người gõ RTL code, và dễ cho verification sau này.
                        - nếu chọn 6 bit thì sẽ tiết kiệm được tài nguyên nhưng khó cho RTL code, và dễ cho verification sau này (ví dụ như gán/đọc giá trị 32 bit tới/từ thanh ghi thì phải viết code phức tạp hơn một tẹo, thực ra với trường hợp của mình thì cũng dễ thôi. Nhưng trong những bài toán lớn thì là cả 1 vấn đề).
                        Vậy người thiết kế quyết định cái này, và trong trường hợp của mình, mình chọn kích thước 32 bit.
                        Nhưng thật không ngờ, mình không nhớ cái tool mà mình đã sử dụng nữa, sau khi nó nó chạy một lúc, nó lại đưa cái thanh ghi đó về 6 bit với lý do 26 bit còn lại không thỏa mãn cái gì đó rồi mình lại sửa lại code để chọn lại kích thước 6 bit!
                        Như vậy, các EDA cũng đóng góp trong việc tối ưu thiết kế.

                        P/S: Quartus nó cũng có chức năng khá hay, sao chép project để chỉnh sửa sau đó so sánh tài nguyên, tốc độ, ... (bạn có thể đọc tài liệu hướng dẫn của nó để biết thêm).
                        mấy bài toán nhỏ thì lo mà tối ưu, mấy cái lớn lớn thì để EDA tool nó tự xử đi, function cho đúng là đủ chết roài!
                        Ko thể chống lại lũ ngu vì chúng quá đông!

                        Comment


                        • #13
                          Chào anh Cường , [MENTION=9467]07520042[/MENTION]

                          Không biết anh đang đang làm ở công ty nào, anh có thể chia sẻ một số kinh nghiệm làm việc và cơ hội việc làm trong lĩnh vực thiết kế vi mạch được không?

                          Trân trọng,
                          Trần Đại Dương.
                          Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

                          Comment


                          • #14
                            Thắc mắc.

                            Originally posted by 12520797 View Post
                            đọc đề và e hiểu output nó ra xung như thế này: [ATTACH=CONFIG]16426[/ATTACH]
                            Trong đó: T=1s, Ton=1/27MHz, Toff =1-1/27MHz.
                            vậy là: 1 chu kỳ đầu tiên của Clock 27Mhz : out=1. và 26999999 chu kỳ tiếp theo của clock 27HMz thì out=0.
                            reset bất đồng bộ khi có cạnh lên của clock 27MHz (còn mức cao gì đó thì em không hình dung được nó bất đồng bộ như thế nào )
                            khi đó:
                            code verilog:

                            module counter(in,out,reset);
                            ---input in,reset;
                            ---output out;
                            ---reg out;
                            ---reg [24:0]count=27000000;
                            ---always @(posedge in or posedge reset)
                            ---begin
                            -------if(reset==1'b1)
                            ------------out==0;
                            -------else
                            -------begin
                            ----------------if(count==27000000)
                            ----------------begin
                            ---------------------out=1;
                            ---------------------count=count-1;
                            ----------------end
                            ----------------else if(count>1)
                            ----------------begin
                            ----------------------out=0;
                            ----------------------count=count-1;
                            ----------------end
                            ----------------else count=27000000;
                            ---------end
                            ---end
                            endmodule
                            Cho em hỏi chỗ này làm sao ra con số 25bit ạ.!!
                            reg [24:0]count=27000000;

                            Comment


                            • #15
                              Originally posted by 14520356 View Post
                              Cho em hỏi chỗ này làm sao ra con số 25bit ạ.!!
                              reg [24:0]count=27000000;
                              Về mặc định thì "27000000" được hiểu là cơ số 10, 27_000_000 = 0x19B_FCC0.
                              Thế thì đã biết tại sao là 25 bits chưa?

                              P/S: lần sau nhớ tag bọn anh vào để hệ thống thông báo tới acc của bọn anh thì bọn anh mới trả lời nhanh được.
                              Tôi không hối tiếc những gì mình đã làm. Tôi chỉ hối tiếc những gì đã không làm khi có cơ hội!

                              Comment

                              LHQC

                              Collapse
                              Working...
                              X