Thông báo

Collapse
No announcement yet.

CHo em hỏi xíu về VHDL

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

  • CHo em hỏi xíu về VHDL

    Chào các bác, cho em hỏi tí về 2 vấn đề trong VHDL compiler của MAX+PLUS II (hơi cơ bản,các bác thông cảm):
    + thứ nhất là không hiểu sao mà vòng while và câu wait em ko bao giờ thực hiện được. Ct của em như sau:

    library ieee;
    use ieee.std_logic_1164.all;

    entity test is
    port(clk: in std_logic;
    y: out std_logic);
    end test;

    architecture bhv of test is
    begin
    process(clk)
    begin
    while clk='0' loop
    NULL;
    end loop;
    end process;
    end bhv;
    Nó cứ báo lỗi là: Unsupport feature error.

    +thứ hai là cái hàm conv_std_logic_vector(),đoạn code như sau:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;

    entity led_8_notok is
    port(
    clk: in bit;
    led: out std_logic_vector(0 to 7));
    end led_8_notok;

    architecture bhv of led_8_notok is
    begin
    process(clk)
    variable vector: integer:=1;
    begin
    if (clk'event and clk='1') then
    vector:=vector*2;
    led<= conv_std_logic_vector(vector,8);
    else NULL;
    end if;
    end process;
    end bhv;
    nó không chịu convert mà cứ báo warning, không import node vào file Waveform được (em nghĩ là do không convert được nên mọi flipflop của led đều bị “stuck at GND”)
    Nếu ở chỗ hàm đó thay bằng câu : led<=conv_std_logic_verctor(7,8) thì nó vẫn convert đúng.
    Mong các cao thủ giải đáp giúp em, em cám ơn nhiều.
    Chuyện nhỏ như con thỏ,bắt thỏ mới là chuyện lớn!!!

  • #2
    hic,ko ai trả lời em à.Bùn quá.
    Chuyện nhỏ như con thỏ,bắt thỏ mới là chuyện lớn!!!

    Comment


    • #3
      Hi,
      Ban phai hiểu sơ sơ thang simulator lam việc thế nào mới làm đúng được. Simulator ko phai chạy kiểu như ban viết code C. Simulator dùng event để chạy. Ví dụ:
      wait for 5 ns;
      clk<= '1';
      Thì simulator sẽ lên lịch (schedule, ko biết các bạn gọi là gi) và sẽ cho tín hiệu clock bằng 1 tại 5 ns.


      entity test is
      port(clk: in std_logic;
      y: out std_logic);
      end test;

      architecture bhv of test is
      begin
      process(clk)
      begin
      while clk='0' loop
      NULL;
      end loop;
      end process;
      end bhv;

      khi ban viet như vầy mình không hiểu bạn muốn làm gì và có thể simulator cũng không biêt ban muốn làm gì. (Tốt nhất la đừng có chọc nó). Khi vòng while của bạn như vậy thì co' thể CPU se chay lên tới 100% (bạn thử thay cai NULL bang y <= 1).

      Comment


      • #4
        if (clk'event and clk='1') then
        vector:=vector*2;
        led<= conv_std_logic_vector(vector,8);
        else NULL;
        end if;
        end process;
        end bhv;


        Còn đoạn này, ban bỏ cai else đi.

        Comment


        • #5
          Được hay không thì cho mình biết.

          Comment


          • #6
            cám ơn anh nhiều, lúc đầu mới học VHDL, em chủ quan nghĩ là học nó cũng như VDK hay là lập trình thông thường (dân CNTT mà), và tất nhiên em đã thất bại.Sau khi tham khảo thì em được biết là VHDL dùng để mô phỏng hoặc để mô tả các hệ thống số thì mới có đủ chức năng,câu lệnh như lý thuyết.Còn VHDL dùng cho tổng hợp mạch, tạo ra phần cứng thật(như trong MAX+PLUSS) thì vài câu lệnh bị hạn chế.Như kiểu "wait for 5ns" thì làm sao mà tổng hợp được mạch cho nó.Còn anh nói em bỏ cái else thì vẫn không có tác dụng,em chỉ thêm câu đó vào vì em nghĩ sẽ tốt hơn nếu mình code hết mọi trường hợp(như trong câu case).Em suy nghĩ vậy không biết có đúng ko,mong anh giải đáp giùm.Hic,môn này ít được support quá,ko như khi học MCU.
            Chuyện nhỏ như con thỏ,bắt thỏ mới là chuyện lớn!!!

            Comment


            • #7
              process(clk)
              variable vector: integer:=1;
              begin
              if (clk'event and clk='1') then
              vector:=vector*2;
              led<= conv_std_logic_vector(vector,8);
              else NULL;
              end if;
              end process;
              end bhv;

              Hôm bữa mình coi không kĩ.
              Ve variable:
              Variable được dùng để mô phỏng một sợi dây trong phần cứng, bạn sẽ gặp vấn đề khi bạn gán nó như vây vector:=vector*2. Cái này khó giải thích. Bạn nên vẽ ra phần cứng bạn muốn mô tả trước xong rồi hãy code.

              có 2 cach sửa, 1 la đem thang vector ra ngoài, cho nó kiểu signal: std_logic_vector.
              2 la ban them 1 variable nữa.
              vector2:=vector*2;
              led <= conv_.... (vector2,8);

              ---- Đúng ra ban phải code như sau:


              signal vector: integer;
              led<= conv_std_logic_vector(vector,8);
              process(clk)
              begin
              if (clk'event and clk='1') then
              vector<=vector*2;
              end if;
              end process;
              end bhv;

              Về else NULL:
              Thì vì đây là ngôn ngữ mô tả phần cứng, nên bạn khong cần else trong cai chỗ if(clk'event ...). Dùng else ko có ý nghĩa gì hết.

              Hope this help. Bạn nên vẽ schematic trước rồy hãy code.

              Comment


              • #8
                Cám ơn anh nhiều,nhân tiện nói về cái variable,em đã phân biệt được signal và variable,nhưng còn khi nào thì cái variable nó sinh ra mat6tha6t5(ff hay là dây),khi nào nó chỉ là trung gian thì mù tịt.Anh giải thích tiếp giùm em luôn nha
                Chuyện nhỏ như con thỏ,bắt thỏ mới là chuyện lớn!!!

                Comment


                • #9
                  Hi, mấy bữa nay ko vô forum.
                  Mấy cái này hơi nhức đầu.. Mình cũng hông rõ. Cách chính thống: bạn vẽ sơ đồ mạch ra trước rồi hãy code.
                  Người ta thường code sao cho cai variable sẽ sinh ra dây, ít khi nào code để sinh ra FF.
                  Bạn compile cai code nay, trong Xilinx thi vo synthesis options, tắt "use_synchronous_set", "use_synchronous_set".

                  entity var_sig is
                  Port ( clk : in STD_LOGIC;
                  A : in STD_LOGIC;
                  B : in STD_LOGIC;
                  C : in STD_LOGIC;
                  D : out STD_LOGIC;
                  E : out STD_LOGIC);
                  end var_sig;

                  architecture Behavioral of var_sig is

                  begin
                  process(clk)
                  variable var_D: std_logic;
                  begin
                  if(rising_edge(clk)) then
                  var_D := A and B; (1)
                  D <= var_D xor C; (2)
                  end if;
                  E<= var_D; (3)
                  end process;

                  end Behavioral;

                  Nếu không co' "E<= var_D", (1) và (2) thực hiện cùng lúc nhưng do trong process QUY ƯỚC là thực hiện theo thứ tự từ trên xuống và do var_D la variable nên 1 se thực hiện "trước", nên trở thành trung gian (sẽ chỉ có 1 FF cho D, D<= A and B xor C). (ban thử dùng signal cho đó xem).

                  Nếu co' "E<= var_D", thì bạn thấy var_D được tổng hợp thành FF, vì cai phép gán var_D:=A and B được thưc hiện ở clock_edge.

                  Khi viết code, ban thấy phúc tạp, nhưng nếu bạn biết mình muốn làm gì, rồi vẽ sơ đồ ra thì mọi việc dễ dàng hơn nhiều. Cố gắng hình dung ra mạch rồi hãy code sẽ ít khi sai.

                  Thực ra cái code mình viết la để ví dụ. Nó hơi kì cục. Nếu như đi từ sơ đồ, ban sẽ có:

                  Khi clock đi lên:
                  Gán D = A and B xor C;
                  Gán E = A and B;

                  Sẽ viết như vầy. Ở đây, var_D được dùng như biến trung gian.
                  process(clk)
                  variable var_D: std_logic;
                  begin
                  var_D:= A and B;
                  if(rising_edge(clk)) then
                  D <= var_D xor C;
                  E <= var_D;
                  end if;
                  end process;
                  Last edited by jefflieu; 16-10-2008, 15:52.

                  Comment


                  • #10
                    Em it4rb, sao em viết test để kiểm tra mà trong entity em lại khai báo cổng kàm gì, em phải end luôn chứ, em xem lại kiến thức đi, chị nghĩ nó báo lỗi là ỏchosxo đó đấy

                    Comment

                    Về tác giả

                    Collapse

                    it4rb &quot;second hand&quot; student Tìm hiểu thêm về it4rb

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

                    Collapse

                    Đang tải...
                    X