<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									Thiết kế số verilog vhdl - Cộng đồng Vi Mạch Bán Dẫn - Điện Tử Việt Nam				            </title>
            <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/</link>
            <description>Cộng đồng Vi Mạch Bán Dẫn - Điện Tử Việt Nam</description>
            <language>vi</language>
            <lastBuildDate>Fri, 05 Jun 2026 03:28:44 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>Làm sao để mô tả FSM dạng Moore bằng VHDL</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/lam-sao-de-mo-ta-fsm-dang-moore-bang-vhdl/</link>
                        <pubDate>Wed, 24 Dec 2025 09:44:43 +0000</pubDate>
                        <description><![CDATA[Trong thiết kế số với VHDL, FSM Moore là dạng được khuyến nghị nhất cho FPGA vì:


Output ổn định, chỉ phụ thuộc trạng thái


Dễ mô phỏng, dễ debug


Dễ đạt timing khi synthesize
...]]></description>
                        <content:encoded><![CDATA[<p data-start="72" data-end="164">Trong thiết kế số với <strong data-start="94" data-end="102">VHDL</strong>, <strong data-start="104" data-end="117">FSM Moore</strong> là dạng <strong data-start="126" data-end="151">được khuyến nghị nhất</strong> cho FPGA vì:</p>
<ul data-start="165" data-end="266">
<li data-start="165" data-end="211">
<p data-start="167" data-end="211">Output <strong data-start="174" data-end="185">ổn định</strong>, chỉ phụ thuộc trạng thái</p>
</li>
<li data-start="212" data-end="235">
<p data-start="214" data-end="235">Dễ mô phỏng, dễ debug</p>
</li>
<li data-start="236" data-end="266">
<p data-start="238" data-end="266">Dễ đạt timing khi synthesize</p>
</li>
</ul>
<p data-start="268" data-end="390">Bài viết này hướng dẫn bạn <strong data-start="295" data-end="330">cách mô tả FSM Moore đúng chuẩn</strong>, kèm <strong data-start="336" data-end="361">ví dụ VHDL hoàn chỉnh</strong> và các <strong data-start="369" data-end="389">lưu ý quan trọng</strong>.</p>
<hr data-start="392" data-end="395" />
<h2 data-start="397" data-end="429">1. Ôn nhanh: FSM Moore là gì?</h2>
<p data-start="431" data-end="466"><strong data-start="431" data-end="444">FSM Moore</strong> là máy trạng thái mà:</p>
<ul data-start="467" data-end="532">
<li data-start="467" data-end="490">
<p data-start="469" data-end="490"><strong data-start="469" data-end="490">Output = f(State)</strong></p>
</li>
<li data-start="491" data-end="532">
<p data-start="493" data-end="532"><strong data-start="493" data-end="532">Không phụ thuộc trực tiếp vào input</strong></p>
</li>
</ul>
<p data-start="534" data-end="600">&#x1f449; Output <strong data-start="544" data-end="579">chỉ thay đổi khi state thay đổi</strong> (tức là theo clock).</p>
<h3 data-start="602" data-end="624">Minh họa FSM Moore</h3>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://media.geeksforgeeks.org/wp-content/uploads/1-43.jpg" alt="https://media.geeksforgeeks.org/wp-content/uploads/1-43.jpg" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://fastbitlab.com/wp-content/uploads/2022/01/Figure-1.png" alt="https://fastbitlab.com/wp-content/uploads/2022/01/Figure-1.png" /></div>
</div>
</div>
<hr data-start="667" data-end="670" />
<h2 data-start="672" data-end="717">2. Cấu trúc chuẩn của FSM Moore trong VHDL</h2>
<p data-start="719" data-end="774">FSM Moore <strong data-start="729" data-end="743">chuẩn FPGA</strong> luôn gồm <strong data-start="753" data-end="773">3 khối tách biệt</strong>:</p>
<ol data-start="776" data-end="901">
<li data-start="776" data-end="812">
<p data-start="779" data-end="812"><strong data-start="779" data-end="797">State register</strong> (mạch tuần tự)</p>
</li>
<li data-start="813" data-end="850">
<p data-start="816" data-end="850"><strong data-start="816" data-end="836">Next-state logic</strong> (mạch tổ hợp)</p>
</li>
<li data-start="851" data-end="901">
<p data-start="854" data-end="901"><strong data-start="854" data-end="870">Output logic</strong> (mạch tổ hợp, phụ thuộc state)</p>
</li>
</ol>
<p data-start="903" data-end="950">&#x1f449; Đây là <strong data-start="913" data-end="930">best practice</strong>, rất nên tuân theo.</p>
<hr data-start="952" data-end="955" />
<h2 data-start="957" data-end="1001">3. Ví dụ FSM Moore đơn giản (bật/tắt LED)</h2>
<h3 data-start="1003" data-end="1014">Yêu cầu</h3>
<ul data-start="1015" data-end="1107">
<li data-start="1015" data-end="1074">
<p data-start="1017" data-end="1032">Nhấn nút <code data-start="1026" data-end="1031">btn</code>:</p>
<ul data-start="1035" data-end="1074">
<li data-start="1035" data-end="1053">
<p data-start="1037" data-end="1053">Từ <code data-start="1040" data-end="1046">IDLE</code> → <code data-start="1049" data-end="1053">ON</code></p>
</li>
<li data-start="1056" data-end="1074">
<p data-start="1058" data-end="1074">Từ <code data-start="1061" data-end="1065">ON</code> → <code data-start="1068" data-end="1074">IDLE</code></p>
</li>
</ul>
</li>
<li data-start="1075" data-end="1107">
<p data-start="1077" data-end="1107">LED sáng khi ở trạng thái <code data-start="1103" data-end="1107">ON</code></p>
</li>
</ul>
<hr data-start="1109" data-end="1112" />
<h2 data-start="1114" data-end="1164">4. Khai báo trạng thái (ENUM – rất khuyến nghị)</h2>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      state &lt;= IDLE;        -- reset về trạng thái ban đầu
    else
      state &lt;= next_state; -- cập nhật trạng thái
    end if;
  end if;
end process;
</pre>
</div>
</div>
<p data-start="1243" data-end="1308">&#x2705; Code rõ ràng<br data-start="1257" data-end="1260" />&#x2705; Tool tự tối ưu encoding<br data-start="1285" data-end="1288" />&#x2705; Tránh lỗi nhầm bit</p>
<hr data-start="1310" data-end="1313" />
<h2 data-start="1315" data-end="1358">5. Khối 1 – State Register (FSM + reset)</h2>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-vhdl"><code class="whitespace-pre! language-vhdl"><span></span></code></code>
<pre contenteditable="false">process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      state &lt;= IDLE;        -- reset về trạng thái ban đầu
    else
      state &lt;= next_state; -- cập nhật trạng thái
    end if;
  end if;
end process;
</pre>
</div>
</div>
<p data-start="1594" data-end="1603">&#x1f4cc; Lưu ý:</p>
<ul data-start="1604" data-end="1686">
<li data-start="1604" data-end="1637">
<p data-start="1606" data-end="1637">Reset <strong data-start="1612" data-end="1623">đồng bộ</strong> (khuyến nghị)</p>
</li>
<li data-start="1638" data-end="1686">
<p data-start="1640" data-end="1686">Chỉ cập nhật <strong data-start="1653" data-end="1662">state</strong>, không xử lý logic khác</p>
</li>
</ul>
<hr data-start="1688" data-end="1691" />
<h2 data-start="1693" data-end="1733">6. Khối 2 – Next State Logic (tổ hợp)</h2>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">
<pre contenteditable="false">process(state, btn)
begin
  -- mặc định giữ nguyên trạng thái
  next_state &lt;= state;

  case state is
    when IDLE =&gt;
      if btn = '1' then
        next_state &lt;= ON;
      end if;

    when ON =&gt;
      if btn = '1' then
        next_state &lt;= IDLE;
      end if;

  end case;
end process;
</pre>
</div>
</div>
</div>
</div>
<p data-start="2039" data-end="2057">&#x1f4cc; Rất quan trọng:</p>
<ul data-start="2058" data-end="2116">
<li data-start="2058" data-end="2089">
<p data-start="2060" data-end="2089"><strong data-start="2060" data-end="2089">Luôn gán giá trị mặc định</strong></p>
</li>
<li data-start="2090" data-end="2116">
<p data-start="2092" data-end="2116">Tránh latch ngoài ý muốn</p>
</li>
</ul>
<hr data-start="2118" data-end="2121" />
<h2 data-start="2123" data-end="2162">7. Khối 3 – Output Logic (Moore FSM)</h2>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">process(state)
begin
  case state is
    when IDLE =&gt;
      led &lt;= '0';

    when ON =&gt;
      led &lt;= '1';
  end case;
end process;
</pre>
</div>
</div>
<p data-start="2308" data-end="2368">&#x1f449; Output <strong data-start="2318" data-end="2341">chỉ phụ thuộc state</strong> → đúng bản chất Moore FSM.</p>
<hr data-start="2370" data-end="2373" />
<h2 data-start="2375" data-end="2421">8. Ghép lại: FSM Moore hoàn chỉnh bằng VHDL</h2>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">library ieee;
use ieee.std_logic_1164.all;

entity fsm_moore is
  port (
    clk : in  std_logic;
    rst : in  std_logic;
    btn : in  std_logic;
    led : out std_logic
  );
end entity;

architecture rtl of fsm_moore is
  type state_t is (IDLE, ON);
  signal state, next_state : state_t;
begin

  -- 1. State register
  process(clk)
  begin
    if rising_edge(clk) then
      if rst = '1' then
        state &lt;= IDLE;
      else
        state &lt;= next_state;
      end if;
    end if;
  end process;

  -- 2. Next-state logic
  process(state, btn)
  begin
    next_state &lt;= state;

    case state is
      when IDLE =&gt;
        if btn = '1' then
          next_state &lt;= ON;
        end if;

      when ON =&gt;
        if btn = '1' then
          next_state &lt;= IDLE;
        end if;
    end case;
  end process;

  -- 3. Output logic (Moore)
  process(state)
  begin
    case state is
      when IDLE =&gt;
        led &lt;= '0';
      when ON =&gt;
        led &lt;= '1';
    end case;
  end process;

end architecture;
</pre>
</div>
</div>
<hr data-start="3442" data-end="3445" />
<h2 data-start="3447" data-end="3493">9. Những lỗi thường gặp khi mô tả FSM Moore</h2>
<p data-start="3495" data-end="3687">&#x274c; Output phụ thuộc input → thành Mealy FSM<br data-start="3537" data-end="3540" />&#x274c; Không gán <code data-start="3552" data-end="3564">next_state</code> mặc định → tạo latch<br data-start="3585" data-end="3588" />&#x274c; Gộp cả FSM + output + logic vào 1 process → khó debug<br data-start="3643" data-end="3646" />&#x274c; Reset không đưa FSM về state xác định</p>
<hr data-start="3689" data-end="3692" />
<h2 data-start="3694" data-end="3731">10. Checklist FSM Moore chuẩn VHDL</h2>
<ul class="contains-task-list" data-start="3733" data-end="3900">
<li class="task-list-item" data-start="3733" data-end="3756">
<p data-start="3739" data-end="3756"> State dùng <code data-start="3750" data-end="3756">enum</code></p>
</li>
<li class="task-list-item" data-start="3757" data-end="3785">
<p data-start="3763" data-end="3785"> Có state reset rõ ràng</p>
</li>
<li class="task-list-item" data-start="3786" data-end="3811">
<p data-start="3792" data-end="3811"> 3 process tách biệt</p>
</li>
<li class="task-list-item" data-start="3812" data-end="3846">
<p data-start="3818" data-end="3846"> Output chỉ phụ thuộc <code data-start="3839" data-end="3846">state</code></p>
</li>
<li class="task-list-item" data-start="3847" data-end="3864">
<p data-start="3853" data-end="3864"> Không latch</p>
</li>
<li class="task-list-item" data-start="3865" data-end="3900">
<p data-start="3871" data-end="3900"> Mô phỏng trước khi synthesize</p>
</li>
</ul>
<hr data-start="3902" data-end="3905" />
<h2 data-start="3907" data-end="3945">11. Khi nào <strong data-start="3922" data-end="3944">nên dùng FSM Moore</strong>?</h2>
<ul data-start="3947" data-end="4053">
<li data-start="3947" data-end="3975">
<p data-start="3949" data-end="3975">Điều khiển LED, relay, LCD</p>
</li>
<li data-start="3976" data-end="4002">
<p data-start="3978" data-end="4002">FSM tổng quát trong FPGA</p>
</li>
<li data-start="4003" data-end="4023">
<p data-start="4005" data-end="4023">Người mới học VHDL</p>
</li>
<li data-start="4024" data-end="4053">
<p data-start="4026" data-end="4053">Hệ thống cần output ổn định</p>
</li>
</ul>
<p data-start="4055" data-end="4103">&#x1f449; <strong data-start="4058" data-end="4102">90% FSM trong FPGA có thể dùng Moore FSM</strong>.</p>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/lam-sao-de-mo-ta-fsm-dang-moore-bang-vhdl/</guid>
                    </item>
				                    <item>
                        <title>Tại sao reset là yếu tố quan trọng trong thiết kế mạch số?</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/tai-sao-reset-la-yeu-to-quan-trong-trong-thiet-ke-mach-so/</link>
                        <pubDate>Wed, 24 Dec 2025 09:42:22 +0000</pubDate>
                        <description><![CDATA[Trong thiết kế mạch số (FPGA/ASIC), reset không chỉ là “đưa về 0”, mà là cơ chế đảm bảo hệ thống khởi động đúng, chạy ổn định và dễ debug. Rất nhiều lỗi “chạy lúc được lúc không” xuất phát t...]]></description>
                        <content:encoded><![CDATA[<p data-start="70" data-end="290">Trong thiết kế mạch số (FPGA/ASIC), <strong data-start="106" data-end="115">reset</strong> không chỉ là “đưa về 0”, mà là <strong data-start="147" data-end="215">cơ chế đảm bảo hệ thống khởi động đúng, chạy ổn định và dễ debug</strong>. Rất nhiều lỗi “chạy lúc được lúc không” xuất phát từ <strong data-start="270" data-end="289">reset xử lý sai</strong>.</p>
<hr data-start="292" data-end="295" />
<h2 data-start="297" data-end="328">1) Reset là gì và nó làm gì?</h2>
<p data-start="330" data-end="423"><strong data-start="330" data-end="339">Reset</strong> đưa các phần tử nhớ (flip-flop, register, FSM…) về <strong data-start="391" data-end="422">trạng thái ban đầu xác định</strong>:</p>
<ul data-start="424" data-end="494">
<li data-start="424" data-end="439">
<p data-start="426" data-end="439">Counter = 0</p>
</li>
<li data-start="440" data-end="461">
<p data-start="442" data-end="461">FSM về state IDLE</p>
</li>
<li data-start="462" data-end="494">
<p data-start="464" data-end="494">Thanh ghi về giá trị an toàn</p>
</li>
</ul>
<p data-start="496" data-end="571">&#x1f449; Nói cách khác, reset giúp hệ thống <strong data-start="534" data-end="558">biết mình đang ở đâu</strong> ngay từ đầu.</p>
<hr data-start="573" data-end="576" />
<h2 data-start="578" data-end="622">2) Điều gì xảy ra nếu <strong data-start="603" data-end="621">không có reset</strong>?</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.edn.com/wp-content/uploads/contenteetimes-images-01rocketman-carefeedfpgaadiltcappnotef6x600.png" alt="https://www.edn.com/wp-content/uploads/contenteetimes-images-01rocketman-carefeedfpgaadiltcappnotef6x600.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.physicsforums.com/attachments/capture-png.65440/" alt="https://www.physicsforums.com/attachments/capture-png.65440/" /></div>
</div>
</div>
<ul data-start="666" data-end="873">
<li data-start="666" data-end="733">
<p data-start="668" data-end="733">Flip-flop <strong data-start="678" data-end="695">không đảm bảo</strong> khởi tạo cùng giá trị khi cấp nguồn</p>
</li>
<li data-start="734" data-end="779">
<p data-start="736" data-end="779">FSM có thể <strong data-start="747" data-end="777">bắt đầu ở state ngẫu nhiên</strong></p>
</li>
<li data-start="780" data-end="873">
<p data-start="782" data-end="787">Mạch:</p>
<ul data-start="790" data-end="873">
<li data-start="790" data-end="813">
<p data-start="792" data-end="813">Chạy sai ngẫu nhiên</p>
</li>
<li data-start="816" data-end="853">
<p data-start="818" data-end="853">Lỗi chỉ xuất hiện trên board thật</p>
</li>
<li data-start="856" data-end="873">
<p data-start="858" data-end="873">Rất khó debug</p>
</li>
</ul>
</li>
</ul>
<p data-start="875" data-end="952">&#x1f449; <strong data-start="878" data-end="921">Mô phỏng có thể đúng, phần cứng lại sai</strong> — nguyên nhân thường là reset.</p>
<hr data-start="954" data-end="957" />
<h2 data-start="959" data-end="1018">3) Reset giúp hệ thống <strong data-start="985" data-end="1018">khởi động đúng &amp; lặp lại được</strong></h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://images.openai.com/thumbnails/url/Vz00eXicu5mVUVJSUGylr5-al1xUWVCSmqJbkpRnoJdeXJJYkpmsl5yfq5-Zm5ieWmxfaAuUsXL0S7F0Tw4x9E3Ldat0svAtdjatiq8wcM5MMTALrfJPyXWJiCqITPQuDNF10s1Lc8pIT3c1NckvVSsGAHjKJi0" alt="https://i.sstatic.net/lkxVA.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://images.openai.com/thumbnails/url/tC5qM3icu5mRUVJSUGylr5-al1xUWVCSmqJbkpRnoJdeXJJYkpmsl5yfq5-Zm5ieWmxfaAuUsXL0S7F0Tw4qKi3wcEuKDzXNzQyp9M2MLyoKKA7KLzTKd0zKzU-P9_PI8i03z9Z1TixwTDetcFQrBgBZtya7" alt="https://academy.nordicsemi.com/wp-content/uploads/2024/01/Boot_Up_Sequence-1.png" /></div>
</div>
</div>
<ul data-start="1062" data-end="1183">
<li data-start="1062" data-end="1106">
<p data-start="1064" data-end="1106">Mỗi lần cấp nguồn → <strong data-start="1084" data-end="1106">hành vi giống nhau</strong></p>
</li>
<li data-start="1107" data-end="1152">
<p data-start="1109" data-end="1152">FSM luôn bắt đầu từ <strong data-start="1129" data-end="1152">trạng thái xác định</strong></p>
</li>
<li data-start="1153" data-end="1183">
<p data-start="1155" data-end="1183">Dễ kiểm tra, dễ tái hiện lỗi</p>
</li>
</ul>
<p data-start="1185" data-end="1243">&#x1f449; Đây là yêu cầu <strong data-start="1203" data-end="1215">bắt buộc</strong> trong hệ thống công nghiệp.</p>
<hr data-start="1245" data-end="1248" />
<h2 data-start="1250" data-end="1295">4) Reset giúp <strong data-start="1267" data-end="1295">đảm bảo an toàn hệ thống</strong></h2>
<p data-start="1297" data-end="1370">Trong nhiều ứng dụng, trạng thái khởi động <strong data-start="1340" data-end="1369">không được phép nguy hiểm</strong>:</p>
<ul data-start="1371" data-end="1485">
<li data-start="1371" data-end="1408">
<p data-start="1373" data-end="1408">Motor không được quay khi bật nguồn</p>
</li>
<li data-start="1409" data-end="1441">
<p data-start="1411" data-end="1441">Van/relay không được kích nhầm</p>
</li>
<li data-start="1442" data-end="1485">
<p data-start="1444" data-end="1485">Bus giao tiếp không được phát dữ liệu rác</p>
</li>
</ul>
<p data-start="1487" data-end="1498">Reset giúp:</p>
<ul data-start="1499" data-end="1576">
<li data-start="1499" data-end="1534">
<p data-start="1501" data-end="1534">Đưa output về <strong data-start="1515" data-end="1534">giá trị an toàn</strong></p>
</li>
<li data-start="1535" data-end="1576">
<p data-start="1537" data-end="1576">Tránh hành vi ngoài ý muốn lúc power-up</p>
</li>
</ul>
<hr data-start="1578" data-end="1581" />
<h2 data-start="1583" data-end="1626">5) Reset giúp <strong data-start="1600" data-end="1619">debug &amp; bảo trì</strong> dễ hơn</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl"> </div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.baldengineer.com/wp-content/uploads/2016/03/logic-analyzer-terms-with-waveform-1024x331.png" alt="https://www.baldengineer.com/wp-content/uploads/2016/03/logic-analyzer-terms-with-waveform-1024x331.png" /></div>
</div>
</div>
<ul data-start="1670" data-end="1782">
<li data-start="1670" data-end="1726">
<p data-start="1672" data-end="1726">Khi mạch “treo” → reset để quay lại trạng thái ban đầu</p>
</li>
<li data-start="1727" data-end="1751">
<p data-start="1729" data-end="1751">Test từng khối độc lập</p>
</li>
<li data-start="1752" data-end="1782">
<p data-start="1754" data-end="1782">So sánh waveform dễ dàng hơn</p>
</li>
</ul>
<p data-start="1784" data-end="1846">&#x1f449; Thiết kế <strong data-start="1796" data-end="1819">không reset rõ ràng</strong> = debug rất tốn thời gian.</p>
<hr data-start="1848" data-end="1851" />
<h2 data-start="1853" data-end="1910">6) Reset và mối liên hệ với <strong data-start="1884" data-end="1910">FSM, counter, datapath</strong></h2>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" data-start="1912" data-end="2119">
<thead data-start="1912" data-end="1945">
<tr data-start="1912" data-end="1945">
<th data-start="1912" data-end="1924" data-col-size="sm">Khối mạch</th>
<th data-start="1924" data-end="1945" data-col-size="sm">Vai trò của reset</th>
</tr>
</thead>
<tbody data-start="1977" data-end="2119">
<tr data-start="1977" data-end="2008">
<td data-start="1977" data-end="1983" data-col-size="sm">FSM</td>
<td data-col-size="sm" data-start="1983" data-end="2008">Đưa về state khởi đầu</td>
</tr>
<tr data-start="2009" data-end="2044">
<td data-start="2009" data-end="2019" data-col-size="sm">Counter</td>
<td data-col-size="sm" data-start="2019" data-end="2044">Xác định điểm bắt đầu</td>
</tr>
<tr data-start="2045" data-end="2075">
<td data-start="2045" data-end="2056" data-col-size="sm">Register</td>
<td data-col-size="sm" data-start="2056" data-end="2075">Xóa dữ liệu rác</td>
</tr>
<tr data-start="2076" data-end="2119">
<td data-start="2076" data-end="2087" data-col-size="sm">Datapath</td>
<td data-col-size="sm" data-start="2087" data-end="2119">Tránh lan truyền giá trị sai</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="2121" data-end="2180">&#x1f449; <strong data-start="2124" data-end="2179">Mọi khối có nhớ → đều cần reset (hoặc init an toàn)</strong>.</p>
<hr data-start="2182" data-end="2185" />
<h2 data-start="2187" data-end="2225">7) Reset và <strong data-start="2202" data-end="2225">timing / độ ổn định</strong></h2>
<ul data-start="2227" data-end="2378">
<li data-start="2227" data-end="2302">
<p data-start="2229" data-end="2255">Reset sai cách có thể gây:</p>
<ul data-start="2258" data-end="2302">
<li data-start="2258" data-end="2277">
<p data-start="2260" data-end="2277"><strong data-start="2260" data-end="2277">Metastability</strong></p>
</li>
<li data-start="2280" data-end="2302">
<p data-start="2282" data-end="2302"><strong data-start="2282" data-end="2302">Timing violation</strong></p>
</li>
</ul>
</li>
<li data-start="2303" data-end="2378">
<p data-start="2305" data-end="2326">Reset đúng cách giúp:</p>
<ul data-start="2329" data-end="2378">
<li data-start="2329" data-end="2347">
<p data-start="2331" data-end="2347">Đồng bộ hệ thống</p>
</li>
<li data-start="2350" data-end="2378">
<p data-start="2352" data-end="2378">Tránh glitch lúc khởi động</p>
</li>
</ul>
</li>
</ul>
<p data-start="2380" data-end="2449">&#x1f449; Vì vậy, reset <strong data-start="2397" data-end="2419">không chỉ là logic</strong>, mà còn là <strong data-start="2431" data-end="2448">vấn đề timing</strong>.</p>
<hr data-start="2451" data-end="2454" />
<h2 data-start="2456" data-end="2492">8) Những lỗi reset rất thường gặp</h2>
<p data-start="2494" data-end="2702">&#x274c; Không reset FSM<br data-start="2511" data-end="2514" />&#x274c; Dùng reset không đồng bộ cho toàn hệ thống mà <strong data-start="2562" data-end="2589">không đồng bộ nhả reset</strong><br data-start="2589" data-end="2592" />&#x274c; Dựa vào giá trị khởi tạo (<code data-start="2620" data-end="2624">:=</code> / <code data-start="2627" data-end="2636">initial</code>) thay vì reset thật<br data-start="2656" data-end="2659" />&#x274c; Reset không rõ active-high / active-low</p>
<hr data-start="2704" data-end="2707" />
<h2 data-start="2709" data-end="2745">9) Thực hành tốt (Best Practices)</h2>
<ul data-start="2747" data-end="2918">
<li data-start="2747" data-end="2779">
<p data-start="2749" data-end="2779">&#x2714;&#xfe0f; FSM <strong data-start="2756" data-end="2779">luôn có state reset</strong></p>
</li>
<li data-start="2780" data-end="2827">
<p data-start="2782" data-end="2827">&#x2714;&#xfe0f; Ưu tiên <strong data-start="2793" data-end="2810">reset đồng bộ</strong> cho logic nội bộ</p>
</li>
<li data-start="2828" data-end="2885">
<p data-start="2830" data-end="2885">&#x2714;&#xfe0f; Reset từ bên ngoài → <strong data-start="2854" data-end="2885">assert async, deassert sync</strong></p>
</li>
<li data-start="2886" data-end="2918">
<p data-start="2888" data-end="2918">&#x2714;&#xfe0f; Mô phỏng reset kỹ như clock</p>
</li>
</ul>
<hr data-start="2920" data-end="2923" />
<h2 data-start="2925" data-end="2949">10) Kết luận ngắn gọn</h2>
<blockquote data-start="2951" data-end="3007">
<p data-start="2953" data-end="3007"><strong data-start="2953" data-end="3007">Reset quyết định hệ thống có “đáng tin” hay không.</strong></p>
</blockquote>
<p data-start="3009" data-end="3046">Một thiết kế mạch số tốt là thiết kế:</p>
<ul data-start="3047" data-end="3125">
<li data-start="3047" data-end="3067">
<p data-start="3049" data-end="3067">Khởi động <strong data-start="3059" data-end="3067">đúng</strong></p>
</li>
<li data-start="3068" data-end="3092">
<p data-start="3070" data-end="3092">Lặp lại <strong data-start="3078" data-end="3092">giống nhau</strong></p>
</li>
<li data-start="3093" data-end="3107">
<p data-start="3095" data-end="3107">Debug <strong data-start="3101" data-end="3107">dễ</strong></p>
</li>
<li data-start="3108" data-end="3125">
<p data-start="3110" data-end="3125">An toàn <strong data-start="3118" data-end="3125">cao</strong></p>
</li>
</ul>
<p data-start="3127" data-end="3183">Và tất cả đều bắt đầu từ <strong data-start="3152" data-end="3182">reset được xử lý đúng cách</strong>.</p>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/tai-sao-reset-la-yeu-to-quan-trong-trong-thiet-ke-mach-so/</guid>
                    </item>
				                    <item>
                        <title>So sánh Verilog với VHDL – Ưu nhược điểm</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/so-sanh-verilog-voi-vhdl-uu-nhuoc-diem/</link>
                        <pubDate>Wed, 24 Dec 2025 09:41:03 +0000</pubDate>
                        <description><![CDATA[Khi học và làm việc với FPGA / thiết kế số, hai ngôn ngữ HDL phổ biến nhất là Verilog và VHDL.Việc chọn ngôn ngữ nào ảnh hưởng trực tiếp đến:


Tốc độ học


Cách tư duy thiết kế


H...]]></description>
                        <content:encoded><![CDATA[<p data-start="77" data-end="233">Khi học và làm việc với <strong data-start="101" data-end="123">FPGA / thiết kế số</strong>, hai ngôn ngữ HDL phổ biến nhất là <strong data-start="159" data-end="170">Verilog</strong> và <strong data-start="174" data-end="182">VHDL</strong>.<br data-start="183" data-end="186" />Việc chọn ngôn ngữ nào ảnh hưởng trực tiếp đến:</p>
<ul data-start="234" data-end="303">
<li data-start="234" data-end="246">
<p data-start="236" data-end="246">Tốc độ học</p>
</li>
<li data-start="247" data-end="269">
<p data-start="249" data-end="269">Cách tư duy thiết kế</p>
</li>
<li data-start="270" data-end="303">
<p data-start="272" data-end="303">Hiệu quả làm dự án FPGA thực tế</p>
</li>
</ul>
<p data-start="305" data-end="431">Bài viết này sẽ giúp bạn <strong data-start="330" data-end="354">hiểu rõ sự khác nhau</strong>, <strong data-start="356" data-end="375">ưu – nhược điểm</strong> và <strong data-start="379" data-end="408">nên chọn Verilog hay VHDL</strong> trong từng trường hợp.</p>
<hr data-start="433" data-end="436" />
<h2 data-start="438" data-end="466">Tổng quan Verilog và VHDL</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.researchgate.net/publication/249604725/figure/fig1/AS%3A340582904942593%401458212700425/High-level-block-diagram-showing-functional-hierarchy-of-Verilog-modules-for-both-the.png" alt="https://www.researchgate.net/publication/249604725/figure/fig1/AS%3A340582904942593%401458212700425/High-level-block-diagram-showing-functional-hierarchy-of-Verilog-modules-for-both-the.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.researchgate.net/publication/350123908/figure/fig4/AS%3A1002423283896320%401616007743040/Summary-of-VHDL-Design-Flow.jpg" alt="https://www.researchgate.net/publication/350123908/figure/fig4/AS%3A1002423283896320%401616007743040/Summary-of-VHDL-Design-Flow.jpg" /></div>
</div>
</div>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" data-start="510" data-end="739">
<thead data-start="510" data-end="547">
<tr data-start="510" data-end="547">
<th data-start="510" data-end="521" data-col-size="sm">Tiêu chí</th>
<th data-start="521" data-end="535" data-col-size="sm"><strong data-start="523" data-end="534">Verilog</strong></th>
<th data-start="535" data-end="547" data-col-size="sm"><strong data-start="537" data-end="545">VHDL</strong></th>
</tr>
</thead>
<tbody data-start="583" data-end="739">
<tr data-start="583" data-end="611">
<td data-start="583" data-end="596" data-col-size="sm">Năm ra đời</td>
<td data-col-size="sm" data-start="596" data-end="603">1984</td>
<td data-col-size="sm" data-start="603" data-end="611">1987</td>
</tr>
<tr data-start="612" data-end="648">
<td data-start="612" data-end="625" data-col-size="sm">Phong cách</td>
<td data-col-size="sm" data-start="625" data-end="635">Giống C</td>
<td data-col-size="sm" data-start="635" data-end="648">Giống Ada</td>
</tr>
<tr data-start="649" data-end="698">
<td data-start="649" data-end="663" data-col-size="sm">Độ phổ biến</td>
<td data-col-size="sm" data-start="663" data-end="673">Rất cao</td>
<td data-col-size="sm" data-start="673" data-end="698">Cao (nhất là châu Âu)</td>
</tr>
<tr data-start="699" data-end="739">
<td data-start="699" data-end="710" data-col-size="sm">Ứng dụng</td>
<td data-col-size="sm" data-start="710" data-end="724">FPGA &amp; ASIC</td>
<td data-col-size="sm" data-start="724" data-end="739">FPGA &amp; ASIC</td>
</tr>
</tbody>
</table>
</div>
</div>
<hr data-start="741" data-end="744" />
<h2 data-start="746" data-end="766">1. Verilog là gì?</h2>
<h3 data-start="768" data-end="786">Đặc điểm chính</h3>
<ul data-start="787" data-end="895">
<li data-start="787" data-end="817">
<p data-start="789" data-end="817">Cú pháp <strong data-start="797" data-end="809">ngắn gọn</strong>, dễ đọc</p>
</li>
<li data-start="818" data-end="848">
<p data-start="820" data-end="848">Gần với ngôn ngữ lập trình C</p>
</li>
<li data-start="849" data-end="895">
<p data-start="851" data-end="895">Rất phổ biến trong FPGA thương mại &amp; startup</p>
</li>
</ul>
<h3 data-start="897" data-end="924">Ví dụ Verilog (counter)</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">
<pre contenteditable="false">
always @(posedge clk) begin
  if (rst)
    cnt &lt;= 0;
  else
    cnt &lt;= cnt + 1;
end
</pre>
</div>
</div>
</div>
</div>
<h3 data-start="1025" data-end="1048">Ưu điểm của Verilog</h3>
<p data-start="1049" data-end="1165">&#x2705; Dễ học, dễ viết<br data-start="1066" data-end="1069" />&#x2705; Code ngắn, ít dòng<br data-start="1089" data-end="1092" />&#x2705; Phù hợp sinh viên &amp; người mới học FPGA<br data-start="1132" data-end="1135" />&#x2705; Cộng đồng lớn, nhiều ví dụ</p>
<h3 data-start="1167" data-end="1193">Nhược điểm của Verilog</h3>
<p data-start="1194" data-end="1323">&#x274c; Kiểu dữ liệu đơn giản → dễ viết sai<br data-start="1231" data-end="1234" />&#x274c; Ít ràng buộc → bug khó phát hiện sớm<br data-start="1272" data-end="1275" />&#x274c; Dự án lớn dễ khó bảo trì nếu code không chặt</p>
<hr data-start="1325" data-end="1328" />
<h2 data-start="1330" data-end="1347">2. VHDL là gì?</h2>
<h3 data-start="1349" data-end="1367">Đặc điểm chính</h3>
<ul data-start="1368" data-end="1506">
<li data-start="1368" data-end="1402">
<p data-start="1370" data-end="1402">Cú pháp <strong data-start="1378" data-end="1390">chặt chẽ</strong>, tường minh</p>
</li>
<li data-start="1403" data-end="1440">
<p data-start="1405" data-end="1440">Kiểu dữ liệu mạnh, kiểm tra lỗi sớm</p>
</li>
<li data-start="1441" data-end="1506">
<p data-start="1443" data-end="1506">Phổ biến trong <strong data-start="1458" data-end="1506">hệ thống công nghiệp, hàng không, quốc phòng</strong></p>
</li>
</ul>
<h3 data-start="1508" data-end="1532">Ví dụ VHDL (counter)</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      cnt &lt;= (others =&gt; '0');
    else
      cnt &lt;= cnt + 1;
    end if;
  end if;
end process;
</pre>
</div>
</div>
<h3 data-start="1710" data-end="1730">Ưu điểm của VHDL</h3>
<p data-start="1731" data-end="1867">&#x2705; Kiểm soát lỗi tốt<br data-start="1750" data-end="1753" />&#x2705; Rõ ràng, dễ đọc logic với dự án lớn<br data-start="1790" data-end="1793" />&#x2705; Phù hợp tiêu chuẩn công nghiệp<br data-start="1825" data-end="1828" />&#x2705; An toàn hơn cho hệ thống quan trọng</p>
<h3 data-start="1869" data-end="1892">Nhược điểm của VHDL</h3>
<p data-start="1893" data-end="1985">&#x274c; Cú pháp dài, nhiều dòng<br data-start="1918" data-end="1921" />&#x274c; Học chậm hơn Verilog<br data-start="1943" data-end="1946" />&#x274c; Ít “linh hoạt” khi thử nghiệm nhanh</p>
<hr data-start="1987" data-end="1990" />
<h2 data-start="1992" data-end="2030">3. So sánh chi tiết Verilog vs VHDL</h2>
<h3 data-start="2032" data-end="2059">3.1 Cú pháp &amp; độ dễ học</h3>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" data-start="2061" data-end="2206">
<thead data-start="2061" data-end="2090">
<tr data-start="2061" data-end="2090">
<th data-start="2061" data-end="2072" data-col-size="sm">Tiêu chí</th>
<th data-start="2072" data-end="2082" data-col-size="sm">Verilog</th>
<th data-start="2082" data-end="2090" data-col-size="sm">VHDL</th>
</tr>
</thead>
<tbody data-start="2118" data-end="2206">
<tr data-start="2118" data-end="2145">
<td data-start="2118" data-end="2132" data-col-size="sm">Độ ngắn gọn</td>
<td data-start="2132" data-end="2139" data-col-size="sm">&#x2b50;&#x2b50;&#x2b50;&#x2b50;</td>
<td data-start="2139" data-end="2145" data-col-size="sm">&#x2b50;&#x2b50;</td>
</tr>
<tr data-start="2146" data-end="2176">
<td data-start="2146" data-end="2163" data-col-size="sm">Dễ học ban đầu</td>
<td data-start="2163" data-end="2170" data-col-size="sm">&#x2b50;&#x2b50;&#x2b50;&#x2b50;</td>
<td data-start="2170" data-end="2176" data-col-size="sm">&#x2b50;&#x2b50;</td>
</tr>
<tr data-start="2177" data-end="2206">
<td data-start="2177" data-end="2193" data-col-size="sm">Độ tường minh</td>
<td data-start="2193" data-end="2198" data-col-size="sm">&#x2b50;&#x2b50;</td>
<td data-start="2198" data-end="2206" data-col-size="sm">&#x2b50;&#x2b50;&#x2b50;&#x2b50;</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="2208" data-end="2278">&#x1f449; <strong data-start="2211" data-end="2222">Verilog</strong> phù hợp học nhanh<br data-start="2240" data-end="2243" />&#x1f449; <strong data-start="2246" data-end="2254">VHDL</strong> phù hợp học kỹ, bài bản</p>
<hr data-start="2280" data-end="2283" />
<h3 data-start="2285" data-end="2318">3.2 Kiểu dữ liệu &amp; độ an toàn</h3>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" data-start="2320" data-end="2481">
<thead data-start="2320" data-end="2349">
<tr data-start="2320" data-end="2349">
<th data-start="2320" data-end="2331" data-col-size="sm">Tiêu chí</th>
<th data-start="2331" data-end="2341" data-col-size="sm">Verilog</th>
<th data-start="2341" data-end="2349" data-col-size="sm">VHDL</th>
</tr>
</thead>
<tbody data-start="2377" data-end="2481">
<tr data-start="2377" data-end="2415">
<td data-start="2377" data-end="2392" data-col-size="sm">Kiểu dữ liệu</td>
<td data-start="2392" data-end="2403" data-col-size="sm">Đơn giản</td>
<td data-start="2403" data-end="2415" data-col-size="sm">Rất mạnh</td>
</tr>
<tr data-start="2416" data-end="2439">
<td data-start="2416" data-end="2430" data-col-size="sm">Bắt lỗi sớm</td>
<td data-start="2430" data-end="2434" data-col-size="sm">&#x274c;</td>
<td data-start="2434" data-end="2439" data-col-size="sm">&#x2705;</td>
</tr>
<tr data-start="2440" data-end="2481">
<td data-start="2440" data-end="2459" data-col-size="sm">Nguy cơ bug ngầm</td>
<td data-start="2459" data-end="2469" data-col-size="sm">Cao hơn</td>
<td data-start="2469" data-end="2481" data-col-size="sm">Thấp hơn</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="2483" data-end="2524">&#x1f449; VHDL giúp <strong data-start="2496" data-end="2524">bắt lỗi ngay khi compile</strong></p>
<hr data-start="2526" data-end="2529" />
<h3 data-start="2531" data-end="2551">3.3 Quy mô dự án</h3>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" data-start="2553" data-end="2727">
<thead data-start="2553" data-end="2574">
<tr data-start="2553" data-end="2574">
<th data-start="2553" data-end="2562" data-col-size="sm">Quy mô</th>
<th data-start="2562" data-end="2574" data-col-size="sm">Nên dùng</th>
</tr>
</thead>
<tbody data-start="2594" data-end="2727">
<tr data-start="2594" data-end="2632">
<td data-start="2594" data-end="2621" data-col-size="sm">Bài học, đồ án sinh viên</td>
<td data-col-size="sm" data-start="2621" data-end="2632">Verilog</td>
</tr>
<tr data-start="2633" data-end="2662">
<td data-start="2633" data-end="2651" data-col-size="sm">Prototype nhanh</td>
<td data-col-size="sm" data-start="2651" data-end="2662">Verilog</td>
</tr>
<tr data-start="2663" data-end="2695">
<td data-start="2663" data-end="2687" data-col-size="sm">Dự án công nghiệp lớn</td>
<td data-col-size="sm" data-start="2687" data-end="2695">VHDL</td>
</tr>
<tr data-start="2696" data-end="2727">
<td data-start="2696" data-end="2719" data-col-size="sm">Hệ thống an toàn cao</td>
<td data-col-size="sm" data-start="2719" data-end="2727">VHDL</td>
</tr>
</tbody>
</table>
</div>
</div>
<hr data-start="2729" data-end="2732" />
<h2 data-start="2734" data-end="2789">4. Hiệu năng &amp; tài nguyên FPGA – có khác nhau không?</h2>
<p data-start="2791" data-end="2824">&#x1f449; <strong data-start="2794" data-end="2824">Câu trả lời: KHÔNG ĐÁNG KỂ</strong></p>
<ul data-start="2826" data-end="2957">
<li data-start="2826" data-end="2862">
<p data-start="2828" data-end="2862">Verilog và VHDL <strong data-start="2844" data-end="2862">đều là RTL HDL</strong></p>
</li>
<li data-start="2863" data-end="2957">
<p data-start="2865" data-end="2916">Synthesis tool sẽ tạo <strong data-start="2887" data-end="2911">phần cứng giống nhau</strong> nếu:</p>
<ul data-start="2919" data-end="2957">
<li data-start="2919" data-end="2937">
<p data-start="2921" data-end="2937">Thuật toán giống</p>
</li>
<li data-start="2940" data-end="2957">
<p data-start="2942" data-end="2957">Kiến trúc giống</p>
</li>
</ul>
</li>
</ul>
<p data-start="2959" data-end="3017">&#x26a0;&#xfe0f; Hiệu năng phụ thuộc <strong data-start="2982" data-end="2995">cách viết</strong>, không phải ngôn ngữ.</p>
<hr data-start="3019" data-end="3022" />
<h2 data-start="3024" data-end="3054">5. Tool FPGA hỗ trợ ra sao?</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.aldec.com/images/content/solutions/aldec_xilinx_flow.png" alt="https://www.aldec.com/images/content/solutions/aldec_xilinx_flow.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.sigasi.com/img/tech/designflow.png" alt="https://www.sigasi.com/img/tech/designflow.png" /></div>
</div>
</div>
<ul data-start="3098" data-end="3227">
<li data-start="3098" data-end="3153">
<p data-start="3100" data-end="3153">Vivado, Quartus, Libero: hỗ trợ <strong data-start="3132" data-end="3153">cả Verilog &amp; VHDL</strong></p>
</li>
<li data-start="3154" data-end="3227">
<p data-start="3156" data-end="3176">Verilog thường được:</p>
<ul data-start="3179" data-end="3227">
<li data-start="3179" data-end="3196">
<p data-start="3181" data-end="3196">Ví dụ nhiều hơn</p>
</li>
<li data-start="3199" data-end="3227">
<p data-start="3201" data-end="3227">IP core mẫu dùng nhiều hơn</p>
</li>
</ul>
</li>
</ul>
<hr data-start="3229" data-end="3232" />
<h2 data-start="3234" data-end="3266">6. Nên chọn Verilog hay VHDL?</h2>
<h3 data-start="3268" data-end="3300">&#x1f449; Chọn <strong data-start="3280" data-end="3291">Verilog</strong> nếu bạn:</h3>
<ul data-start="3301" data-end="3392">
<li data-start="3301" data-end="3315">
<p data-start="3303" data-end="3315">Mới học FPGA</p>
</li>
<li data-start="3316" data-end="3344">
<p data-start="3318" data-end="3344">Làm nhanh đồ án, prototype</p>
</li>
<li data-start="3345" data-end="3376">
<p data-start="3347" data-end="3376">Đọc tài liệu/opensource nhiều</p>
</li>
<li data-start="3377" data-end="3392">
<p data-start="3379" data-end="3392">Muốn code gọn</p>
</li>
</ul>
<h3 data-start="3394" data-end="3423">&#x1f449; Chọn <strong data-start="3406" data-end="3414">VHDL</strong> nếu bạn:</h3>
<ul data-start="3424" data-end="3538">
<li data-start="3424" data-end="3448">
<p data-start="3426" data-end="3448">Làm dự án lớn, dài hạn</p>
</li>
<li data-start="3449" data-end="3473">
<p data-start="3451" data-end="3473">Yêu cầu độ ổn định cao</p>
</li>
<li data-start="3474" data-end="3508">
<p data-start="3476" data-end="3508">Làm trong môi trường công nghiệp</p>
</li>
<li data-start="3509" data-end="3538">
<p data-start="3511" data-end="3538">Muốn kiểm soát lỗi chặt chẽ</p>
</li>
</ul>
<p data-start="3540" data-end="3593">&#x1f449; <strong data-start="3543" data-end="3554">Thực tế</strong>: rất nhiều kỹ sư giỏi <strong data-start="3577" data-end="3592">biết cả hai</strong>.</p>
<hr data-start="3595" data-end="3598" />
<h2 data-start="3600" data-end="3647">7. Lời khuyên thực tế cho người mới học FPGA</h2>
<blockquote data-start="3649" data-end="3722">
<p data-start="3651" data-end="3722">&#x1f539; <strong data-start="3654" data-end="3722">Bắt đầu bằng Verilog → hiểu bản chất mạch số → học thêm VHDL sau</strong></p>
</blockquote>
<p data-start="3724" data-end="3727">Vì:</p>
<ul data-start="3728" data-end="3793">
<li data-start="3728" data-end="3759">
<p data-start="3730" data-end="3759">Tư duy RTL là quan trọng nhất</p>
</li>
<li data-start="3760" data-end="3793">
<p data-start="3762" data-end="3793">Đổi ngôn ngữ chỉ là đổi cú pháp</p>
</li>
</ul>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/so-sanh-verilog-voi-vhdl-uu-nhuoc-diem/</guid>
                    </item>
				                    <item>
                        <title>Các bước cơ bản để triển khai một mạch thiết kế số lên FPGA thực tế</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/cac-buoc-co-ban-de-trien-khai-mot-mach-thiet-ke-so-len-fpga-thuc-te/</link>
                        <pubDate>Wed, 24 Dec 2025 09:39:08 +0000</pubDate>
                        <description><![CDATA[Đối với sinh viên điện tử, kỹ sư nhúng hoặc người mới học FPGA, việc đưa một mạch số từ ý tưởng → HDL → chạy thật trên board là kỹ năng bắt buộc.Bài viết này trình bày quy trình chuẩn, dễ hi...]]></description>
                        <content:encoded><![CDATA[<p data-start="75" data-end="349">Đối với sinh viên điện tử, kỹ sư nhúng hoặc người mới học <strong data-start="133" data-end="141">FPGA</strong>, việc đưa một mạch số từ <strong data-start="167" data-end="207">ý tưởng → HDL → chạy thật trên board</strong> là kỹ năng bắt buộc.<br data-start="228" data-end="231" />Bài viết này trình bày <strong data-start="254" data-end="298">quy trình chuẩn, dễ hiểu và đúng thực tế</strong>, áp dụng cho hầu hết FPGA hiện nay (Xilinx/Intel).</p>
<hr data-start="351" data-end="354" />
<h2 data-start="356" data-end="394">Tổng quan quy trình triển khai FPGA</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.researchgate.net/publication/362159870/figure/fig1/AS%3A1180292572295174%401658415086752/Traditional-FPGA-design-flow.png" alt="https://www.researchgate.net/publication/362159870/figure/fig1/AS%3A1180292572295174%401658415086752/Traditional-FPGA-design-flow.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://allaboutfpga.com/wp-content/uploads/2014/04/fpga-design1.jpg" alt="https://allaboutfpga.com/wp-content/uploads/2014/04/fpga-design1.jpg" /></div>
</div>
</div>
<p data-start="438" data-end="471">Luồng chuẩn gồm <strong data-start="454" data-end="470">8 bước chính</strong>:</p>
<ol data-start="473" data-end="710">
<li data-start="473" data-end="503">
<p data-start="476" data-end="503">Xác định yêu cầu thiết kế</p>
</li>
<li data-start="504" data-end="543">
<p data-start="507" data-end="543">Mô tả mạch bằng HDL (Verilog/VHDL)</p>
</li>
<li data-start="544" data-end="570">
<p data-start="547" data-end="570">Mô phỏng (Simulation)</p>
</li>
<li data-start="571" data-end="592">
<p data-start="574" data-end="592">Tạo project FPGA</p>
</li>
<li data-start="593" data-end="618">
<p data-start="596" data-end="618">Tổng hợp (Synthesis)</p>
</li>
<li data-start="619" data-end="645">
<p data-start="622" data-end="645">Gán chân &amp; constraint</p>
</li>
<li data-start="646" data-end="676">
<p data-start="649" data-end="676">Implement &amp; tạo bitstream</p>
</li>
<li data-start="677" data-end="710">
<p data-start="680" data-end="710">Nạp FPGA và kiểm tra thực tế</p>
</li>
</ol>
<hr data-start="712" data-end="715" />
<h2 data-start="717" data-end="764">1. Xác định yêu cầu thiết kế (Specification)</h2>
<p data-start="766" data-end="801">Trước khi viết HDL, cần trả lời rõ:</p>
<ul data-start="803" data-end="981">
<li data-start="803" data-end="831">
<p data-start="805" data-end="831">Mạch làm <strong data-start="814" data-end="830">chức năng gì</strong>?</p>
</li>
<li data-start="832" data-end="857">
<p data-start="834" data-end="857">Tần số clock bao nhiêu?</p>
</li>
<li data-start="858" data-end="896">
<p data-start="860" data-end="896">Input/Output gồm những tín hiệu nào?</p>
</li>
<li data-start="897" data-end="934">
<p data-start="899" data-end="934">Có dùng FSM, counter, bộ nhớ không?</p>
</li>
<li data-start="935" data-end="981">
<p data-start="937" data-end="981">Chạy độc lập hay giao tiếp với CPU/ngoại vi?</p>
</li>
</ul>
<p data-start="983" data-end="1037">&#x1f449; <strong data-start="986" data-end="1037">Sai từ bước này → sửa rất tốn thời gian về sau.</strong></p>
<hr data-start="1039" data-end="1042" />
<h2 data-start="1044" data-end="1084">2. Mô tả mạch bằng HDL (Verilog/VHDL)</h2>
<h3 data-start="1086" data-end="1111">Viết code RTL rõ ràng</h3>
<ul data-start="1112" data-end="1252">
<li data-start="1112" data-end="1161">
<p data-start="1114" data-end="1161">Phân biệt <strong data-start="1124" data-end="1140">logic tổ hợp</strong> và <strong data-start="1144" data-end="1161">logic tuần tự</strong></p>
</li>
<li data-start="1162" data-end="1212">
<p data-start="1164" data-end="1212">FSM viết rõ state register / next state / output</p>
</li>
<li data-start="1213" data-end="1252">
<p data-start="1215" data-end="1252">Reset rõ ràng (ưu tiên reset đồng bộ)</p>
</li>
</ul>
<p data-start="1254" data-end="1275">Ví dụ cấu trúc chuẩn:</p>
<ul data-start="1276" data-end="1331">
<li data-start="1276" data-end="1288">
<p data-start="1278" data-end="1288">Module top</p>
</li>
<li data-start="1289" data-end="1331">
<p data-start="1291" data-end="1331">Các module con (counter, FSM, datapath…)</p>
</li>
</ul>
<p data-start="1333" data-end="1385">&#x1f449; Mục tiêu: <strong data-start="1346" data-end="1385">code đúng chức năng + dễ synthesize</strong></p>
<hr data-start="1387" data-end="1390" />
<h2 data-start="1392" data-end="1430">3. Mô phỏng (Simulation) – BẮT BUỘC</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.aldec.com/images/content/products/AHDL/AHDL_WAV.png" alt="https://www.aldec.com/images/content/products/AHDL/AHDL_WAV.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.digikey.com/maker-media/25084392-c94d-4d0d-976f-3b45079fe9de" alt="https://www.digikey.com/maker-media/25084392-c94d-4d0d-976f-3b45079fe9de" /></div>
</div>
</div>
<h3 data-start="1474" data-end="1500">Tại sao phải mô phỏng?</h3>
<ul data-start="1501" data-end="1608">
<li data-start="1501" data-end="1540">
<p data-start="1503" data-end="1540">Kiểm tra logic <strong data-start="1518" data-end="1540">trước khi lên FPGA</strong></p>
</li>
<li data-start="1541" data-end="1570">
<p data-start="1543" data-end="1570">Bắt lỗi FSM, reset, counter</p>
</li>
<li data-start="1571" data-end="1608">
<p data-start="1573" data-end="1608">Tiết kiệm rất nhiều thời gian debug</p>
</li>
</ul>
<h3 data-start="1610" data-end="1621">Cần có:</h3>
<ul data-start="1622" data-end="1692">
<li data-start="1622" data-end="1632">
<p data-start="1624" data-end="1632">RTL code</p>
</li>
<li data-start="1633" data-end="1677">
<p data-start="1635" data-end="1677"><strong data-start="1635" data-end="1648">Testbench</strong> (tạo clock, reset, stimulus)</p>
</li>
<li data-start="1678" data-end="1692">
<p data-start="1680" data-end="1692">Xem waveform</p>
</li>
</ul>
<p data-start="1694" data-end="1741">&#x1f449; <strong data-start="1697" data-end="1741">Không mô phỏng = debug mù trên phần cứng</strong></p>
<hr data-start="1743" data-end="1746" />
<h2 data-start="1748" data-end="1781">4. Tạo project FPGA trong tool</h2>
<p data-start="1783" data-end="1817">Dùng tool tương ứng với hãng FPGA:</p>
<ul data-start="1818" data-end="1881">
<li data-start="1818" data-end="1844">
<p data-start="1820" data-end="1844">Chọn <strong data-start="1825" data-end="1844">đúng chip/board</strong></p>
</li>
<li data-start="1845" data-end="1859">
<p data-start="1847" data-end="1859">Add file HDL</p>
</li>
<li data-start="1860" data-end="1881">
<p data-start="1862" data-end="1881">Add file simulation</p>
</li>
</ul>
<p data-start="1883" data-end="1892">&#x1f4cc; Lưu ý:</p>
<ul data-start="1893" data-end="1990">
<li data-start="1893" data-end="1950">
<p data-start="1895" data-end="1950">Sai chip → synthesize vẫn chạy nhưng <strong data-start="1932" data-end="1950">không nạp được</strong></p>
</li>
<li data-start="1951" data-end="1990">
<p data-start="1953" data-end="1990">Chọn đúng tốc độ (speed grade) nếu có</p>
</li>
</ul>
<hr data-start="1992" data-end="1995" />
<h2 data-start="1997" data-end="2023">5. Tổng hợp (Synthesis)</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://adaptivesupport.amd.com/sfc/servlet.shepherd/version/renditionDownload?contentId=05T2E00001HK1KU&amp;operationContext=CHATTER&amp;rendition=THUMB720BY480&amp;versionId=0682E00000JpGSZ" alt="https://adaptivesupport.amd.com/sfc/servlet.shepherd/version/renditionDownload?contentId=05T2E00001HK1KU&amp;operationContext=CHATTER&amp;rendition=THUMB720BY480&amp;versionId=0682E00000JpGSZ" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://vhdlwhiz.com/wp-content/uploads/2020/10/synthesized-netlist-schematic.png" alt="https://vhdlwhiz.com/wp-content/uploads/2020/10/synthesized-netlist-schematic.png" /></div>
</div>
</div>
<h3 data-start="2067" data-end="2088">Synthesis làm gì?</h3>
<ul data-start="2089" data-end="2140">
<li data-start="2089" data-end="2120">
<p data-start="2091" data-end="2120">Biến HDL → LUT, FF, BRAM, DSP</p>
</li>
<li data-start="2121" data-end="2140">
<p data-start="2123" data-end="2140">Tạo netlist logic</p>
</li>
</ul>
<h3 data-start="2142" data-end="2159">Cần kiểm tra:</h3>
<ul data-start="2160" data-end="2252">
<li data-start="2160" data-end="2190">
<p data-start="2162" data-end="2190">Số <strong data-start="2165" data-end="2190">LUT / FF / BRAM / DSP</strong></p>
</li>
<li data-start="2191" data-end="2216">
<p data-start="2193" data-end="2216">Có warning latch không?</p>
</li>
<li data-start="2217" data-end="2252">
<p data-start="2219" data-end="2252">FSM có được nhận diện đúng không?</p>
</li>
</ul>
<p data-start="2254" data-end="2314">&#x1f449; Đây là bước đầu phát hiện <strong data-start="2283" data-end="2313">thiết kế có quá nặng không</strong>.</p>
<hr data-start="2316" data-end="2319" />
<h2 data-start="2321" data-end="2360">6. Gán chân &amp; constraint (XDC / SDC)</h2>
<h3 data-start="2362" data-end="2391">Gán chân (Pin assignment)</h3>
<ul data-start="2392" data-end="2446">
<li data-start="2392" data-end="2413">
<p data-start="2394" data-end="2413">LED, button, switch</p>
</li>
<li data-start="2414" data-end="2430">
<p data-start="2416" data-end="2430">UART, SPI, I2C</p>
</li>
<li data-start="2431" data-end="2446">
<p data-start="2433" data-end="2446">Clock đầu vào</p>
</li>
</ul>
<h3 data-start="2448" data-end="2485">Constraint clock (RẤT QUAN TRỌNG)</h3>
<ul data-start="2486" data-end="2567">
<li data-start="2486" data-end="2517">
<p data-start="2488" data-end="2517">Khai báo tần số clock thực tế</p>
</li>
<li data-start="2518" data-end="2567">
<p data-start="2520" data-end="2567">Thiếu constraint → timing report không tin được</p>
</li>
</ul>
<p data-start="2569" data-end="2620">&#x1f4cc; Đây là bước <strong data-start="2584" data-end="2619">liên kết HDL với phần cứng thật</strong>.</p>
<hr data-start="2622" data-end="2625" />
<h2 data-start="2627" data-end="2658">7. Implement &amp; tạo bitstream</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://figures.semanticscholar.org/afae34e482885c1479f6774bd789400989ce020c/1-Figure1-1.png" alt="https://figures.semanticscholar.org/afae34e482885c1479f6774bd789400989ce020c/1-Figure1-1.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://eclipse.umbc.edu/robucci/cmpeRSD/Lectures/Lecture13__TimingAnalysis/images/Lecture14__FPGA_Developement-17.pdf.svg" alt="https://eclipse.umbc.edu/robucci/cmpeRSD/Lectures/Lecture13__TimingAnalysis/images/Lecture14__FPGA_Developement-17.pdf.svg" /></div>
</div>
</div>
<h3 data-start="2702" data-end="2725">Implementation gồm:</h3>
<ul data-start="2726" data-end="2766">
<li data-start="2726" data-end="2745">
<p data-start="2728" data-end="2745">Place (đặt logic)</p>
</li>
<li data-start="2746" data-end="2766">
<p data-start="2748" data-end="2766">Route (định tuyến)</p>
</li>
</ul>
<h3 data-start="2768" data-end="2781">Kiểm tra:</h3>
<ul data-start="2782" data-end="2864">
<li data-start="2782" data-end="2841">
<p data-start="2784" data-end="2802"><strong data-start="2784" data-end="2802">Timing summary</strong></p>
<ul data-start="2805" data-end="2841">
<li data-start="2805" data-end="2822">
<p data-start="2807" data-end="2822">Setup slack ≥ 0</p>
</li>
<li data-start="2825" data-end="2841">
<p data-start="2827" data-end="2841">Hold slack ≥ 0</p>
</li>
</ul>
</li>
<li data-start="2842" data-end="2864">
<p data-start="2844" data-end="2864">Critical path ở đâu?</p>
</li>
</ul>
<p data-start="2866" data-end="2917">&#x1f449; Nếu timing fail → phải quay lại <strong data-start="2901" data-end="2916">tối ưu code</strong>.</p>
<hr data-start="2919" data-end="2922" />
<h2 data-start="2924" data-end="2957">8. Nạp FPGA &amp; kiểm tra thực tế</h2>
<h3 data-start="2959" data-end="2976">Nạp bitstream</h3>
<ul data-start="2977" data-end="3015">
<li data-start="2977" data-end="2993">
<p data-start="2979" data-end="2993">Qua JTAG / USB</p>
</li>
<li data-start="2994" data-end="3015">
<p data-start="2996" data-end="3015">FPGA chạy mạch thật</p>
</li>
</ul>
<h3 data-start="3017" data-end="3030">Kiểm tra:</h3>
<ul data-start="3031" data-end="3133">
<li data-start="3031" data-end="3051">
<p data-start="3033" data-end="3051">LED có đúng không?</p>
</li>
<li data-start="3052" data-end="3082">
<p data-start="3054" data-end="3082">FSM có chạy đúng trạng thái?</p>
</li>
<li data-start="3083" data-end="3106">
<p data-start="3085" data-end="3106">Clock có đúng tần số?</p>
</li>
<li data-start="3107" data-end="3133">
<p data-start="3109" data-end="3133">Có lỗi ngẫu nhiên không?</p>
</li>
</ul>
<p data-start="3135" data-end="3180">&#x1f449; Nếu mô phỏng đúng mà chạy sai → thường do:</p>
<ul data-start="3181" data-end="3229">
<li data-start="3181" data-end="3188">
<p data-start="3183" data-end="3188">Reset</p>
</li>
<li data-start="3189" data-end="3207">
<p data-start="3191" data-end="3207">Constraint clock</p>
</li>
<li data-start="3208" data-end="3229">
<p data-start="3210" data-end="3229">Input không đồng bộ</p>
</li>
</ul>
<hr data-start="3231" data-end="3234" />
<h2 data-start="3236" data-end="3274">9. Vòng lặp debug (thực tế luôn có)</h2>
<p data-start="3276" data-end="3326">Thiết kế FPGA <strong data-start="3290" data-end="3325">không bao giờ xong ngay lần đầu</strong>:</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">
<pre contenteditable="false">Code → Sim → Synthesis → Implement → Test
           ↑__________________________|
</pre>
</div>
</div>
</div>
</div>
<p data-start="3419" data-end="3464">&#x1f449; Debug tốt = tiết kiệm 70% thời gian dự án.</p>
<hr data-start="3466" data-end="3469" />
<h2 data-start="3471" data-end="3516">10. Checklist nhanh cho người mới học FPGA</h2>
<ul class="contains-task-list" data-start="3518" data-end="3724">
<li class="task-list-item" data-start="3518" data-end="3548">
<p data-start="3524" data-end="3548"> Yêu cầu thiết kế rõ ràng</p>
</li>
<li class="task-list-item" data-start="3549" data-end="3578">
<p data-start="3555" data-end="3578"> Code HDL đúng chuẩn RTL</p>
</li>
<li class="task-list-item" data-start="3579" data-end="3608">
<p data-start="3585" data-end="3608"> Có testbench &amp; waveform</p>
</li>
<li class="task-list-item" data-start="3609" data-end="3629">
<p data-start="3615" data-end="3629"> Không có latch</p>
</li>
<li class="task-list-item" data-start="3630" data-end="3657">
<p data-start="3636" data-end="3657"> Clock &amp; reset rõ ràng</p>
</li>
<li class="task-list-item" data-start="3658" data-end="3679">
<p data-start="3664" data-end="3679"> Constraint đúng</p>
</li>
<li class="task-list-item" data-start="3680" data-end="3697">
<p data-start="3686" data-end="3697"> Timing pass</p>
</li>
<li class="task-list-item" data-start="3698" data-end="3724">
<p data-start="3704" data-end="3724"> Test trên board thật</p>
</li>
</ul>
<hr data-start="3726" data-end="3729" />
<h2 data-start="3731" data-end="3742">Kết luận</h2>
<blockquote data-start="3744" data-end="3845">
<p data-start="3746" data-end="3845">Triển khai mạch số lên FPGA <strong data-start="3774" data-end="3799">không chỉ là viết HDL</strong>, mà là một <strong data-start="3811" data-end="3844">quy trình kỹ thuật hoàn chỉnh</strong>.</p>
</blockquote>
<p data-start="3847" data-end="3876">Người làm FPGA giỏi là người:</p>
<ul data-start="3877" data-end="3958">
<li data-start="3877" data-end="3897">
<p data-start="3879" data-end="3897">Hiểu <strong data-start="3884" data-end="3897">từng bước</strong></p>
</li>
<li data-start="3898" data-end="3929">
<p data-start="3900" data-end="3929">Biết <strong data-start="3905" data-end="3929">lỗi thường nằm ở đâu</strong></p>
</li>
<li data-start="3930" data-end="3958">
<p data-start="3932" data-end="3958">Luôn mô phỏng &amp; đọc report</p>
</li>
</ul>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/cac-buoc-co-ban-de-trien-khai-mot-mach-thiet-ke-so-len-fpga-thuc-te/</guid>
                    </item>
				                    <item>
                        <title>Cách xử lý timing violation trong thiết kế số</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/cach-xu-ly-timing-violation-trong-thiet-ke-so/</link>
                        <pubDate>Wed, 24 Dec 2025 09:37:02 +0000</pubDate>
                        <description><![CDATA[Timing violation là lỗi rất thường gặp khi thiết kế số bằng HDL (Verilog/VHDL), đặc biệt trên FPGA. Nếu không xử lý đúng, mạch có thể:


Chạy không ổn định


Sai dữ liệu ngẫu nhiên

...]]></description>
                        <content:encoded><![CDATA[<p data-start="65" data-end="207"><strong data-start="65" data-end="85">Timing violation</strong> là lỗi rất thường gặp khi thiết kế số bằng HDL (Verilog/VHDL), đặc biệt trên <strong data-start="163" data-end="171">FPGA</strong>. Nếu không xử lý đúng, mạch có thể:</p>
<ul data-start="208" data-end="306">
<li data-start="208" data-end="232">
<p data-start="210" data-end="232">Chạy <strong data-start="215" data-end="232">không ổn định</strong></p>
</li>
<li data-start="233" data-end="257">
<p data-start="235" data-end="257">Sai dữ liệu ngẫu nhiên</p>
</li>
<li data-start="258" data-end="306">
<p data-start="260" data-end="306">Chỉ lỗi khi lên board thật (mô phỏng vẫn đúng)</p>
</li>
</ul>
<p data-start="308" data-end="414">Bài viết này giúp bạn <strong data-start="330" data-end="347">hiểu bản chất</strong>, <strong data-start="349" data-end="373">phân loại lỗi timing</strong> và <strong data-start="377" data-end="413">cách khắc phục hiệu quả, thực tế</strong>.</p>
<hr data-start="416" data-end="419" />
<h2 data-start="421" data-end="450">1. Timing violation là gì?</h2>
<p data-start="452" data-end="558"><strong data-start="452" data-end="472">Timing violation</strong> xảy ra khi <strong data-start="484" data-end="527">dữ liệu không đáp ứng yêu cầu thời gian</strong> của flip-flop hoặc logic, gồm:</p>
<ul data-start="559" data-end="651">
<li data-start="559" data-end="605">
<p data-start="561" data-end="605"><strong data-start="561" data-end="580">Setup violation</strong>: dữ liệu đến <strong data-start="594" data-end="605">quá trễ</strong></p>
</li>
<li data-start="606" data-end="651">
<p data-start="608" data-end="651"><strong data-start="608" data-end="626">Hold violation</strong>: dữ liệu đến <strong data-start="640" data-end="651">quá sớm</strong></p>
</li>
</ul>
<p data-start="653" data-end="729">Nói ngắn gọn: <strong data-start="667" data-end="728">logic chạy chậm hơn (hoặc nhanh hơn) so với yêu cầu clock</strong>.</p>
<hr data-start="731" data-end="734" />
<h2 data-start="736" data-end="774">2. Hai loại timing violation cơ bản</h2>
<h3 data-start="776" data-end="820">2.1 Setup Time Violation (phổ biến nhất)</h3>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://eu-images.contentstack.com/v3/assets/blt0bbd1b20253587c0/bltb6f1bd77df3d39bb/6514179374437056a7b6c1bb/SetupHold_Fig1.png" alt="https://eu-images.contentstack.com/v3/assets/blt0bbd1b20253587c0/bltb6f1bd77df3d39bb/6514179374437056a7b6c1bb/SetupHold_Fig1.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://nandland.com/articles/images/setup_and_hold_time.png" alt="https://nandland.com/articles/images/setup_and_hold_time.png" /></div>
</div>
</div>
<p data-start="864" data-end="879"><strong data-start="864" data-end="879">Xảy ra khi:</strong></p>
<ul data-start="880" data-end="952">
<li data-start="880" data-end="903">
<p data-start="882" data-end="903">Đường dữ liệu quá dài</p>
</li>
<li data-start="904" data-end="921">
<p data-start="906" data-end="921">Clock quá nhanh</p>
</li>
<li data-start="922" data-end="952">
<p data-start="924" data-end="952">Logic giữa 2 FF quá phức tạp</p>
</li>
</ul>
<p data-start="954" data-end="1003">&#x1f449; Dữ liệu <strong data-start="965" data-end="985">chưa kịp ổn định</strong> trước cạnh clock.</p>
<hr data-start="1005" data-end="1008" />
<h3 data-start="1010" data-end="1064">2.2 Hold Time Violation (nguy hiểm nhưng khó thấy)</h3>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://eu-images.contentstack.com/v3/assets/blt0bbd1b20253587c0/bltb6f1bd77df3d39bb/6514179374437056a7b6c1bb/SetupHold_Fig1.png" alt="https://eu-images.contentstack.com/v3/assets/blt0bbd1b20253587c0/bltb6f1bd77df3d39bb/6514179374437056a7b6c1bb/SetupHold_Fig1.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://nandland.com/articles/images/setup_and_hold_time.png" alt="https://nandland.com/articles/images/setup_and_hold_time.png" /></div>
</div>
</div>
<p data-start="1108" data-end="1123"><strong data-start="1108" data-end="1123">Xảy ra khi:</strong></p>
<ul data-start="1124" data-end="1190">
<li data-start="1124" data-end="1148">
<p data-start="1126" data-end="1148">Đường dữ liệu quá ngắn</p>
</li>
<li data-start="1149" data-end="1161">
<p data-start="1151" data-end="1161">Clock skew</p>
</li>
<li data-start="1162" data-end="1190">
<p data-start="1164" data-end="1190">Reset/enable không đồng bộ</p>
</li>
</ul>
<p data-start="1192" data-end="1244">&#x1f449; Dữ liệu <strong data-start="1203" data-end="1223">thay đổi quá sớm</strong> ngay sau cạnh clock.</p>
<hr data-start="1246" data-end="1249" />
<h2 data-start="1251" data-end="1292">3. Dấu hiệu nhận biết timing violation</h2>
<ul data-start="1294" data-end="1442">
<li data-start="1294" data-end="1362">
<p data-start="1296" data-end="1315">Vivado/Quartus báo:</p>
<ul data-start="1318" data-end="1362">
<li data-start="1318" data-end="1339">
<p data-start="1320" data-end="1339">&#x274c; <em data-start="1322" data-end="1339">Setup Slack &lt; 0</em></p>
</li>
<li data-start="1342" data-end="1362">
<p data-start="1344" data-end="1362">&#x274c; <em data-start="1346" data-end="1362">Hold Slack &lt; 0</em></p>
</li>
</ul>
</li>
<li data-start="1363" data-end="1442">
<p data-start="1365" data-end="1370">Mạch:</p>
<ul data-start="1373" data-end="1442">
<li data-start="1373" data-end="1398">
<p data-start="1375" data-end="1398">Chạy lúc được lúc không</p>
</li>
<li data-start="1401" data-end="1417">
<p data-start="1403" data-end="1417">Sai ngẫu nhiên</p>
</li>
<li data-start="1420" data-end="1442">
<p data-start="1422" data-end="1442">Chỉ lỗi ở tần số cao</p>
</li>
</ul>
</li>
</ul>
<hr data-start="1444" data-end="1447" />
<h2 data-start="1449" data-end="1495">4. Quy trình xử lý timing violation (CHUẨN)</h2>
<h3 data-start="1497" data-end="1544">Bước 1: Đọc báo cáo timing (rất quan trọng)</h3>
<p data-start="1545" data-end="1557">Xem các mục:</p>
<ul data-start="1558" data-end="1643">
<li data-start="1558" data-end="1590">
<p data-start="1560" data-end="1590"><strong data-start="1560" data-end="1590">Worst Negative Slack (WNS)</strong></p>
</li>
<li data-start="1591" data-end="1623">
<p data-start="1593" data-end="1623"><strong data-start="1593" data-end="1623">Total Negative Slack (TNS)</strong></p>
</li>
<li data-start="1624" data-end="1643">
<p data-start="1626" data-end="1643"><strong data-start="1626" data-end="1643">Critical Path</strong></p>
</li>
</ul>
<p data-start="1645" data-end="1701">&#x1f449; <strong data-start="1648" data-end="1701">Đừng sửa code trước khi biết đường nào chậm nhất.</strong></p>
<hr data-start="1703" data-end="1706" />
<h3 data-start="1708" data-end="1743">Bước 2: Xác định loại violation</h3>
<ul data-start="1744" data-end="1856">
<li data-start="1744" data-end="1794">
<p data-start="1746" data-end="1794">Slack âm ở <strong data-start="1757" data-end="1766">setup</strong> → xử lý logic/chia pipeline</p>
</li>
<li data-start="1795" data-end="1856">
<p data-start="1797" data-end="1856">Slack âm ở <strong data-start="1808" data-end="1816">hold</strong> → thêm delay/buffer (tool thường tự xử)</p>
</li>
</ul>
<hr data-start="1858" data-end="1861" />
<h2 data-start="1863" data-end="1916">5. Cách xử lý <strong data-start="1880" data-end="1899">Setup Violation</strong> (80% trường hợp)</h2>
<h3 data-start="1918" data-end="1964">5.1 Giảm độ phức tạp logic (tách pipeline)</h3>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl"> </div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.allaboutcircuits.com/uploads/articles/Pipeline_4_stage_2_.jpg" alt="https://www.allaboutcircuits.com/uploads/articles/Pipeline_4_stage_2_.jpg" /></div>
</div>
</div>
<p data-start="2008" data-end="2043"><strong data-start="2008" data-end="2043">Sai (logic dài trong 1 chu kỳ):</strong></p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-vhdl"><span>y &lt;= (a + b) * (c + d);
</span></code></div>
</div>
<p data-start="2081" data-end="2101"><strong data-start="2081" data-end="2101">Đúng (pipeline):</strong></p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">stage1 &lt;= a + b;
stage2 &lt;= c + d;
y      &lt;= stage1 * stage2;
</pre>
</div>
</div>
<p data-start="2176" data-end="2225">&#x2705; Giảm delay mỗi chu kỳ<br data-start="2199" data-end="2202" />&#x2705; Dễ đạt Fmax cao hơn</p>
<hr data-start="2227" data-end="2230" />
<h3 data-start="2232" data-end="2283">5.2 Giảm tần số clock (khi không cần quá nhanh)</h3>
<ul data-start="2284" data-end="2354">
<li data-start="2284" data-end="2306">
<p data-start="2286" data-end="2306">Từ 200 MHz → 100 MHz</p>
</li>
<li data-start="2307" data-end="2354">
<p data-start="2309" data-end="2354">Hoặc dùng <strong data-start="2319" data-end="2335">clock enable</strong> thay vì tăng clock</p>
</li>
</ul>
<hr data-start="2356" data-end="2359" />
<h3 data-start="2361" data-end="2407">5.3 Dùng tài nguyên chuyên dụng (DSP/BRAM)</h3>
<ul data-start="2408" data-end="2459">
<li data-start="2408" data-end="2443">
<p data-start="2410" data-end="2443">Phép <strong data-start="2415" data-end="2432">nhân/cộng lớn</strong> → dùng DSP</p>
</li>
<li data-start="2444" data-end="2459">
<p data-start="2446" data-end="2459">Bộ nhớ → BRAM</p>
</li>
</ul>
<p data-start="2461" data-end="2507">&#x1f449; Tránh để tool suy ra LUT cho các phép nặng.</p>
<hr data-start="2509" data-end="2512" />
<h3 data-start="2514" data-end="2532">5.4 Tối ưu FSM</h3>
<ul data-start="2533" data-end="2602">
<li data-start="2533" data-end="2553">
<p data-start="2535" data-end="2553">Giảm số trạng thái</p>
</li>
<li data-start="2554" data-end="2602">
<p data-start="2556" data-end="2602">Tránh logic IF–ELSE lồng quá sâu trong 1 state</p>
</li>
</ul>
<hr data-start="2604" data-end="2607" />
<h2 data-start="2609" data-end="2644">6. Cách xử lý <strong data-start="2626" data-end="2644">Hold Violation</strong></h2>
<h3 data-start="2646" data-end="2672">6.1 Đừng “sửa tay” vội</h3>
<p data-start="2673" data-end="2694">&#x1f449; Với FPGA hiện đại:</p>
<ul data-start="2695" data-end="2769">
<li data-start="2695" data-end="2733">
<p data-start="2697" data-end="2733"><strong data-start="2697" data-end="2733">Hold violation thường do routing</strong></p>
</li>
<li data-start="2734" data-end="2769">
<p data-start="2736" data-end="2769">Tool <strong data-start="2741" data-end="2769">tự fix bằng delay buffer</strong></p>
</li>
</ul>
<h3 data-start="2771" data-end="2802">6.2 Kiểm tra reset &amp; enable</h3>
<ul data-start="2803" data-end="2863">
<li data-start="2803" data-end="2834">
<p data-start="2805" data-end="2834">Reset async nhả không đồng bộ</p>
</li>
<li data-start="2835" data-end="2863">
<p data-start="2837" data-end="2863">Enable không đồng bộ clock</p>
</li>
</ul>
<p data-start="2865" data-end="2873">&#x1f449; Dùng:</p>
<ul data-start="2874" data-end="2917">
<li data-start="2874" data-end="2889">
<p data-start="2876" data-end="2889">Reset đồng bộ</p>
</li>
<li data-start="2890" data-end="2917">
<p data-start="2892" data-end="2917">Enable đồng bộ theo clock</p>
</li>
</ul>
<hr data-start="2919" data-end="2922" />
<h2 data-start="2924" data-end="2981">7. Những lỗi coding gây timing violation (rất hay gặp)</h2>
<h3 data-start="2983" data-end="3009">&#x274c; Tạo clock bằng logic</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><span>always @(posedge clk_div) ...
</span></code></div>
</div>
<h3 data-start="3056" data-end="3079">&#x2705; Dùng clock enable</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><span>always @(posedge clk)
  if (ce) ...
</span></code></div>
</div>
<hr data-start="3132" data-end="3135" />
<h3 data-start="3137" data-end="3160">&#x274c; Bit-width quá lớn</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><span>reg  cnt; // chỉ cần đếm tới 100
</span></code></div>
</div>
<h3 data-start="3216" data-end="3228">&#x2705; Vừa đủ</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><span>reg  cnt;
</span></code></div>
</div>
<hr data-start="3260" data-end="3263" />
<h2 data-start="3265" data-end="3303">8. Timing constraint – đừng bỏ qua!</h2>
<p data-start="3305" data-end="3367">Nếu <strong data-start="3309" data-end="3338">constraint sai hoặc thiếu</strong>, tool không thể tối ưu đúng.</p>
<h3 data-start="3369" data-end="3390">Tối thiểu cần có:</h3>
<ul data-start="3391" data-end="3458">
<li data-start="3391" data-end="3426">
<p data-start="3393" data-end="3426">Clock constraint (<code data-start="3411" data-end="3425">create_clock</code>)</p>
</li>
<li data-start="3427" data-end="3458">
<p data-start="3429" data-end="3458">Input/Output delay (nâng cao)</p>
</li>
</ul>
<p data-start="3460" data-end="3515">&#x1f449; Thiếu constraint = timing report <strong data-start="3496" data-end="3514">không đáng tin</strong>.</p>
<hr data-start="3517" data-end="3520" />
<h2 data-start="3522" data-end="3566">9. Checklist nhanh xử lý timing violation</h2>
<ul class="contains-task-list" data-start="3568" data-end="3815">
<li class="task-list-item" data-start="3568" data-end="3595">
<p data-start="3574" data-end="3595"> Đọc <strong data-start="3578" data-end="3595">Critical Path</strong></p>
</li>
<li class="task-list-item" data-start="3596" data-end="3629">
<p data-start="3602" data-end="3629"> Xác định <strong data-start="3611" data-end="3629">setup hay hold</strong></p>
</li>
<li class="task-list-item" data-start="3630" data-end="3667">
<p data-start="3636" data-end="3667"> Thêm <strong data-start="3641" data-end="3653">pipeline</strong> nếu logic dài</p>
</li>
<li class="task-list-item" data-start="3668" data-end="3695">
<p data-start="3674" data-end="3695"> Giảm clock nếu có thể</p>
</li>
<li class="task-list-item" data-start="3696" data-end="3721">
<p data-start="3702" data-end="3721"> Dùng <strong data-start="3707" data-end="3721">DSP / BRAM</strong></p>
</li>
<li class="task-list-item" data-start="3722" data-end="3758">
<p data-start="3728" data-end="3758"> Không tạo clock mới bằng logic</p>
</li>
<li class="task-list-item" data-start="3759" data-end="3787">
<p data-start="3765" data-end="3787"> Reset &amp; enable đồng bộ</p>
</li>
<li class="task-list-item" data-start="3788" data-end="3815">
<p data-start="3794" data-end="3815"> Constraint đúng và đủ</p>
</li>
</ul>
<hr data-start="3817" data-end="3820" />
<h2 data-start="3822" data-end="3854">10. Kết luận (rất quan trọng)</h2>
<blockquote data-start="3856" data-end="3929">
<p data-start="3858" data-end="3929"><strong data-start="3858" data-end="3929">Timing violation không phải “tool yếu”, mà thường do cách thiết kế.</strong></p>
</blockquote>
<p data-start="3931" data-end="3950">Thiết kế số tốt là:</p>
<ul data-start="3951" data-end="4014">
<li data-start="3951" data-end="3967">
<p data-start="3953" data-end="3967">Chia nhỏ logic</p>
</li>
<li data-start="3968" data-end="3985">
<p data-start="3970" data-end="3985">Đồng bộ rõ ràng</p>
</li>
<li data-start="3986" data-end="4014">
<p data-start="3988" data-end="4014">Cho tool <strong data-start="3997" data-end="4014">cơ hội tối ưu</strong></p>
</li>
</ul>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/cach-xu-ly-timing-violation-trong-thiet-ke-so/</guid>
                    </item>
				                    <item>
                        <title>Cách xử lý reset đồng bộ và không đồng bộ trong VHDL</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/cach-xu-ly-reset-dong-bo-va-khong-dong-bo-trong-vhdl/</link>
                        <pubDate>Wed, 24 Dec 2025 09:34:03 +0000</pubDate>
                        <description><![CDATA[Trong thiết kế FPGA bằng VHDL, reset là phần rất quan trọng vì nó quyết định:


Trạng thái khởi động của hệ thống


Độ ổn định khi chạy thực tế


Khả năng synthesize và đạt timing
...]]></description>
                        <content:encoded><![CDATA[<p data-start="74" data-end="159">Trong thiết kế<span> </span><strong data-start="89" data-end="107">FPGA bằng VHDL</strong>, reset là phần<span> </span><strong data-start="123" data-end="141">rất quan trọng</strong><span> </span>vì nó quyết định:</p>
<ul data-start="160" data-end="269">
<li data-start="160" data-end="195">
<p data-start="162" data-end="195">Trạng thái khởi động của hệ thống</p>
</li>
<li data-start="196" data-end="225">
<p data-start="198" data-end="225">Độ ổn định khi chạy thực tế</p>
</li>
<li data-start="226" data-end="269">
<p data-start="228" data-end="269">Khả năng<span> </span><strong data-start="237" data-end="251">synthesize</strong><span> </span>và<span> </span><strong data-start="255" data-end="269">đạt timing</strong></p>
</li>
</ul>
<p data-start="271" data-end="296">Bài viết này sẽ giúp bạn:</p>
<ul data-start="297" data-end="436">
<li data-start="297" data-end="351">
<p data-start="299" data-end="351">Hiểu rõ<span> </span><strong data-start="307" data-end="324">reset đồng bộ</strong><span> </span>và<span> </span><strong data-start="328" data-end="351">reset không đồng bộ</strong></p>
</li>
<li data-start="352" data-end="388">
<p data-start="354" data-end="388">Biết cách<span> </span><strong data-start="364" data-end="388">viết VHDL đúng chuẩn</strong></p>
</li>
<li data-start="389" data-end="436">
<p data-start="391" data-end="436">Biết<span> </span><strong data-start="396" data-end="425">khi nào nên dùng loại nào</strong><span> </span>trong FPGA</p>
</li>
</ul>
<hr data-start="438" data-end="441" />
<h2 data-start="443" data-end="475">1. Reset là gì trong mạch số?</h2>
<p data-start="477" data-end="543"><strong data-start="477" data-end="486">Reset</strong><span> </span>là tín hiệu đưa mạch về<span> </span><strong data-start="511" data-end="542">trạng thái ban đầu xác định</strong>:</p>
<ul data-start="544" data-end="608">
<li data-start="544" data-end="559">
<p data-start="546" data-end="559">Thanh ghi = 0</p>
</li>
<li data-start="560" data-end="579">
<p data-start="562" data-end="579">FSM về state IDLE</p>
</li>
<li data-start="580" data-end="608">
<p data-start="582" data-end="608">Counter về giá trị ban đầu</p>
</li>
</ul>
<p data-start="610" data-end="647">&#x1f449; Trong FPGA, reset thường dùng cho:</p>
<ul data-start="648" data-end="687">
<li data-start="648" data-end="659">
<p data-start="650" data-end="659">Flip-Flop</p>
</li>
<li data-start="660" data-end="670">
<p data-start="662" data-end="670">Register</p>
</li>
<li data-start="671" data-end="676">
<p data-start="673" data-end="676">FSM</p>
</li>
<li data-start="677" data-end="687">
<p data-start="679" data-end="687">Datapath</p>
</li>
</ul>
<hr data-start="689" data-end="692" />
<h2 data-start="694" data-end="740">2. Reset không đồng bộ (Asynchronous Reset)</h2>
<h3 data-start="742" data-end="755">Khái niệm</h3>
<p data-start="756" data-end="815"><strong data-start="756" data-end="779">Reset không đồng bộ</strong><span> </span>là reset<span> </span><strong data-start="789" data-end="814">không phụ thuộc clock</strong>:</p>
<ul data-start="816" data-end="879">
<li data-start="816" data-end="852">
<p data-start="818" data-end="852">Reset có hiệu lực<span> </span><strong data-start="836" data-end="852">ngay lập tức</strong></p>
</li>
<li data-start="853" data-end="879">
<p data-start="855" data-end="879">Không cần đợi cạnh clock</p>
</li>
</ul>
<h3 data-start="881" data-end="893">Đặc điểm</h3>
<ul data-start="894" data-end="1001">
<li data-start="894" data-end="918">
<p data-start="896" data-end="918">Reset tác động tức thì</p>
</li>
<li data-start="919" data-end="952">
<p data-start="921" data-end="952">Hay dùng cho<span> </span><strong data-start="934" data-end="952">power-up reset</strong></p>
</li>
<li data-start="953" data-end="1001">
<p data-start="955" data-end="1001">Dễ gây lỗi timing nếu<span> </span><strong data-start="977" data-end="1001">nhả reset không đúng</strong></p>
</li>
</ul>
<h3 data-start="1003" data-end="1022">Sơ đồ nguyên lý</h3>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover lazy-load-active" src="https://images.openai.com/static-rsc-1/A8lfrvRjB4CdylYcStia4OMjLc3L6Xorwo6Lw4Qx56EmIxI5P6qrCWy8JeAYcom5CL1L4u67nkqQ1v-OTwfu9TSw2I09HZ7UD2uyS3_3Vw5ayAb_NAM-dNM9Cq1vHenWQ4BqfwnN6NeITcYp8npZOA" alt="https://i.sstatic.net/CeP1U.png" data-src="https://images.openai.com/static-rsc-1/A8lfrvRjB4CdylYcStia4OMjLc3L6Xorwo6Lw4Qx56EmIxI5P6qrCWy8JeAYcom5CL1L4u67nkqQ1v-OTwfu9TSw2I09HZ7UD2uyS3_3Vw5ayAb_NAM-dNM9Cq1vHenWQ4BqfwnN6NeITcYp8npZOA" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl"> </div>
</div>
<hr data-start="1065" data-end="1068" />
<h3 data-start="1070" data-end="1114">Cách viết reset không đồng bộ trong VHDL</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">process(clk, rst_n)
begin
  if rst_n = '0' then
    q &lt;= (others =&gt; '0');
  elsif rising_edge(clk) then
    q &lt;= d;
  end if;
end process;
</pre>
</div>
</div>
<p data-start="1268" data-end="1277">&#x1f4cc; Lưu ý:</p>
<ul data-start="1278" data-end="1399">
<li data-start="1278" data-end="1312">
<p data-start="1280" data-end="1312"><code data-start="1280" data-end="1287">rst_n</code><span> </span>thường là<span> </span><strong data-start="1298" data-end="1312">active-low</strong></p>
</li>
<li data-start="1313" data-end="1350">
<p data-start="1315" data-end="1350">Reset được kiểm tra<span> </span><strong data-start="1335" data-end="1350">trước clock</strong></p>
</li>
<li data-start="1351" data-end="1399">
<p data-start="1353" data-end="1399">Phải khai báo reset trong<span> </span><strong data-start="1379" data-end="1399">sensitivity list</strong></p>
</li>
</ul>
<hr data-start="1401" data-end="1404" />
<h3 data-start="1406" data-end="1425">Ưu &amp; nhược điểm</h3>
<p data-start="1427" data-end="1437">&#x2705; Ưu điểm:</p>
<ul data-start="1438" data-end="1490">
<li data-start="1438" data-end="1460">
<p data-start="1440" data-end="1460">Reset nhanh, tức thì</p>
</li>
<li data-start="1461" data-end="1490">
<p data-start="1463" data-end="1490">Phù hợp reset khi bật nguồn</p>
</li>
</ul>
<p data-start="1492" data-end="1505">&#x274c; Nhược điểm:</p>
<ul data-start="1506" data-end="1611">
<li data-start="1506" data-end="1546">
<p data-start="1508" data-end="1546">Dễ gây<span> </span><strong data-start="1515" data-end="1532">metastability</strong><span> </span>khi nhả reset</p>
</li>
<li data-start="1547" data-end="1571">
<p data-start="1549" data-end="1571">Khó timing closure hơn</p>
</li>
<li data-start="1572" data-end="1611">
<p data-start="1574" data-end="1611">Không phù hợp hệ thống clock phức tạp</p>
</li>
</ul>
<hr data-start="1613" data-end="1616" />
<h2 data-start="1618" data-end="1657">3. Reset đồng bộ (Synchronous Reset)</h2>
<h3 data-start="1659" data-end="1672">Khái niệm</h3>
<p data-start="1673" data-end="1726"><strong data-start="1673" data-end="1690">Reset đồng bộ</strong><span> </span>chỉ có hiệu lực<span> </span><strong data-start="1707" data-end="1725">tại cạnh clock</strong>:</p>
<ul data-start="1727" data-end="1808">
<li data-start="1727" data-end="1764">
<p data-start="1729" data-end="1764">Reset chỉ được lấy mẫu khi có clock</p>
</li>
<li data-start="1765" data-end="1808">
<p data-start="1767" data-end="1808">Giống một tín hiệu điều khiển bình thường</p>
</li>
</ul>
<h3 data-start="1810" data-end="1822">Đặc điểm</h3>
<ul data-start="1823" data-end="1888">
<li data-start="1823" data-end="1854">
<p data-start="1825" data-end="1854">Reset ổn định, an toàn timing</p>
</li>
<li data-start="1855" data-end="1888">
<p data-start="1857" data-end="1888">Dễ kiểm soát trong hệ thống lớn</p>
</li>
</ul>
<h3 data-start="1890" data-end="1909">Sơ đồ nguyên lý</h3>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover lazy-load-active" src="https://vlsiverify.com/wp-content/uploads/2022/12/synchronous-active-low-DFF.png" alt="https://vlsiverify.com/wp-content/uploads/2022/12/synchronous-active-low-DFF.png" data-src="https://vlsiverify.com/wp-content/uploads/2022/12/synchronous-active-low-DFF.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover lazy-load-active" src="https://vlsiinterviewquestions.org/wp-content/uploads/2012/07/syn_rst_gltch.jpg" alt="https://vlsiinterviewquestions.org/wp-content/uploads/2012/07/syn_rst_gltch.jpg" data-src="https://vlsiinterviewquestions.org/wp-content/uploads/2012/07/syn_rst_gltch.jpg" /></div>
</div>
</div>
<hr data-start="1952" data-end="1955" />
<h3 data-start="1957" data-end="1995">Cách viết reset đồng bộ trong VHDL</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      q &lt;= (others =&gt; '0');
    else
      q &lt;= d;
    end if;
  end if;
end process;
</pre>
</div>
</div>
<p data-start="2164" data-end="2173">&#x1f4cc; Lưu ý:</p>
<ul data-start="2174" data-end="2260">
<li data-start="2174" data-end="2218">
<p data-start="2176" data-end="2218">Reset<span> </span><strong data-start="2182" data-end="2191">không</strong><span> </span>nằm trong sensitivity list</p>
</li>
<li data-start="2219" data-end="2260">
<p data-start="2221" data-end="2260">Reset được kiểm tra<span> </span><strong data-start="2241" data-end="2260">bên trong clock</strong></p>
</li>
</ul>
<hr data-start="2262" data-end="2265" />
<h3 data-start="2267" data-end="2286">Ưu &amp; nhược điểm</h3>
<p data-start="2288" data-end="2298">&#x2705; Ưu điểm:</p>
<ul data-start="2299" data-end="2379">
<li data-start="2299" data-end="2314">
<p data-start="2301" data-end="2314">Dễ đạt timing</p>
</li>
<li data-start="2315" data-end="2346">
<p data-start="2317" data-end="2346">Không lo glitch/reset sai pha</p>
</li>
<li data-start="2347" data-end="2379">
<p data-start="2349" data-end="2379">Khuyến nghị cho FSM &amp; datapath</p>
</li>
</ul>
<p data-start="2381" data-end="2394">&#x274c; Nhược điểm:</p>
<ul data-start="2395" data-end="2461">
<li data-start="2395" data-end="2423">
<p data-start="2397" data-end="2423">Reset chậm hơn (đợi clock)</p>
</li>
<li data-start="2424" data-end="2461">
<p data-start="2426" data-end="2461">Không dùng được khi clock chưa chạy</p>
</li>
</ul>
<hr data-start="2463" data-end="2466" />
<h2 data-start="2468" data-end="2512">4. So sánh reset đồng bộ và không đồng bộ</h2>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" data-start="2514" data-end="2839">
<thead data-start="2514" data-end="2564">
<tr data-start="2514" data-end="2564">
<th data-start="2514" data-end="2525" data-col-size="sm">Tiêu chí</th>
<th data-start="2525" data-end="2547" data-col-size="sm">Reset không đồng bộ</th>
<th data-start="2547" data-end="2564" data-col-size="sm">Reset đồng bộ</th>
</tr>
</thead>
<tbody data-start="2610" data-end="2839">
<tr data-start="2610" data-end="2637">
<td data-start="2610" data-end="2628" data-col-size="sm">Phụ thuộc clock</td>
<td data-start="2628" data-end="2632" data-col-size="sm">&#x274c;</td>
<td data-start="2632" data-end="2637" data-col-size="sm">&#x2705;</td>
</tr>
<tr data-start="2638" data-end="2688">
<td data-start="2638" data-end="2659" data-col-size="sm">Thời điểm tác động</td>
<td data-col-size="sm" data-start="2659" data-end="2674">Ngay lập tức</td>
<td data-col-size="sm" data-start="2674" data-end="2688">Theo clock</td>
</tr>
<tr data-start="2689" data-end="2722">
<td data-start="2689" data-end="2709" data-col-size="sm">Độ an toàn timing</td>
<td data-col-size="sm" data-start="2709" data-end="2714">&#x2b50;&#x2b50;</td>
<td data-col-size="sm" data-start="2714" data-end="2722">&#x2b50;&#x2b50;&#x2b50;&#x2b50;</td>
</tr>
<tr data-start="2723" data-end="2761">
<td data-start="2723" data-end="2747" data-col-size="sm">Nguy cơ metastability</td>
<td data-col-size="sm" data-start="2747" data-end="2753">Cao</td>
<td data-col-size="sm" data-start="2753" data-end="2761">Thấp</td>
</tr>
<tr data-start="2762" data-end="2797">
<td data-start="2762" data-end="2778" data-col-size="sm">Dễ synthesize</td>
<td data-col-size="sm" data-start="2778" data-end="2791">Trung bình</td>
<td data-col-size="sm" data-start="2791" data-end="2797">Dễ</td>
</tr>
<tr data-start="2798" data-end="2839">
<td data-start="2798" data-end="2817" data-col-size="sm">Khuyến nghị FPGA</td>
<td data-col-size="sm" data-start="2817" data-end="2827">Hạn chế</td>
<td data-col-size="sm" data-start="2827" data-end="2839">Nên dùng</td>
</tr>
</tbody>
</table>
</div>
</div>
<hr data-start="2841" data-end="2844" />
<h2 data-start="2846" data-end="2884">5. Khi nào nên dùng loại reset nào?</h2>
<h3 data-start="2886" data-end="2924">&#x1f449; Nên dùng<span> </span><strong data-start="2902" data-end="2919">reset đồng bộ</strong><span> </span>khi:</h3>
<ul data-start="2925" data-end="3020">
<li data-start="2925" data-end="2939">
<p data-start="2927" data-end="2939">Thiết kế FSM</p>
</li>
<li data-start="2940" data-end="2959">
<p data-start="2942" data-end="2959">Datapath phức tạp</p>
</li>
<li data-start="2960" data-end="2985">
<p data-start="2962" data-end="2985">Hệ thống có nhiều clock</p>
</li>
<li data-start="2986" data-end="3020">
<p data-start="2988" data-end="3020">Thiết kế chuẩn cho FPGA hiện đại</p>
</li>
</ul>
<h3 data-start="3022" data-end="3070">&#x1f449; Chỉ nên dùng<span> </span><strong data-start="3042" data-end="3065">reset không đồng bộ</strong><span> </span>khi:</h3>
<ul data-start="3071" data-end="3176">
<li data-start="3071" data-end="3101">
<p data-start="3073" data-end="3101">Reset nguồn (power-on reset)</p>
</li>
<li data-start="3102" data-end="3131">
<p data-start="3104" data-end="3131">Reset từ nút nhấn bên ngoài</p>
</li>
<li data-start="3132" data-end="3176">
<p data-start="3134" data-end="3176">Kết hợp với<span> </span><strong data-start="3146" data-end="3176">mạch đồng bộ reset release</strong></p>
</li>
</ul>
<hr data-start="3178" data-end="3181" />
<h2 data-start="3183" data-end="3250">6. Kỹ thuật chuẩn: Async assert – Sync deassert (RẤT QUAN TRỌNG)</h2>
<p data-start="3252" data-end="3271">Trong FPGA thực tế:</p>
<ul data-start="3272" data-end="3354">
<li data-start="3272" data-end="3313">
<p data-start="3274" data-end="3313"><strong data-start="3274" data-end="3290">Assert reset</strong>: không đồng bộ (nhanh)</p>
</li>
<li data-start="3314" data-end="3354">
<p data-start="3316" data-end="3354"><strong data-start="3316" data-end="3334">Deassert reset</strong>: đồng bộ theo clock</p>
</li>
</ul>
<h3 data-start="3356" data-end="3387">Ví dụ VHDL reset chuẩn FPGA</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">signal rst_sync : std_logic;

process(clk, rst_n)
begin
  if rst_n = '0' then
    rst_sync &lt;= '1';
  elsif rising_edge(clk) then
    rst_sync &lt;= '0';
  end if;
end process;
</pre>
</div>
</div>
<p data-start="3575" data-end="3641">&#x1f449; Sau đó dùng<span> </span><code data-start="3590" data-end="3600">rst_sync</code><span> </span>làm<span> </span><strong data-start="3605" data-end="3622">reset đồng bộ</strong><span> </span>cho toàn hệ thống.</p>
<hr data-start="3643" data-end="3646" />
<h2 data-start="3648" data-end="3683">7. Reset trong FSM (ví dụ chuẩn)</h2>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      state &lt;= IDLE;
    else
      state &lt;= next_state;
    end if;
  end if;
end process;
</pre>
</div>
</div>
<p data-start="3858" data-end="3910">&#x2705; Dễ debug<br data-start="3868" data-end="3871" />&#x2705; Dễ synthesize<br data-start="3886" data-end="3889" />&#x2705; Dễ timing closure</p>
<hr data-start="3912" data-end="3915" />
<h2 data-start="3917" data-end="3964">8. Lỗi thường gặp khi xử lý reset trong VHDL</h2>
<p data-start="3966" data-end="4145">&#x274c; Đặt reset sai sensitivity list<br data-start="3998" data-end="4001" />&#x274c; Dùng reset không đồng bộ cho FSM lớn<br data-start="4039" data-end="4042" />&#x274c; Nhả reset cùng lúc cho nhiều clock khác nhau<br data-start="4088" data-end="4091" />&#x274c; Dựa vào giá trị khởi tạo (<code data-start="4119" data-end="4123">:=</code>) thay vì reset thật</p>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/cach-xu-ly-reset-dong-bo-va-khong-dong-bo-trong-vhdl/</guid>
                    </item>
				                    <item>
                        <title>Làm sao để tối ưu hóa tài nguyên khi thiết kế fpga bằng HDL</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/lam-sao-de-toi-uu-hoa-tai-nguyen-khi-thiet-ke-fpga-bang-hdl/</link>
                        <pubDate>Wed, 24 Dec 2025 09:27:03 +0000</pubDate>
                        <description><![CDATA[Khi thiết kế trên FPGA (như PYNQ-Z2 / Zynq-7000), việc tối ưu LUT, Flip-Flop, BRAM và DSP là kỹ năng rất quan trọng, giúp:


Thiết kế fit chip


Tăng tốc độ (Fmax)


Giảm công suất...]]></description>
                        <content:encoded><![CDATA[<p data-start="83" data-end="213">Khi thiết kế trên FPGA (như <a href="https://dientu.vn/san-pham/board-pynq-z2/" target="_blank" rel="noopener">PYNQ-Z2</a><strong data-start="111" data-end="134"> / Zynq-7000</strong>), việc <strong data-start="142" data-end="180">tối ưu LUT, Flip-Flop, BRAM và DSP</strong> là kỹ năng rất quan trọng, giúp:</p>
<ul data-start="214" data-end="303">
<li data-start="214" data-end="237">
<p data-start="216" data-end="237">Thiết kế <strong data-start="225" data-end="237">fit chip</strong></p>
</li>
<li data-start="238" data-end="262">
<p data-start="240" data-end="262">Tăng <strong data-start="245" data-end="262">tốc độ (Fmax)</strong></p>
</li>
<li data-start="263" data-end="283">
<p data-start="265" data-end="283">Giảm <strong data-start="270" data-end="283">công suất</strong></p>
</li>
<li data-start="284" data-end="303">
<p data-start="286" data-end="303">Dễ mở rộng về sau</p>
</li>
</ul>
<p data-start="305" data-end="392">Bài viết này tổng hợp <strong data-start="327" data-end="355">nguyên tắc + mẹo thực tế</strong> đã được dùng nhiều trong dự án FPGA.</p>
<hr data-start="394" data-end="397" />
<h2 data-start="399" data-end="442">1. Hiểu rõ tài nguyên FPGA gồm những gì?</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://images.openai.com/thumbnails/url/Q4z_UXicu5mZUVJSUGylr5-al1xUWVCSmqJbkpRnoJdeXJJYkpmsl5yfq5-Zm5ieWmxfaAuUsXL0S7F0Tw60MI_SjUgPzTUJz8kMyvNJMk-0SLbIckkt9M3yKg51ykrPLHdJySlIL_fNTTYycylXKwYAVvgmaQ" alt="https://www.researchgate.net/publication/346766789/figure/fig1/AS%3A966673418960900%401607484311619/Resource-ratio-of-different-FPGA-devices-For-each-device-LUT-FF-and-BRAM-numbers-are.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.mouser.com/images/marketingid/2019/microsites/0/Zynq-7000%20SoCArchitectural%20Overview.png" alt="https://www.mouser.com/images/marketingid/2019/microsites/0/Zynq-7000%20SoCArchitectural%20Overview.png" /></div>
</div>
</div>
<h3 data-start="486" data-end="510">Các tài nguyên chính</h3>
<ul data-start="511" data-end="697">
<li data-start="511" data-end="550">
<p data-start="513" data-end="550"><strong data-start="513" data-end="536">LUT (Look-Up Table)</strong>: logic tổ hợp</p>
</li>
<li data-start="551" data-end="587">
<p data-start="553" data-end="587"><strong data-start="553" data-end="571">Flip-Flop (FF)</strong>: lưu trạng thái</p>
</li>
<li data-start="588" data-end="617">
<p data-start="590" data-end="617"><strong data-start="590" data-end="598">BRAM</strong>: bộ nhớ trong chip</p>
</li>
<li data-start="618" data-end="655">
<p data-start="620" data-end="655"><strong data-start="620" data-end="633">DSP slice</strong>: nhân, MAC tốc độ cao</p>
</li>
<li data-start="656" data-end="697">
<p data-start="658" data-end="697"><strong data-start="658" data-end="669">Routing</strong>: kết nối (ảnh hưởng timing)</p>
</li>
</ul>
<p data-start="699" data-end="760">&#x1f449; Tối ưu FPGA = dùng <strong data-start="721" data-end="759">đúng loại tài nguyên cho đúng việc</strong>.</p>
<hr data-start="762" data-end="765" />
<h2 data-start="767" data-end="836">2. Nguyên tắc vàng #1: Giảm LUT bằng cách dùng FF và BRAM đúng chỗ</h2>
<h3 data-start="838" data-end="860">&#x274c; Sai lầm phổ biến</h3>
<ul data-start="861" data-end="964">
<li data-start="861" data-end="921">
<p data-start="863" data-end="921">Dùng mảng <code data-start="873" data-end="897">reg  mem </code> cho bộ nhớ lớn → ăn LUT</p>
</li>
<li data-start="922" data-end="964">
<p data-start="924" data-end="964">Dùng logic để cộng/nhân số lớn → tốn LUT</p>
</li>
</ul>
<h3 data-start="966" data-end="981">&#x2705; Cách đúng</h3>
<ul data-start="982" data-end="1041">
<li data-start="982" data-end="1008">
<p data-start="984" data-end="1008">Dùng <strong data-start="989" data-end="997">BRAM</strong> cho bộ nhớ</p>
</li>
<li data-start="1009" data-end="1041">
<p data-start="1011" data-end="1041">Dùng <strong data-start="1016" data-end="1023">DSP</strong> cho nhân/cộng lớn</p>
</li>
</ul>
<p data-start="1043" data-end="1063">Ví dụ (suy ra BRAM):</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">reg  mem ;
always @(posedge clk)
  mem &lt;= din;
</pre>
</div>
</div>
<p data-start="1145" data-end="1163">&#x1f449; Thêm attribute:</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">(* ram_style = "block" *) reg  mem ;
</pre>
</div>
</div>
<hr data-start="1230" data-end="1233" />
<h2 data-start="1235" data-end="1284">3. Nguyên tắc #2: FSM gọn – giảm số trạng thái</h2>
<p data-start="1286" data-end="1343">FSM là “kẻ ngốn tài nguyên thầm lặng” nếu viết không gọn.</p>
<h3 data-start="1345" data-end="1363">Mẹo tối ưu FSM</h3>
<ul data-start="1364" data-end="1522">
<li data-start="1364" data-end="1404">
<p data-start="1366" data-end="1404">Tránh FSM quá chi tiết không cần thiết</p>
</li>
<li data-start="1405" data-end="1443">
<p data-start="1407" data-end="1443">Gộp trạng thái có hành vi giống nhau</p>
</li>
<li data-start="1444" data-end="1495">
<p data-start="1446" data-end="1495">Dùng <strong data-start="1451" data-end="1464">Moore FSM</strong> khi không cần phản hồi tức thì</p>
</li>
<li data-start="1496" data-end="1522">
<p data-start="1498" data-end="1522">Mã hóa trạng thái hợp lý</p>
</li>
</ul>
<p data-start="1524" data-end="1530">Ví dụ:</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">typedef enum logic  {
  IDLE,
  RUN,
  DONE
} state_t;
</pre>
</div>
</div>
<p data-start="1606" data-end="1645">&#x1f449; FSM ít trạng thái → ít FF + LUT hơn.</p>
<hr data-start="1647" data-end="1650" />
<h2 data-start="1652" data-end="1714">4. Nguyên tắc #3: Dùng <code data-start="1678" data-end="1692">clock enable</code> thay vì tạo clock mới</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://anysilicon.com/wp-content/uploads/2021/02/Clock-gating-with-global-enable-signal.png" alt="https://anysilicon.com/wp-content/uploads/2021/02/Clock-gating-with-global-enable-signal.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.embedded.com/wp-content/uploads/sites/2/media-1075105-0303feat2fig1.gif" alt="https://www.embedded.com/wp-content/uploads/sites/2/media-1075105-0303feat2fig1.gif" /></div>
</div>
</div>
<h3 data-start="1758" data-end="1773">&#x274c; Không nên</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">always @(posedge clk_div) begin
  ...
end
</pre>
</div>
</div>
<h3 data-start="1832" data-end="1841">&#x2705; Nên</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">always @(posedge clk) begin
  if (ce) begin
    ...
  end
end
</pre>
</div>
</div>
<p data-start="1920" data-end="1928">Lợi ích:</p>
<ul data-start="1929" data-end="1998">
<li data-start="1929" data-end="1949">
<p data-start="1931" data-end="1949">Giảm routing clock</p>
</li>
<li data-start="1950" data-end="1969">
<p data-start="1952" data-end="1969">Dễ timing closure</p>
</li>
<li data-start="1970" data-end="1998">
<p data-start="1972" data-end="1998">Ít tài nguyên clock buffer</p>
</li>
</ul>
<hr data-start="2000" data-end="2003" />
<h2 data-start="2005" data-end="2061">5. Nguyên tắc #4: Chọn độ rộng bit (bit-width) vừa đủ</h2>
<h3 data-start="2063" data-end="2077">&#x274c; Lãng phí</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><span>reg  counter; // chỉ đếm tới 100
</span></code></div>
</div>
<h3 data-start="2133" data-end="2145">&#x2705; Tối ưu</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><span>reg  counter; // đủ đếm tới 127
</span></code></div>
</div>
<p data-start="2199" data-end="2229">&#x1f449; Mỗi bit dư = thêm FF + LUT.</p>
<hr data-start="2231" data-end="2234" />
<h2 data-start="2236" data-end="2294">6. Nguyên tắc #5: Tận dụng DSP slice cho phép nhân/cộng</h2>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://images.openai.com/static-rsc-1/lUXM24BQWarBMgFD8NUtHtPZZtHTHcUjcc9lHsKcL1LfhGn-mlYhowu_Xy9n9qdcK934w3uRWioabOjQRz9pSjzlEvmIEeS9fyr4jty5KOancCgy2MTQ8YM-S9pA_SSYXWUjZWV1UfTRLoyIsVl2EQ" alt="https://www.researchgate.net/publication/360188046/figure/fig4/AS%3A1149023289393205%401650959908705/Schematic-of-the-DSP-SLICE-available-in-the-Xilinx-7-series-FPGAs-Xil18a.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://la.mathworks.com/help/examples/hdlcoder/win64/xxxilinx_fpga_dsp_arch_guideline.png" alt="https://la.mathworks.com/help/examples/hdlcoder/win64/xxxilinx_fpga_dsp_arch_guideline.png" /></div>
</div>
</div>
<h3 data-start="2338" data-end="2347">Ví dụ</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><span>assign y = a * b;
</span></code></div>
</div>
<ul data-start="2381" data-end="2467">
<li data-start="2381" data-end="2429">
<p data-start="2383" data-end="2429">Nếu bit-width phù hợp → tool tự suy ra <strong data-start="2422" data-end="2429">DSP</strong></p>
</li>
<li data-start="2430" data-end="2467">
<p data-start="2432" data-end="2467">Nếu không → nhân bằng LUT (rất tốn)</p>
</li>
</ul>
<p data-start="2469" data-end="2514">&#x1f449; Kiểm tra <strong data-start="2481" data-end="2513">Synthesis Report → DSP usage</strong>.</p>
<hr data-start="2516" data-end="2519" />
<h2 data-start="2521" data-end="2585">7. Nguyên tắc #6: Pipeline để tăng Fmax (và đôi khi giảm LUT)</h2>
<p data-start="2587" data-end="2601">Pipeline giúp:</p>
<ul data-start="2602" data-end="2682">
<li data-start="2602" data-end="2625">
<p data-start="2604" data-end="2625">Giảm logic mỗi chu kỳ</p>
</li>
<li data-start="2626" data-end="2641">
<p data-start="2628" data-end="2641">Dễ đạt timing</p>
</li>
<li data-start="2642" data-end="2682">
<p data-start="2644" data-end="2682">Có thể giảm LUT do tool tối ưu tốt hơn</p>
</li>
</ul>
<p data-start="2684" data-end="2690">Ví dụ:</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">always @(posedge clk) begin
  stage1 &lt;= a + b;
  stage2 &lt;= stage1 * c;
end
</pre>
</div>
</div>
<hr data-start="2782" data-end="2785" />
<h2 data-start="2787" data-end="2850">8. Nguyên tắc #7: Tránh logic “không dùng nhưng vẫn tồn tại”</h2>
<ul data-start="2852" data-end="2918">
<li data-start="2852" data-end="2894">
<p data-start="2854" data-end="2894">Tín hiệu không dùng → vẫn có thể tốn LUT</p>
</li>
<li data-start="2895" data-end="2918">
<p data-start="2897" data-end="2918">Debug signal quên xóa</p>
</li>
</ul>
<p data-start="2920" data-end="2928">&#x1f449; Dùng:</p>
<ul data-start="2929" data-end="2994">
<li data-start="2929" data-end="2953">
<p data-start="2931" data-end="2953"><code data-start="2931" data-end="2953">(* keep = "false" *)</code></p>
</li>
<li data-start="2954" data-end="2994">
<p data-start="2956" data-end="2994">Kiểm tra <strong data-start="2965" data-end="2981">Unused logic</strong> trong report</p>
</li>
</ul>
<hr data-start="2996" data-end="2999" />
<h2 data-start="3001" data-end="3048">9. Quy trình tối ưu thực tế (rất quan trọng)</h2>
<ol data-start="3050" data-end="3213">
<li data-start="3050" data-end="3090">
<p data-start="3053" data-end="3090"><strong data-start="3053" data-end="3090">Viết code rõ ràng, đúng chức năng</strong></p>
</li>
<li data-start="3091" data-end="3111">
<p data-start="3094" data-end="3111"><strong data-start="3094" data-end="3111">Run Synthesis</strong></p>
</li>
<li data-start="3112" data-end="3165">
<p data-start="3115" data-end="3119">Xem:</p>
<ul data-start="3123" data-end="3165">
<li data-start="3123" data-end="3146">
<p data-start="3125" data-end="3146">LUT / FF / BRAM / DSP</p>
</li>
<li data-start="3150" data-end="3165">
<p data-start="3152" data-end="3165">Critical path</p>
</li>
</ul>
</li>
<li data-start="3166" data-end="3202">
<p data-start="3169" data-end="3202">Tối ưu chỗ <strong data-start="3180" data-end="3202">ăn tài nguyên nhất</strong></p>
</li>
<li data-start="3203" data-end="3213">
<p data-start="3206" data-end="3213">Lặp lại</p>
</li>
</ol>
<p data-start="3215" data-end="3255">&#x2757; Đừng tối ưu “mù” trước khi xem report.</p>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/lam-sao-de-toi-uu-hoa-tai-nguyen-khi-thiet-ke-fpga-bang-hdl/</guid>
                    </item>
				                    <item>
                        <title>Làm sao để mô phỏng và synthesise một module verilog</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/lam-sao-de-mo-phong-va-synthesise-mot-module-verilog/</link>
                        <pubDate>Wed, 24 Dec 2025 09:20:08 +0000</pubDate>
                        <description><![CDATA[1) Mô phỏng Verilog là gì?
Mô phỏng = chạy module bằng testbench trên PC để kiểm tra đúng/sai trước khi nạp FPGA.Bạn sẽ xem waveform (dạng sóng), kiểm tra reset, timing, trạng thái…
Cần gì...]]></description>
                        <content:encoded><![CDATA[<h1 data-start="226" data-end="254">1) Mô phỏng Verilog là gì?</h1>
<p data-start="255" data-end="424"><strong data-start="255" data-end="267">Mô phỏng</strong> = chạy module bằng <strong data-start="287" data-end="300">testbench</strong> trên PC để kiểm tra đúng/sai trước khi nạp FPGA.<br data-start="349" data-end="352" />Bạn sẽ xem <strong data-start="363" data-end="375">waveform</strong> (dạng sóng), kiểm tra reset, timing, trạng thái…</p>
<h2 data-start="426" data-end="448">Cần gì để mô phỏng?</h2>
<ul data-start="449" data-end="556">
<li data-start="449" data-end="488">
<p data-start="451" data-end="488">File RTL: <code data-start="461" data-end="468">dut.v</code> (design under test)</p>
</li>
<li data-start="489" data-end="556">
<p data-start="491" data-end="556">File testbench: <code data-start="507" data-end="513">tb.v</code> (tạo clock/reset/input và quan sát output)</p>
</li>
</ul>
<h3 data-start="558" data-end="586">Ví dụ testbench tối giản</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">`timescale 1ns/1ps

module tb;
  reg  clk = 0;
  reg  rst_n = 0;
  wire out;

  // tạo clock 100MHz =&gt; chu kỳ 10ns
  always #5 clk = ~clk;

  // gọi module cần test
  my_module dut (
    .clk   (clk),
    .rst_n (rst_n),
    .out   (out)
  );

  initial begin
    // reset
    #20 rst_n = 1;

    // chạy một lúc
    #500;
    $finish;
  end
endmodule
</pre>
</div>
</div>
<p data-start="955" data-end="968">&#x2705; Tips nhanh:</p>
<ul data-start="969" data-end="1069">
<li data-start="969" data-end="990">
<p data-start="971" data-end="990">Luôn có <code data-start="979" data-end="990">timescale</code></p>
</li>
<li data-start="991" data-end="1021">
<p data-start="993" data-end="1021">Clock tạo bằng <code data-start="1008" data-end="1021">always #...</code></p>
</li>
<li data-start="1022" data-end="1069">
<p data-start="1024" data-end="1069">Reset rõ ràng (đặc biệt cho sequential logic)</p>
</li>
</ul>
<hr data-start="1071" data-end="1074" />
<h1 data-start="1076" data-end="1109">2) Synthesise (tổng hợp) là gì?</h1>
<p data-start="1110" data-end="1206"><strong data-start="1110" data-end="1123">Synthesis</strong> = chuyển Verilog RTL thành <strong data-start="1151" data-end="1192">netlist cổng logic + FF + LUT + BRAM…</strong> phù hợp FPGA.</p>
<p data-start="1208" data-end="1291">Synthesis không “chạy thời gian” như simulation. Nó biến code thành phần cứng thật.</p>
<h2 data-start="1293" data-end="1321">Code nào synthesize được?</h2>
<p data-start="1322" data-end="1437">&#x2705; <code data-start="1324" data-end="1347">always @(posedge clk)</code> (FF/Registers)<br data-start="1362" data-end="1365" />&#x2705; <code data-start="1367" data-end="1380">always @(*)</code> + gán đầy đủ (combinational)<br data-start="1409" data-end="1412" />&#x2705; <code data-start="1414" data-end="1422">assign</code> (logic tổ hợp)</p>
<p data-start="1439" data-end="1603">&#x274c; <code data-start="1441" data-end="1449">#delay</code>, <code data-start="1451" data-end="1460">initial</code> (thường chỉ dùng cho simulation, trừ vài FPGA hỗ trợ init FF nhưng không nên dựa vào)<br data-start="1546" data-end="1549" />&#x274c; <code data-start="1551" data-end="1561">$display</code>, <code data-start="1563" data-end="1572">$finish</code> (system task chỉ cho mô phỏng)</p>
<hr data-start="1605" data-end="1608" />
<h1 data-start="1610" data-end="1668">3) Quy trình mô phỏng và synthesize trong Vivado (chuẩn)</h1>
<h2 data-start="1669" data-end="1702">A. Mô phỏng (Vivado Simulator)</h2>
<ol data-start="1703" data-end="1959">
<li data-start="1703" data-end="1724">
<p data-start="1706" data-end="1724"><strong data-start="1706" data-end="1724">Create Project</strong></p>
</li>
<li data-start="1725" data-end="1769">
<p data-start="1728" data-end="1769">Add Sources → thêm <code data-start="1747" data-end="1752">*.v</code> (Design Sources)</p>
</li>
<li data-start="1770" data-end="1811">
<p data-start="1773" data-end="1811">Add Simulation Sources → thêm <code data-start="1803" data-end="1811">tb_*.v</code></p>
</li>
<li data-start="1812" data-end="1878">
<p data-start="1815" data-end="1878">Flow Navigator → <strong data-start="1832" data-end="1878">Run Simulation → Run Behavioral Simulation</strong></p>
</li>
<li data-start="1879" data-end="1959">
<p data-start="1882" data-end="1895">Xem waveform:</p>
<ul data-start="1899" data-end="1959">
<li data-start="1899" data-end="1933">
<p data-start="1901" data-end="1933">Add signals (hoặc “Add to Wave”)</p>
</li>
<li data-start="1937" data-end="1959">
<p data-start="1939" data-end="1959">Run / Restart / Zoom</p>
</li>
</ul>
</li>
</ol>
<p data-start="1961" data-end="2032">&#x2705; Behavioral simulation: kiểm tra logic cơ bản (chưa có delay routing).</p>
<h2 data-start="2034" data-end="2060">B. Tổng hợp + Implement</h2>
<ol data-start="2061" data-end="2214">
<li data-start="2061" data-end="2098">
<p data-start="2064" data-end="2098">Flow Navigator → <strong data-start="2081" data-end="2098">Run Synthesis</strong></p>
</li>
<li data-start="2099" data-end="2162">
<p data-start="2102" data-end="2106">Xem:</p>
<ul data-start="2110" data-end="2162">
<li data-start="2110" data-end="2137">
<p data-start="2112" data-end="2137">Utilization (LUT/FF/BRAM)</p>
</li>
<li data-start="2141" data-end="2162">
<p data-start="2143" data-end="2162">Schematic (netlist)</p>
</li>
</ul>
</li>
<li data-start="2163" data-end="2188">
<p data-start="2166" data-end="2188"><strong data-start="2166" data-end="2188">Run Implementation</strong></p>
</li>
<li data-start="2189" data-end="2214">
<p data-start="2192" data-end="2214"><strong data-start="2192" data-end="2214">Generate Bitstream</strong></p>
</li>
</ol>
<p data-start="2216" data-end="2263">Nếu bạn dùng board (PYNQ-Z2) thì còn bước thêm:</p>
<ul data-start="2264" data-end="2320">
<li data-start="2264" data-end="2320">
<p data-start="2266" data-end="2320">Constraints file <code data-start="2283" data-end="2289">.xdc</code> (gán chân LED, clock, button…)</p>
</li>
</ul>
<hr data-start="2322" data-end="2325" />
<h1 data-start="2327" data-end="2370">4) “Checklist” lỗi hay gặp khi synthesize</h1>
<h3 data-start="2371" data-end="2397">(1) Latch ngoài ý muốn</h3>
<p data-start="2398" data-end="2465">Nguyên nhân: <code data-start="2411" data-end="2424">always @(*)</code> nhưng <strong data-start="2431" data-end="2453">không gán đủ nhánh</strong>.<br />Ví dụ sai:</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">always @(*) begin
  if (en) y = a;  // thiếu else =&gt; latch
end
</pre>
</div>
</div>
<p data-start="2544" data-end="2554">Cách đúng:</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">always @(*) begin
  y = b;          // default
  if (en) y = a;
end
</pre>
</div>
</div>
<h3 data-start="2639" data-end="2668">(2) Reset không đúng kiểu</h3>
<ul data-start="2669" data-end="2771">
<li data-start="2669" data-end="2722">
<p data-start="2671" data-end="2722">Nếu bạn dùng reset đồng bộ: đặt trong <code data-start="2709" data-end="2722">posedge clk</code></p>
</li>
<li data-start="2723" data-end="2771">
<p data-start="2725" data-end="2771">Nếu reset bất đồng bộ: dùng <code data-start="2753" data-end="2771">or negedge rst_n</code></p>
</li>
</ul>
<p data-start="2773" data-end="2797">Ví dụ reset bất đồng bộ:</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<pre contenteditable="false">always @(posedge clk or negedge rst_n) begin
  if (!rst_n) q &lt;= 0;
  else        q &lt;= d;
end
</pre>
</div>
</div>
<h3 data-start="2907" data-end="2947">(3) Dùng “clock chia” làm clock thật</h3>
<p data-start="2948" data-end="3078">Trên FPGA, tốt nhất dùng <strong data-start="2973" data-end="2989">clock enable</strong> hoặc <strong data-start="2995" data-end="3007">MMCM/PLL</strong>, tránh tự tạo clock bằng logic (trừ khi bạn hiểu rõ clocking/routing).</p>
<hr data-start="3080" data-end="3083" />
<h1 data-start="3085" data-end="3132">5) Mẹo nhanh để mô phỏng đúng “như phần cứng”</h1>
<ul data-start="3133" data-end="3370">
<li data-start="3133" data-end="3222">
<p data-start="3135" data-end="3222">Đảm bảo reset/khởi tạo rõ ràng (FF trong FPGA không phải lúc nào cũng giống “initial”).</p>
</li>
<li data-start="3223" data-end="3281">
<p data-start="3225" data-end="3281">Với input từ nút nhấn: mô phỏng cả <strong data-start="3260" data-end="3272">debounce</strong> nếu cần.</p>
</li>
<li data-start="3282" data-end="3370">
<p data-start="3284" data-end="3370">Khi cần sát thực tế timing: chạy <strong data-start="3317" data-end="3358">Post-Implementation Timing Simulation</strong> (nâng cao).</p>
</li>
</ul>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/lam-sao-de-mo-phong-va-synthesise-mot-module-verilog/</guid>
                    </item>
				                    <item>
                        <title>viết đoạn code verilog de tao bo chia tan frequency divider</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/viet-doan-code-verilog-de-tao-bo-chia-tan-frequency-divider/</link>
                        <pubDate>Wed, 24 Dec 2025 09:15:27 +0000</pubDate>
                        <description><![CDATA[1) Frequency divider /2, /4, /8… (chuẩn 50% duty, N = 2^k)
Cách đơn giản nhất: dùng bit của counter.



 



module freq_div_pow2 #(
    parameter integer K = 1   // chia cho 2^K
...]]></description>
                        <content:encoded><![CDATA[<h2 data-start="245" data-end="306">1) Frequency divider /2, /4, /8… (chuẩn 50% duty, N = 2^k)</h2>
<p data-start="307" data-end="352">Cách đơn giản nhất: dùng <strong data-start="332" data-end="351">bit của counter</strong>.</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><code class="whitespace-pre! language-verilog"><span></span></code></code>
<pre contenteditable="false">module freq_div_pow2 #(
    parameter integer K = 1   // chia cho 2^K
)(
    input  wire clk,
    input  wire rst_n,
    output wire clk_div
);

    reg  cnt;

    always @(posedge clk) begin
        if (!rst_n)
            cnt &lt;= 32'd0;
        else
            cnt &lt;= cnt + 32'd1;
    end

    assign clk_div = cnt; // K=1 =&gt; /2, K=2 =&gt; /4, K=3 =&gt; /8 ...

endmodule
</pre>
</div>
</div>
<hr data-start="749" data-end="752" />
<h2 data-start="754" data-end="813">2) Divider chia <strong data-start="773" data-end="783">N chẵn</strong> (clk_out 50% duty, chính xác)</h2>
<p data-start="814" data-end="898">Ý tưởng: đếm đến <strong data-start="831" data-end="842">N/2 - 1</strong> rồi <strong data-start="847" data-end="857">toggle</strong> output → chu kỳ output = N chu kỳ input.</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><code class="whitespace-pre! language-verilog"><span></span></code></code>
<pre contenteditable="false">module freq_div_even #(
    parameter integer N = 10   // N phải là số chẵn: 2,4,6,...
)(
    input  wire clk,
    input  wire rst_n,
    output reg  clk_out
);
    localparam integer HALF = N/2;

    // đủ rộng để đếm tới HALF-1
    reg  cnt;

    initial clk_out = 1'b0;

    always @(posedge clk) begin
        if (!rst_n) begin
            cnt     &lt;= 0;
            clk_out &lt;= 1'b0;
        end else begin
            if (cnt == HALF-1) begin
                cnt     &lt;= 0;
                clk_out &lt;= ~clk_out;
            end else begin
                cnt &lt;= cnt + 1'b1;
            end
        end
    end

endmodule
</pre>
</div>
</div>
<p data-start="1557" data-end="1606">Ví dụ: <code data-start="1564" data-end="1570">N=10</code> → clk_out = clk_in / 10 (duty 50%).</p>
<hr data-start="1608" data-end="1611" />
<h2 data-start="1613" data-end="1675">3) Divider chia <strong data-start="1632" data-end="1644">N bất kỳ</strong> (dễ dùng, N lẻ duty không 50%)</h2>
<p data-start="1676" data-end="1844">Cách này tạo 1 xung “tick” khi đếm đủ N, hoặc tạo clock bằng toggle mỗi N chu kỳ (khi đó output sẽ là / (2N)). Mình đưa bản <strong data-start="1800" data-end="1823">toggle mỗi N chu kỳ</strong> (đơn giản, ổn định):</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-verilog"><code class="whitespace-pre! language-verilog"><span></span></code></code>
<pre contenteditable="false">module freq_div_any #(
    parameter integer N = 5   // N &gt;= 1
)(
    input  wire clk,
    input  wire rst_n,
    output reg  clk_out
);

    reg  cnt;

    initial clk_out = 1'b0;

    always @(posedge clk) begin
        if (!rst_n) begin
            cnt     &lt;= 0;
            clk_out &lt;= 1'b0;
        end else begin
            if (cnt == N-1) begin
                cnt     &lt;= 0;
                clk_out &lt;= ~clk_out;  // toggle mỗi N chu kỳ
            end else begin
                cnt &lt;= cnt + 1'b1;
            end
        end
    end

endmodule
</pre>
</div>
</div>
<p data-start="2429" data-end="2494">&#x2705; Tần số đầu ra: <code data-start="2446" data-end="2468">f_out = f_in / (2*N)</code><br data-start="2468" data-end="2471" />Ví dụ <code data-start="2477" data-end="2482">N=5</code> → ra <code data-start="2488" data-end="2493">/10</code>.</p>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/viet-doan-code-verilog-de-tao-bo-chia-tan-frequency-divider/</guid>
                    </item>
				                    <item>
                        <title>Sự khác nhau giữa mạch tổ hợp và mạch tuần tự là gì?</title>
                        <link>https://dientu.vn/community/thiet-ke-so-verilog-vhdl/su-khac-nhau-giua-mach-to-hop-va-mach-tuan-tu-la-gi/</link>
                        <pubDate>Wed, 24 Dec 2025 09:12:34 +0000</pubDate>
                        <description><![CDATA[Trong kỹ thuật số, FPGA và vi điều khiển, hai khái niệm nền tảng mà sinh viên và kỹ sư bắt buộc phải nắm vững là mạch tổ hợp (Combinational Circuit) và mạch tuần tự (Sequential Circuit).
Bà...]]></description>
                        <content:encoded><![CDATA[<p data-start="64" data-end="270">Trong <strong data-start="70" data-end="85">kỹ thuật số</strong>, <strong data-start="87" data-end="95">FPGA</strong> và <strong data-start="99" data-end="116">vi điều khiển</strong>, hai khái niệm nền tảng mà sinh viên và kỹ sư bắt buộc phải nắm vững là <strong data-start="189" data-end="228">mạch tổ hợp (Combinational Circuit)</strong> và <strong data-start="232" data-end="269">mạch tuần tự (Sequential Circuit)</strong>.</p>
<p data-start="272" data-end="297">Bài viết này sẽ giúp bạn:</p>
<ul data-start="298" data-end="477">
<li data-start="298" data-end="329">
<p data-start="300" data-end="329">Hiểu rõ <strong data-start="308" data-end="329">mạch tổ hợp là gì</strong></p>
</li>
<li data-start="330" data-end="362">
<p data-start="332" data-end="362">Hiểu rõ <strong data-start="340" data-end="362">mạch tuần tự là gì</strong></p>
</li>
<li data-start="363" data-end="413">
<p data-start="365" data-end="413">So sánh chi tiết <strong data-start="382" data-end="413">mạch tổ hợp vs mạch tuần tự</strong></p>
</li>
<li data-start="414" data-end="477">
<p data-start="416" data-end="477">Biết cách áp dụng đúng khi thiết kế <strong data-start="452" data-end="477">FPGA / Verilog / VHDL</strong></p>
</li>
</ul>
<hr data-start="479" data-end="482" />
<h2 data-start="484" data-end="529">Mạch tổ hợp là gì? (Combinational Circuit)</h2>
<h3 data-start="531" data-end="544">Khái niệm</h3>
<p data-start="545" data-end="651"><strong data-start="545" data-end="560">Mạch tổ hợp</strong> là mạch mà <strong data-start="572" data-end="617">đầu ra chỉ phụ thuộc vào đầu vào hiện tại</strong>, <strong data-start="619" data-end="650">không phụ thuộc vào quá khứ</strong>.</p>
<p data-start="653" data-end="686">&#x1f449; Không có khả năng nhớ dữ liệu.</p>
<h3 data-start="688" data-end="711">Công thức tổng quát</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre!"><span><span class="hljs-attr">Output</span> = f(Input)
</span></code></div>
</div>
<h3 data-start="739" data-end="760">Ví dụ mạch tổ hợp</h3>
<ul data-start="761" data-end="897">
<li data-start="761" data-end="791">
<p data-start="763" data-end="791">Cổng logic AND, OR, NOT, XOR</p>
</li>
<li data-start="792" data-end="809">
<p data-start="794" data-end="809">Bộ cộng (Adder)</p>
</li>
<li data-start="810" data-end="831">
<p data-start="812" data-end="831">Bộ trừ (Subtractor)</p>
</li>
<li data-start="832" data-end="851">
<p data-start="834" data-end="851">Multiplexer (MUX)</p>
</li>
<li data-start="852" data-end="871">
<p data-start="854" data-end="871">Decoder / Encoder</p>
</li>
<li data-start="872" data-end="897">
<p data-start="874" data-end="897">So sánh số (Comparator)</p>
</li>
</ul>
<h3 data-start="899" data-end="923">Minh họa mạch tổ hợp</h3>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.tutorialspoint.com/digital-electronics/images/block-diagram-combinational-circuit.jpg" alt="https://www.tutorialspoint.com/digital-electronics/images/block-diagram-combinational-circuit.jpg" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://www.electronics-tutorials.ws/wp-content/uploads/2018/05/combination-comb25.gif" alt="https://www.electronics-tutorials.ws/wp-content/uploads/2018/05/combination-comb25.gif" /></div>
</div>
</div>
<h3 data-start="966" data-end="978">Đặc điểm</h3>
<ul data-start="979" data-end="1096">
<li data-start="979" data-end="998">
<p data-start="981" data-end="998">&#x274c; Không có bộ nhớ</p>
</li>
<li data-start="999" data-end="1018">
<p data-start="1001" data-end="1018">&#x274c; Không cần clock</p>
</li>
<li data-start="1019" data-end="1074">
<p data-start="1021" data-end="1074">&#x2705; Output thay đổi <strong data-start="1039" data-end="1055">ngay lập tức</strong> khi input thay đổi</p>
</li>
<li data-start="1075" data-end="1096">
<p data-start="1077" data-end="1096">&#x2705; Thiết kế đơn giản</p>
</li>
</ul>
<hr data-start="1098" data-end="1101" />
<h2 data-start="1103" data-end="1146">Mạch tuần tự là gì? (Sequential Circuit)</h2>
<h3 data-start="1148" data-end="1161">Khái niệm</h3>
<p data-start="1162" data-end="1215"><strong data-start="1162" data-end="1178">Mạch tuần tự</strong> là mạch mà <strong data-start="1190" data-end="1215">đầu ra phụ thuộc vào:</strong></p>
<ul data-start="1216" data-end="1290">
<li data-start="1216" data-end="1234">
<p data-start="1218" data-end="1234">Đầu vào hiện tại</p>
</li>
<li data-start="1235" data-end="1290">
<p data-start="1237" data-end="1290"><strong data-start="1237" data-end="1260">Trạng thái trước đó</strong> (dữ liệu đã lưu trong bộ nhớ)</p>
</li>
</ul>
<p data-start="1292" data-end="1332">&#x1f449; Mạch tuần tự <strong data-start="1308" data-end="1331">có khả năng ghi nhớ</strong>.</p>
<h3 data-start="1334" data-end="1357">Công thức tổng quát</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<div class="sticky top- @w-xl/main:top-9">
<div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"> </div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre!"><span><span class="hljs-attr">Output</span> = f(Input, State)
<span class="hljs-attr">State_next</span> = f(Input, State)
</span></code></div>
</div>
<h3 data-start="1421" data-end="1443">Ví dụ mạch tuần tự</h3>
<ul data-start="1444" data-end="1557">
<li data-start="1444" data-end="1466">
<p data-start="1446" data-end="1466">Flip-Flop (D, JK, T)</p>
</li>
<li data-start="1467" data-end="1489">
<p data-start="1469" data-end="1489">Thanh ghi (Register)</p>
</li>
<li data-start="1490" data-end="1508">
<p data-start="1492" data-end="1508">Bộ đếm (Counter)</p>
</li>
<li data-start="1509" data-end="1537">
<p data-start="1511" data-end="1537">FSM (Finite State Machine)</p>
</li>
<li data-start="1538" data-end="1557">
<p data-start="1540" data-end="1557">Bộ nhớ RAM / FIFO</p>
</li>
</ul>
<h3 data-start="1559" data-end="1584">Minh họa mạch tuần tự</h3>
<div class="no-scrollbar flex min-h-36 flex-nowrap gap-0.5 overflow-auto sm:gap-1 sm:overflow-hidden xl:min-h-44 mt-1 mb-5 :mt-4">
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-s-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://media.geeksforgeeks.org/wp-content/uploads/1111-1.png" alt="https://media.geeksforgeeks.org/wp-content/uploads/1111-1.png" /></div>
</div>
<div class="border-token-border-default relative w-32 shrink-0 overflow-hidden rounded-xl border- md:shrink max-h-64 sm:w- rounded-e-xl">
<div><img class="bg-token-main-surface-tertiary absolute inset-0 m-0 h-full w-full object-cover" src="https://media.geeksforgeeks.org/wp-content/uploads/FlipFlop1.png" alt="https://media.geeksforgeeks.org/wp-content/uploads/FlipFlop1.png" /></div>
</div>
</div>
<h3 data-start="1627" data-end="1639">Đặc điểm</h3>
<ul data-start="1640" data-end="1748">
<li data-start="1640" data-end="1661">
<p data-start="1642" data-end="1661">&#x2705; Có bộ nhớ (state)</p>
</li>
<li data-start="1662" data-end="1690">
<p data-start="1664" data-end="1690">&#x2705; Hoạt động theo <strong data-start="1681" data-end="1690">clock</strong></p>
</li>
<li data-start="1691" data-end="1716">
<p data-start="1693" data-end="1716">&#x274c; Thiết kế phức tạp hơn</p>
</li>
<li data-start="1717" data-end="1748">
<p data-start="1719" data-end="1748">&#x274c; Có độ trễ theo chu kỳ clock</p>
</li>
</ul>
<hr data-start="1750" data-end="1753" />
<h2 data-start="1755" data-end="1793">So sánh mạch tổ hợp và mạch tuần tự</h2>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" data-start="1795" data-end="2194">
<thead data-start="1795" data-end="1844">
<tr data-start="1795" data-end="1844">
<th data-start="1795" data-end="1806" data-col-size="sm">Tiêu chí</th>
<th data-start="1806" data-end="1824" data-col-size="sm"><strong data-start="1808" data-end="1823">Mạch tổ hợp</strong></th>
<th data-start="1824" data-end="1844" data-col-size="sm"><strong data-start="1826" data-end="1842">Mạch tuần tự</strong></th>
</tr>
</thead>
<tbody data-start="1892" data-end="2194">
<tr data-start="1892" data-end="1958">
<td data-start="1892" data-end="1912" data-col-size="sm">Phụ thuộc đầu vào</td>
<td data-start="1912" data-end="1933" data-col-size="sm">Chỉ input hiện tại</td>
<td data-start="1933" data-end="1958" data-col-size="sm">Input + trạng thái cũ</td>
</tr>
<tr data-start="1959" data-end="2007">
<td data-start="1959" data-end="1968" data-col-size="sm">Bộ nhớ</td>
<td data-start="1968" data-end="1979" data-col-size="sm">Không có</td>
<td data-start="1979" data-end="2007" data-col-size="sm">Có (Flip-Flop, Register)</td>
</tr>
<tr data-start="2008" data-end="2040">
<td data-start="2008" data-end="2016" data-col-size="sm">Clock</td>
<td data-start="2016" data-end="2028" data-col-size="sm">Không cần</td>
<td data-start="2028" data-end="2040" data-col-size="sm">Bắt buộc</td>
</tr>
<tr data-start="2041" data-end="2073">
<td data-start="2041" data-end="2064" data-col-size="sm">Khả năng lưu dữ liệu</td>
<td data-col-size="sm" data-start="2064" data-end="2068">&#x274c;</td>
<td data-col-size="sm" data-start="2068" data-end="2073">&#x2705;</td>
</tr>
<tr data-start="2074" data-end="2123">
<td data-start="2074" data-end="2083" data-col-size="sm">Độ trễ</td>
<td data-col-size="sm" data-start="2083" data-end="2102">Theo delay logic</td>
<td data-col-size="sm" data-start="2102" data-end="2123">Theo chu kỳ clock</td>
</tr>
<tr data-start="2124" data-end="2156">
<td data-start="2124" data-end="2138" data-col-size="sm">Độ phức tạp</td>
<td data-col-size="sm" data-start="2138" data-end="2145">Thấp</td>
<td data-col-size="sm" data-start="2145" data-end="2156">Cao hơn</td>
</tr>
<tr data-start="2157" data-end="2194">
<td data-start="2157" data-end="2165" data-col-size="sm">Ví dụ</td>
<td data-col-size="sm" data-start="2165" data-end="2178">Adder, MUX</td>
<td data-col-size="sm" data-start="2178" data-end="2194">Counter, FSM</td>
</tr>
</tbody>
</table>
</div>
</div>
<hr data-start="2196" data-end="2199" />
<h2 data-start="2201" data-end="2226">Ví dụ minh họa dễ hiểu</h2>
<h3 data-start="2228" data-end="2249">Ví dụ mạch tổ hợp</h3>
<p data-start="2250" data-end="2273">&#x1f449; <strong data-start="2253" data-end="2273">Cộng 2 số A và B</strong></p>
<ul data-start="2274" data-end="2365">
<li data-start="2274" data-end="2301">
<p data-start="2276" data-end="2301">A = 3, B = 2 → Output = 5</p>
</li>
<li data-start="2302" data-end="2342">
<p data-start="2304" data-end="2342">Chỉ cần A hoặc B đổi → Output đổi ngay</p>
</li>
<li data-start="2343" data-end="2365">
<p data-start="2345" data-end="2365">Không nhớ giá trị cũ</p>
</li>
</ul>
<h3 data-start="2367" data-end="2389">Ví dụ mạch tuần tự</h3>
<p data-start="2390" data-end="2403">&#x1f449; <strong data-start="2393" data-end="2403">Bộ đếm</strong></p>
<ul data-start="2404" data-end="2493">
<li data-start="2404" data-end="2429">
<p data-start="2406" data-end="2429">Mỗi xung clock → tăng 1</p>
</li>
<li data-start="2430" data-end="2475">
<p data-start="2432" data-end="2475">Giá trị hiện tại phụ thuộc giá trị trước đó</p>
</li>
<li data-start="2476" data-end="2493">
<p data-start="2478" data-end="2493">Có khả năng nhớ</p>
</li>
</ul>
<hr data-start="2495" data-end="2498" />
<h2 data-start="2500" data-end="2555">Trong FPGA, hai loại mạch này được dùng như thế nào?</h2>
<h3 data-start="2557" data-end="2583">Mạch tổ hợp trong FPGA</h3>
<ul data-start="2584" data-end="2655">
<li data-start="2584" data-end="2597">
<p data-start="2586" data-end="2597">Logic xử lý</p>
</li>
<li data-start="2598" data-end="2617">
<p data-start="2600" data-end="2617">Điều kiện IF–ELSE</p>
</li>
<li data-start="2618" data-end="2644">
<p data-start="2620" data-end="2644">So sánh, mã hóa, giải mã</p>
</li>
<li data-start="2645" data-end="2655">
<p data-start="2647" data-end="2655">Datapath</p>
</li>
</ul>
<h3 data-start="2657" data-end="2684">Mạch tuần tự trong FPGA</h3>
<ul data-start="2685" data-end="2767">
<li data-start="2685" data-end="2701">
<p data-start="2687" data-end="2701">FSM điều khiển</p>
</li>
<li data-start="2702" data-end="2721">
<p data-start="2704" data-end="2721">Thanh ghi dữ liệu</p>
</li>
<li data-start="2722" data-end="2740">
<p data-start="2724" data-end="2740">Bộ đếm thời gian</p>
</li>
<li data-start="2741" data-end="2767">
<p data-start="2743" data-end="2767">Giao thức UART, SPI, I2C</p>
</li>
</ul>
<p data-start="2769" data-end="2834">&#x1f449; <strong data-start="2772" data-end="2834">Thiết kế FPGA thực tế = kết hợp mạch tổ hợp + mạch tuần tự</strong></p>
<hr data-start="2836" data-end="2839" />
<h2 data-start="2841" data-end="2882">Liên hệ với FSM (Finite State Machine)</h2>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse">
<table class="w-fit min-w-(--thread-content-width)" data-start="2884" data-end="3052">
<thead data-start="2884" data-end="2914">
<tr data-start="2884" data-end="2914">
<th data-start="2884" data-end="2901" data-col-size="sm">Thành phần FSM</th>
<th data-start="2901" data-end="2914" data-col-size="sm">Loại mạch</th>
</tr>
</thead>
<tbody data-start="2943" data-end="3052">
<tr data-start="2943" data-end="2976">
<td data-start="2943" data-end="2960" data-col-size="sm">State Register</td>
<td data-col-size="sm" data-start="2960" data-end="2976">Mạch tuần tự</td>
</tr>
<tr data-start="2977" data-end="3011">
<td data-start="2977" data-end="2996" data-col-size="sm">Next State Logic</td>
<td data-col-size="sm" data-start="2996" data-end="3011">Mạch tổ hợp</td>
</tr>
<tr data-start="3012" data-end="3052">
<td data-start="3012" data-end="3027" data-col-size="sm">Output Logic</td>
<td data-col-size="sm" data-start="3027" data-end="3052">Mạch tổ hợp / tuần tự</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="3054" data-end="3116">&#x1f449; FSM là ví dụ điển hình cho sự kết hợp <strong data-start="3095" data-end="3115">tổ hợp + tuần tự</strong>.</p>
<hr data-start="3118" data-end="3121" />
<h2 data-start="3123" data-end="3163">Lỗi thường gặp của người mới học FPGA</h2>
<p data-start="3165" data-end="3344">&#x274c; Viết mạch tuần tự nhưng <strong data-start="3191" data-end="3205">quên clock</strong><br data-start="3205" data-end="3208" />&#x274c; Dùng always @(*) nhưng lại tạo latch<br data-start="3246" data-end="3249" />&#x274c; Không phân biệt rõ <strong data-start="3270" data-end="3303">logic tổ hợp vs logic tuần tự</strong><br data-start="3303" data-end="3306" />&#x274c; Nhầm lẫn giữa <strong data-start="3322" data-end="3344">FSM và mạch tổ hợp</strong></p>]]></content:encoded>
						                            <category domain="https://dientu.vn/community/thiet-ke-so-verilog-vhdl/">Thiết kế số verilog vhdl</category>                        <dc:creator>admin</dc:creator>
                        <guid isPermaLink="true">https://dientu.vn/community/thiet-ke-so-verilog-vhdl/su-khac-nhau-giua-mach-to-hop-va-mach-tuan-tu-la-gi/</guid>
                    </item>
							        </channel>
        </rss>
		