promotion image of download ymail app
Promoted
阿曹 發問時間: 電腦與網際網路程式設計 · 10 年前

我需要VHDL的高手~!!20點

各位大大好~

我最近在寫一個MOD60的硬體描述語言

上次在課堂上老師講解完後

我也照做~!

可是現在我在回頭繼續打得時候

我已經看不懂我自己在打甚麼了

麻煩VHDL的高手們

能幫我下面的程式碼逐行做註解嗎?

((如果是內定格式就不用打了,如果是我自己設定的名稱,麻煩跟我說一聲

P.S麻煩有回答的大大請不定期回來看看這個問題

我有可能會繼續發問~謝ˇ謝

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;entity mod60 is

port(

clk : in std_logic;

mdu_out: out std_logic;

cnt_out: out std_logic_vector(6 downto 0)

);

end mod60;architecture aaa of mod60 is

signal mdu_wave :std_logic;

signal cnt :std_logic_vector(6 downto 0); begin

mdu_out <= mdu_wave;

cnt_out <= cnt;

counter:process

begin

wait until clk= '1';

if cnt =59 then

mdu_wave<=not mdu_wave;

cnt<="0000000";

else

cnt<=cnt+1;

end if;

end process counter ;

end aaa;

1 個解答

評分
  • 10 年前
    最佳解答

    library ieee;--基本的宣告

    use ieee.std_logic_1164.all;--也算是基本的宣告!會用到std_logic

    use ieee.std_logic_unsigned.all;--要用無號數"unsigned"但是下面好象沒看到entity mod60 is--定義單體 名稱"mod60"

    port(--簡單的來說!這裡就是在說"電路(晶片)的外觀",自行定義即可,例如有多少i/o腳位,各腳位輸出、輸入的信號型態是什麼?等……

    clk : in std_logic; --mdu_out: out std_logic;--以這裡來說 有一支叫"clk"的輸入(in),信號型態為std_logic(有這些狀態:is

    --(‘X’, --Forcing Unknown;浮接不定

    --‘0’, --Forcing 0;低電位

    --‘1’, --Forcing 1;高電位

    --‘Z’, --High Impedance;高阻抗

    --‘W’, --Weak Unknown;弱浮接

    --‘L’, --Weak 0;弱低電位

    --‘H’, --Weak 1;弱高電位

    --‘-’, --Don’t care;不必理會)

    cnt_out: out std_logic_vector(6 downto 0)--有一組叫cnt_out的輸出其型態為標準邏輯序列其編號由6(MSB)向下算到0(LSB)共7支,各支腳位之型態同STD_LOGIC。

    );

    end mod60;--定義完成architecture aaa of mod60 is--宣告mod60的一個架構名稱為"aaa"

    signal mdu_wave :std_logic;--宣告內部訊號,可以看成類似程式中的變數

    signal cnt :std_logic_vector(6 downto 0);--而宣告格式類似定義單體時的電路接腳宣告! begin--aaa開始其作用就類似c語言中的"{",而end就是"}",所以養成習慣!在vhdl中begin和end要成"對"的使用!且配合縮排,以加強可讀性。

    mdu_out <= mdu_wave;--把內部訊號輸出

    cnt_out <= cnt;--和上一行一樣,注意!這裡的寫法是共時性敘述(Concurrent Statements)所以沒有順序!

    counter:process--這裡是process名稱是"counter"而且process是順序性敘述(Sequence Statements),會由上而下進行!

    begin

    wait until clk= '1';--等待clk信號為1時!往下進行!

    if cnt =59 then--if判斷敘述

    mdu_wave<=not mdu_wave;--當cnt計數到59時會把mdu_wave取not運算後更新mdu_wave

    cnt<="0000000";--且同時把cnt清成"0000000"(歸零!)

    else--如果cnt計數還沒到59時

    cnt<=cnt+1;--就把cnt加1

    end if;--結束if判斷

    end process counter ;--結束process"counter"

    end aaa;--結束aaa的定義

    2010-11-27 00:53:19 補充:

    在上面的程式中process"counter"、mdu_out <= mdu_wave;(輸出)、cnt_out <= cnt;(輸出)三者是沒有執行的優先順序的!

    每一個Process敘述或子程式,其皆代表著共時性的意義。

    2010-11-27 01:02:59 補充:

    上面說了輸出!那輸入呢?就是clk,所以這個電路就是在算時脈

    當算到60時歸零(您不會看到60),並把mdu_out反相(整體來看相當於一個除頻器),並且由cnt_out(6)~cnt_out(0)共7個bit把cnt計數的二進位值輸出。

    • Commenter avatar登入以對解答發表意見
還有問題?馬上發問,尋求解答。