Những điều mọi lập trình viên phần mềm cần hiểu về thiết kế phần cứng

Những điều mọi lập trình viên phần mềm cần hiểu về thiết kế phần cứng

Bài viết quan trọng nhất dành cho một nhà thiết kế kỹ thuật số mới vào nghề

Mọi lập trình viên phần mềm biết một ngôn ngữ như C hoặc Java đều gặp phải những vấn đề tương tự khi cố gắng bắt đầu lập trình bằng VHDL hoặc Verilog. Họ đưa ra những giả định về cách mã hoạt động. Những giả định này thường đúng với tất cả các ngôn ngữ phần mềm. Thật không may, những giả định đó không đúng với các ngôn ngữ mô tả phần cứng. Nếu bạn mới làm quen với phát triển phần cứng nhưng đã biết một hoặc hai ngôn ngữ phần mềm, hãy đọc bài viết này trước! Bài viết này đưa ra các ví dụ về mã và giải thích cách mã hoạt động trong thế giới phần mềm và trong thế giới phần cứng để cho thấy sự khác biệt giữa chúng.

Giả định #1: Logic tuần tự so với logic song song

Đây có lẽ là sự khác biệt cơ bản nhất giữa các ngôn ngữ lập trình phần cứng và phần mềm. Các nhà thiết kế phần mềm chỉ từng thấy mã tuần tự, nhưng có lẽ họ không nhận ra thực tế này. Mã tuần tự có nghĩa là các dòng mã được thực thi lần lượt từng dòng một. Ví dụ, Dòng #2 chỉ có thể được thực thi sau khi Dòng #1 hoàn tất. VHDL và Verilog không hoạt động theo cách này! Chúng được gọi là các ngôn ngữ logic song song và tất cả các dòng mã đều có thể và sẽ được thực thi đồng thời. Điều này được gọi là tính đồng thời. Dưới đây là một ví dụ minh họa sự khác biệt giữa logic tuần tự và logic song song. Giả sử một nhà thiết kế muốn bật một đèn LED sau mỗi mười chu kỳ xung nhịp.

Ví dụ về mã phần mềm:

1
while (1)

Mã VHDL tương đương:

P_INCREMENT : process (clock)
begin
  if rising_edge(clock) then
    if (count < 9) then
      count <= count + 1;
    else
      count <= 0;            
    end if;
  end if;
end process P_INCREMENT;
 
LED_on <= '1' when count = 9 else '0';

Điều quan trọng cần nhận ra ở đây là trong mã phần mềm, mỗi dòng được thực thi trước khi dòng tiếp theo được phép thực thi. Điều này KHÔNG đúng với VHDL và Verilog, và điều này được thể hiện qua dòng cuối cùng gán tín hiệu LED_on. Dòng đó chạy đồng thời với tiến trình VHDL. Nó luôn gán giá trị '1' hoặc '0' cho LED_on. Nếu đây là phần mềm, dòng này chỉ được thực thi khi các dòng mã trước đó đã được thực thi. Một nhà thiết kế mạch số giỏi cần luôn nhớ rằng VHDL và Verilog là các ngôn ngữ song song.

Giả định #2: Vòng lặp For

Đây là một vấn đề lớn đối với những người mới phát triển phần cứng. Họ đã thấy các vòng lặp for hàng trăm lần trong C, vì vậy họ nghĩ rằng chúng hoạt động giống nhau trong Verilog và VHDL. Hãy để tôi nói rõ ở đây: Vòng lặp for KHÔNG hoạt động giống nhau trong phần cứng và phần mềm. Cho đến khi bạn hiểu cách vòng lặp for hoạt động, bạn không nên sử dụng chúng.

Ví dụ về mã phần mềm:

For (int i=0; i<10; i++)
  data[i] = data[i] + 1;

Mã này sẽ lấy từng giá trị trong mảng "data" và tăng giá trị đó lên 1. Dưới đây là mã VHDL tương đương:

P_INCREMENT : process (clock)
begin
  if rising_edge(clock) then
    if (index < 10) then
      data[index] <= data[index] + 1;
      index <= index + 1;
    end if;
  end if;
end process P_INCREMENT;

Bạn đã bắt đầu nhận thấy một quy luật chưa? Mã được viết bằng C hầu như luôn cần ít dòng hơn để thực hiện chức năng tương tự so với mã được viết bằng VHDL hoặc Verilog. Tôi sẽ mạnh dạn khẳng định điều này: nếu bạn chưa thực hiện ít nhất 3 thiết kế FPGA, bạn không bao giờ nên sử dụng vòng lặp for. Vì vậy, hãy suy nghĩ về cách viết lại mã phần mềm của bạn mà không cần sử dụng vòng lặp for. Thông thường, tất cả những gì bạn cần làm là thêm một tín hiệu bộ đếm (như index trong ví dụ trên) để thực hiện cùng một chức năng mà vòng lặp for sẽ thực hiện.

Giả định #3: Mã được thực thi ngay lập tức

Điều này liên quan đến phần thảo luận ở trên về logic tuần tự so với logic song song, nhưng đây là một sai lầm phổ biến mà các nhà phát triển phần mềm thường mắc phải. Các nhà phát triển phần mềm cần nhớ rằng một dòng mã không được thực thi ngay lập tức để cập nhật giá trị tín hiệu cho mục đích sử dụng. Ví dụ dưới đây minh họa giả định này bằng một máy trạng thái. Ví dụ dưới đây cho thấy một quy trình khởi tạo cho một thành phần ngoại vi nào đó, chẳng hạn như bộ chuyển đổi tương tự sang số. FPGA cần ghi lần lượt các giá trị 5, 6, 1, 0 lên đường dữ liệu của ADC. Máy trạng thái như được mô tả trong phần mềm sẽ cho phép giá trị của data thay đổi khi các trạng thái thay đổi. Thật không may, trong ví dụ mã phần cứng bị lỗi dưới đây, điều này không xảy ra:

Ví dụ về mã phần mềm:

state = INITIALIZE;
data = 5;
state = LOAD_1;
data = 6;
state = LOAD_2;
data = 1;
state = DONE;
data = 0;

Mã phần cứng KHÔNG tương đương: (Mã bị lỗi)

P_STATE_MACHINE : process (clock)
begin
  if rising_edge(clock) then
    state <= INITIALIZE;
    data <= 5;
    state <= LOAD_1;
    data <= 6;
    state <= LOAD_2;
    data <= 1;
    state <= DONE;
    data <= 0;
  end if;
end process P_STATE_MACHINE;

Cách biểu diễn phần cứng của mã này bị lỗi nghiêm trọng! Vì mọi dòng trong một tiến trình được thực thi đồng thời, data sẽ luôn bị giữ ở giá trị 0 và state sẽ luôn bị giữ ở trạng thái DONE. Mã này sẽ không bao giờ thực thi máy trạng thái theo cách mà mã phần mềm thực hiện. Mã dưới đây là cách viết đúng máy trạng thái này trong VHDL:

Mã phần cứng tương đương:

P_STATE_MACHINE : process (clock)
begin
  if rising_edge(clock) then
    if (state == INITIALIZE) then
      data <= 5;
      state <= LOAD_1;
    elsif (state == LOAD_1) then
      data <= 6;
      state <= LOAD_2;
    elsif (state == LOAD_2) then
      data <= 1;
      state <= DONE;
    elsif (state == DONE) then
      data = 0;
    else
      state <= INITIALIZE;
    end if;
  end if;
end process P_STATE_MACHINE;

Ba ví dụ trên là ba vấn đề mà những người mới phát triển phần mềm thường gặp khó khăn khi bắt đầu một thiết kế mới bằng VHDL hoặc Verilog. Những người mới thiết kế mạch số cần luôn ghi nhớ ba giả định trên. Các vấn đề liên quan đến tính đồng thời, vòng lặp for và việc thực thi mã cần luôn được xem xét. Khi các ví dụ trên được hiểu một cách thấu đáo, những bài viết và ví dụ còn lại trên trang web này có thể giúp bạn trở thành một nhà thiết kế mạch số thành công!

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Win a Raspberry Pi!

Answer 5 questions for your chance to win!
Question 1

What color is the sky?

Tìm kiếm bằng danh mục

Chọn danh mục