導航:首頁 > 源碼編譯 > atf15系列cpld編譯環境

atf15系列cpld編譯環境

發布時間:2024-12-18 15:59:45

Ⅰ 什麼是PLDPLD是做什麼用的還有好學么。請高手指教。。。

PLD(programmable logic device)--可編程邏輯器件:PLD是做為一種通用集成電路生產的,他的邏輯功能按照用戶對器件編程來高定。一般的PLD的集成度很高,足以滿足設計一般的數字系統的需要。這樣就可以由設計人員自行編程而把一個數字系統「集成」在一片PLD上,而不必去請晶元製造廠商設計和製作專用的集成電路晶元了。PLA是生物降解塑料聚乳酸的英文簡寫,全寫為:polylactice acid 聚乳酸也稱為聚丙交酯(polylactide),屬於聚酯家族。聚乳酸是以乳酸為主要原料聚合得到的聚合物,原料來源充分而且可以再生,主要以玉米、木薯等為原料。聚乳酸的生產過程無污染,而且產品可以生物降解,實現在自然界中的循環,因此是理想的綠色高分子材料。 聚乳酸的熱穩定性好,加工溫度170~230℃,有好的抗溶劑性,可用多種方式進行加工,如擠壓、紡絲、雙軸拉伸,注射吹塑。由聚乳酸製成的產品除能生物降解外,生物相容性、光澤度、透明性、手感和耐熱性好,還具有一定的耐菌性、阻燃性和抗紫外性,因此用途十分廣泛,可用作包裝材料、纖維和非織造物等,目前主要用於服裝(內衣、外衣)、產業(建築、農業、林業、造紙)和醫療衛生等領域。 PLA最大的製造商是美國NatureWorks公司,其次是中國的海正生物,他們目前的產量分別是7萬噸和5千噸。PLA有很多的應用,可以在擠出、注塑、拉膜、紡絲等多領域應用。GAL,通用陣列邏輯,英文全稱:generic array logic。 GAL器件是從PAL發現過來的,其採用了EECMOS工藝使得該器件的編程非常方便,另外由於其輸出采 用了邏輯宏 單元結構(OLMC—Output Logic Macro Cell),使得電路的邏輯設計更加靈活。 二、GAL的優點: 1.具有電可擦除的功能,克服了採用熔斷絲技術只能一次編程的缺點,其可改寫的次數超過100次; 2.由於採用了輸出宏單元結構,用戶可根據需要進行組態,一片GAL器件可以實現各種組態的PAL器件 輸出結構的邏輯 功能,給電路設計帶來極大的方便; 3.具有加密的功能,保護了知識產權; 4.在器件中開設了一個存儲區域用來存放識別標志——即電子標簽的功能。 三、GAL器件的基本結構: GAL有五個部分組成: 1.輸入端:GAL16V8的2~9腳共8個輸入端,每個輸入端有一個緩沖器,並由緩沖器引出兩個互補的輸出到與陣列; 2.與陣列部分:它由8根輸入及8根輸出各引出兩根互補的輸出構成32列,即與項的變數個數為16;8根輸出每個輸出對應於一個8輸入或門(相當於每個輸出包含8個與項)構成64行,即GAL16V8的與陣列為一個32×64的陣列,共2048個可編程單元(或結點); 3.輸出宏單元:GAL16V8共有8個輸出宏單元,分別對應於12~19腳。每個宏單元的電路可以通過編程實現所有PAL輸出結構實現的功能; 4.系統時鍾:GAL16V8的1腳為系統時鍾輸入端,與每個輸出宏單元中D觸發器時鍾輸入端相連,可見GAL器件只能實現同步時序電路,而無法實現非同步的時序電路; 5.輸出三態控制端:GAL16V8的11腳為器件的三態控制公共端。FPGA是英文Field-Programmable Gate Array的縮寫,即現場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎上進一步發展的產物。它是作為專用集成電路(ASIC)領域中的一種半定製電路而出現的,既解決了定製電路的不足,又克服了原有可編程器件門電路數有限的缺點。ASIC(Application Specific Integrated Circuit)是專用集成電路。 目前,在集成電路界ASIC被認為是一種為專門目的而設計的集成電路。是指應特定用戶要求和特定電子系統的需要而設計、製造的集成電路。ASIC的特點是面向特定用戶的需求,ASIC在批量生產時與通用集成電路相比具有體積更小、功耗更低、可靠性提高、性能提高、保密性增強、成本降低等優點。

如果你學過數字電路 ,還是很簡單的

跟我學Cupl之三--如何使用WinCupl軟體環境
差點忘了申明:本教程由吳健編寫,未經許可,請不要轉載。如果非要轉載,請註明本文由吳健編寫



WinCupl是ATMEL公司出品的Cupl語言的編譯環境,用於PLD器件的編程,支持多種器件,包括GAL系列

和ATF系列。一般來說,ATF系列的同等級產品要必GAL的便宜,比如AFT16V8就兼容GAL16V8,可以擦寫100

次,價格上也便宜1塊~2塊,性能都差不多。
在ATMEL公司的SPLD/CPLD欄目中免費下載WinCupl後,可以得到一個注冊碼,用這個碼就可以激活

WinCupl了,這個碼沒有使用時間的限制。
WinCupl軟體包實際包括兩個部分,一個是WinCupl,PLD的編譯環境,一個是WinSim,相當於MAX的波

形模擬部分。
接下來我們學習如何使用這個軟體。

一、編譯第一個源文件
第一次課我們舉了一個例子,說明了Cupl語言的基本結構,下面我們做另一個例子,就是兩輸入端與

門。具體步驟是:
1、啟動WinCupl。啟動完進入主界面後,單擊File菜單的New,從New中單擊Projet,就是新建一個工

程文件(其實還是PLD文件),在彈出的對話框中,可以填您的源文件名字(Name),填MYGATE,其它的

東西怎麼填請您復習第2課的PLD文件頭部文件的說明部分。這里有個特殊的地方,就是器件(Device),

系統默認的是virtual,就是不針對任何具體的部件,這里我們改掉,改成g16v8a,這個關鍵字兼容

ATF16V8。
2、單擊OK後,系統要你輸入你要用的輸入引腳數,因為我們只有兩個輸入端,因此填2,單擊OK按鈕


3、系統要你輸入要用到的輸出引腳數,填1,單擊OK按鈕。
4、系統要你輸入要使用到的中間節點數,我們不需要,填0,單擊OK按鈕。這樣系統就建立了一個

PLD文件,文件名就是MYGATE.PLD。系統將該文件顯示出來了,就象下面這樣:
Name MYGATE ;
PartNo 00 ;
Date 2006-8-9 ;
Revision 01 ;
Designer WUJIAN ;
Company TALE ;
Assembly None ;
Location ;
Device g16v8a ;

/* *************** INPUT PINS *********************/
PIN = ; /* */
PIN = ; /* */

/* *************** OUTPUT PINS *********************/
PIN = ; /* */

因此,這個文件是空的,我們填一下,將輸入輸出引腳都填好,把邏輯也寫完,就象下面這樣:
Name MYGATE ;
PartNo 00 ;
Date 2006-8-9 ;
Revision 01 ;
Designer WUJIAN ;
Company TALE ;
Assembly None ;
Location ;
Device g16v8a ;
/* *************** INPUT PINS *********************/
PIN 2 = a ; /* */
PIN 3 = b ; /* */

/* *************** OUTPUT PINS *********************/
PIN 12 = Y ; /* */

Y = a & b;
寫好後,我們需要編譯該文件。在Run菜單中,單擊Device Dependent Compile,就是基於器件型號

的編譯。如果沒有出現什麼鍵入錯誤,都能成功編譯。編譯完成後,我們來模擬一下看看波形。

二、模擬的基本方法
編譯完成後。單擊工具欄圖標的從右側數第2個,啟動WinSim。啟動完成後,單擊WinSim菜單File中的

New。
1、在彈出的Design Properties對話框中,單擊Design File按鈕,選中MYGATE.PLD文件,按「確認

」按鈕繼續。在Design Properties對話框中,單擊OK按鈕確認。
2、接下來WinSim會提示是否創建MYGATE.SIM文件並編譯它,單擊「是」繼續。
3、不管接下來的提示,在WinSim中Signal(信號)菜單中單擊Add,在彈出的Add Signal對話框中不

斷單擊OK按鈕將a、b、y三個信號加到波形圖中。單擊Done關閉該對話框。
4、在WinSim的File菜單中單擊Save項保存該項目。
5、在黑色的網格的左上方有個Value,Value右邊有個1,在1所在的灰色條上單擊滑鼠右鍵,在彈出

的菜單中的Add Vector上單擊滑鼠左鍵,在彈出的對話框中輸入3,表示增加波形模擬的3段。
6、在a的右側的波形上單擊滑鼠右鍵,依次選0,0,1,1,在b的波形上單擊滑鼠右鍵,依次選0,1

,0,1。
7、保存該工程。在Simulator菜單中選擇Simulator開始模擬,就可以看到y的波形了。如下圖所示。

本次課我們學習了如何利用WinCupl進行PLD邏輯設計和基本模擬方法

Ⅱ 如何實現單片機與CPLD通訊

1。可以用CPLD模擬一個RS232串口,利用這個串口與單片機通信

下面是用VHDL寫的一個串口程序,你可以根據你的通信協議對這個程序略作修改即可使用

-- 本模塊的功能是驗證實現基本的串口通信的功能。
--
-- 程序實現了一個收發一幀10個bit(即無奇偶校驗位)的串口控
--制器,10個bit是1位起始位,8個數據位,1個結束
--位。串口的波特律由程序中定義的div_par參數決定,更改該參數可以實
--現相應的波特率。程序當前設定的div_par 的值是0x104,對應的波特率是
--9600。用一個8倍波特率的時鍾將發送或接受每一位bit的周期時間
--劃分為8個時隙以使通信同步.
:串口處於全雙工工作狀態,
--字元串(串口調試工具設成按ASCII碼接受方式);
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY UART IS
PORT (
clk : IN std_logic;
rst : IN std_logic;
rxd : IN std_logic; --串列數據接收端
txd : OUT std_logic; --串列數據發送端
en : OUT std_logic; -- 數碼管使能
seg_data : OUT std_logic_vector(7 DOWNTO 0); --數碼管數據
key_input : IN std_logic --按鍵輸入
);
END UART;

ARCHITECTURE arch OF UART IS

--//////////////////inner reg////////////////////
SIGNAL div_reg : std_logic_vector(15 DOWNTO 0);--分頻計數器,分頻值由波特率決定。分頻後得到頻率8倍波特率的時鍾
SIGNAL div8_tras_reg : std_logic_vector(2 DOWNTO 0);--該寄存器的計數值對應發送時當前位於的時隙數
SIGNAL div8_rec_reg : std_logic_vector(2 DOWNTO 0); --寄存器的計數值對應接收時當前位於的時隙數
SIGNAL state_tras : std_logic_vector(3 DOWNTO 0); -- 發送狀態寄存器
SIGNAL state_rec : std_logic_vector(3 DOWNTO 0); -- 接受狀態寄存器
SIGNAL clkbaud_tras : std_logic; --以波特率為頻率的發送使能信號
SIGNAL clkbaud_rec : std_logic; --以波特率為頻率的接受使能信號
SIGNAL clkbaud8x : std_logic; --以8倍波特率為頻率的時鍾,它的作用是將發送或接受一個bit的時鍾周期分為8個時隙
SIGNAL recstart : std_logic; -- 開始發送標志
SIGNAL recstart_tmp : std_logic; --開始接受標志
SIGNAL trasstart : std_logic;
SIGNAL rxd_reg1 : std_logic; --接收寄存器1
SIGNAL rxd_reg2 : std_logic; --接收寄存器2,因為接收數據為非同步信號,故用兩級緩存
SIGNAL txd_reg : std_logic; --發送寄存器
SIGNAL rxd_buf : std_logic_vector(7 DOWNTO 0);--接受數據緩存
SIGNAL txd_buf : std_logic_vector(7 DOWNTO 0);--發送數據緩存
SIGNAL send_state : std_logic_vector(2 DOWNTO 0);--每次按鍵給PC發送"Welcome"字元串,這是發送狀態寄存器
SIGNAL cnt_delay : std_logic_vector(19 DOWNTO 0);--延時去抖計數器
SIGNAL start_delaycnt : std_logic; --開始延時計數標志
SIGNAL key_entry1 : std_logic; --確定有鍵按下標志
SIGNAL key_entry2 : std_logic; --確定有鍵按下標志
--//////////////////////////////////////////////
CONSTANT div_par : std_logic_vector(15 DOWNTO 0) := "0000000100000100";
--分頻參數,其值由對應的波特率計算而得,按此參數分頻的時鍾頻率是波倍特率的8倍,此處值對應9600的波特率,即分頻出的時鍾頻率是9600*8
SIGNAL txd_xhdl3 : std_logic;

BEGIN
en <='0' ;--7段數碼管使能信號賦值
txd <= txd_xhdl3;
txd_xhdl3 <= txd_reg ;

PROCESS(clk,rst)
BEGIN

IF (NOT rst = '1') THEN
cnt_delay <= "00000000000000000000";
start_delaycnt <= '0';
ELSIF(clk'EVENT AND clk='1')THEN
IF (start_delaycnt = '1') THEN
IF (cnt_delay /= "11000011010100000000") THEN
cnt_delay <= cnt_delay + "00000000000000000001";
ELSE
cnt_delay <= "00000000000000000000";
start_delaycnt <= '0';
END IF;
ELSE
IF ((NOT key_input='1') AND (cnt_delay = "00000000000000000000")) THEN
start_delaycnt <= '1';
END IF;
END IF;
END IF;
END PROCESS;

PROCESS(clk,rst)
BEGIN

IF (NOT rst = '1') THEN
key_entry1 <= '0';
ELSIF(clk'EVENT AND clk='1')THEN
IF (key_entry2 = '1') THEN
key_entry1 <= '0';
ELSE
IF (cnt_delay = "11000011010100000000") THEN
IF (NOT key_input = '1') THEN
key_entry1 <= '1';
END IF;
END IF;
END IF;
END IF;
END PROCESS;

PROCESS(clk,rst)
BEGIN

IF (NOT rst = '1') THEN
div_reg <= "0000000000000000";
ELSIF(clk'EVENT AND clk='1')THEN
IF (div_reg = div_par - "0000000000000001") THEN
div_reg <= "0000000000000000";
ELSE
div_reg <= div_reg + "0000000000000001";
END IF;
END IF;
END PROCESS;

PROCESS(clk,rst) --分頻得到8倍波特率的時鍾
BEGIN

IF (NOT rst = '1') THEN
clkbaud8x <= '0';
ELSIF(clk'EVENT AND clk='1')THEN
IF (div_reg = div_par - "0000000000000001") THEN
clkbaud8x <= NOT clkbaud8x;
END IF;
END IF;
END PROCESS;

PROCESS(clkbaud8x,rst)
BEGIN
IF (NOT rst = '1') THEN
div8_rec_reg <= "000";
ELSE IF(clkbaud8x'EVENT AND clkbaud8x = '1') THEN
IF (recstart = '1') THEN --接收開始標志
div8_rec_reg <= div8_rec_reg + "001";--接收開始後,時隙數在8倍波特率的時鍾下加1循環
END IF;
END IF;
END IF;
END PROCESS;

PROCESS(clkbaud8x,rst)
BEGIN
IF (NOT rst = '1') THEN
div8_tras_reg <= "000";
ELSE IF(clkbaud8x'EVENT AND clkbaud8x = '1') THEN
IF (trasstart = '1') THEN
div8_tras_reg <= div8_tras_reg + "001";--發送開始後,時隙數在8倍波特率的時鍾下加1循環
END IF;
END IF;
END IF;
END PROCESS;

PROCESS(div8_rec_reg)
BEGIN
IF (div8_rec_reg = "111") THEN
clkbaud_rec <= '1'; ---在第7個時隙,接收使能信號有效,將數據打入
ELSE
clkbaud_rec <= '0';
END IF;
END PROCESS;

PROCESS(div8_tras_reg)
BEGIN
IF (div8_tras_reg = "111") THEN
clkbaud_tras <= '1'; --在第7個時隙,發送使能信號有效,將數據發出
ELSE
clkbaud_tras <= '0';
END IF;
END PROCESS;

PROCESS(clkbaud8x,rst)
BEGIN
IF (NOT rst = '1') THEN
txd_reg <= '1';
trasstart <= '0';
txd_buf <= "00000000";
state_tras <= "0000";
send_state <= "000";
key_entry2 <= '0';
ELSE IF(clkbaud8x'EVENT AND clkbaud8x = '1') THEN
IF (NOT key_entry2 = '1') THEN
IF (key_entry1 = '1') THEN
key_entry2 <= '1';
txd_buf <= "01110111"; --"w"
END IF;
ELSE
CASE state_tras IS
WHEN "0000" => --發送起始位
IF ((NOT trasstart='1') AND (send_state < "111") ) THEN
trasstart <= '1';
ELSE
IF (send_state < "111") THEN
IF (clkbaud_tras = '1') THEN
txd_reg <= '0';
state_tras <= state_tras + "0001";
END IF;
ELSE
key_entry2 <= '0';
state_tras <= "0000";
END IF;
END IF;
WHEN "0001" => --發送第1位
IF (clkbaud_tras = '1') THEN
txd_reg <= txd_buf(0);
txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1);
state_tras <= state_tras + "0001";
END IF;
WHEN "0010" => --發送第2位
IF (clkbaud_tras = '1') THEN
txd_reg <= txd_buf(0);
txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1);
state_tras <= state_tras + "0001";
END IF;
WHEN "0011" => --發送第3位
IF (clkbaud_tras = '1') THEN
txd_reg <= txd_buf(0);
txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1);
state_tras <= state_tras + "0001";
END IF;
WHEN "0100" => --發送第4位
IF (clkbaud_tras = '1') THEN
txd_reg <= txd_buf(0);
txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1);
state_tras <= state_tras + "0001";
END IF;
WHEN "0101" => --發送第5位
IF (clkbaud_tras = '1') THEN
txd_reg <= txd_buf(0);
txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1);
state_tras <= state_tras + "0001";
END IF;
WHEN "0110" => --發送第6位
IF (clkbaud_tras = '1') THEN
txd_reg <= txd_buf(0);
txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1);
state_tras <= state_tras + "0001";
END IF;
WHEN "0111" => --發送第7位
IF (clkbaud_tras = '1') THEN
txd_reg <= txd_buf(0);
txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1);
state_tras <= state_tras + "0001";
END IF;
WHEN "1000" => --發送第8位
IF (clkbaud_tras = '1') THEN
txd_reg <= txd_buf(0);
txd_buf(6 DOWNTO 0) <= txd_buf(7 DOWNTO 1);
state_tras <= state_tras + "0001";
END IF;
WHEN "1001" => --發送停止位
IF (clkbaud_tras = '1') THEN
txd_reg <= '1';
txd_buf <= "01010101";
state_tras <= state_tras + "0001";
END IF;
WHEN "1111" =>
IF (clkbaud_tras = '1') THEN
state_tras <= state_tras + "0001";
send_state <= send_state + "001";
trasstart <= '0';
CASE send_state IS
WHEN "000" =>
txd_buf <= "01100101"; --"e"
WHEN "001" =>
txd_buf <= "01101100"; --"l"
WHEN "010" =>
txd_buf <= "01100011"; --"c"
WHEN "011" =>
txd_buf <= "01101111"; --"o"
WHEN "100" =>
txd_buf <= "01101101"; --"m"
WHEN "101" =>
txd_buf <= "01100101";-- "e"
WHEN OTHERS =>
txd_buf <= "00000000";

END CASE;
END IF;
WHEN OTHERS =>
IF (clkbaud_tras = '1') THEN
state_tras <= state_tras + "0001";
trasstart <= '1';
END IF;

END CASE;
END IF;
END IF;
END IF;
END PROCESS;

PROCESS(clkbaud8x,rst) --接受PC機的數據
BEGIN
IF (NOT rst = '1') THEN
rxd_reg1 <= '0';
rxd_reg2 <= '0';
rxd_buf <= "00000000";
state_rec <= "0000";
recstart <= '0';
recstart_tmp <= '0';
ELSE IF(clkbaud8x'EVENT AND clkbaud8x = '1') THEN
rxd_reg1 <= rxd;
rxd_reg2 <= rxd_reg1;
IF (state_rec = "0000") THEN
IF (recstart_tmp = '1') THEN
recstart <= '1';
recstart_tmp <= '0';
state_rec <= state_rec + "0001";
ELSE
IF ((NOT rxd_reg1 AND rxd_reg2) = '1') THEN --檢測到起始位的下降沿,進入接受狀態
recstart_tmp <= '1';
END IF;
END IF;
ELSE
IF (state_rec >= "0001" AND state_rec<="1000") THEN
IF (clkbaud_rec = '1') THEN
rxd_buf(7) <= rxd_reg2;
rxd_buf(6 DOWNTO 0) <= rxd_buf(7 DOWNTO 1);
state_rec <= state_rec + "0001";
END IF;
ELSE
IF (state_rec = "1001") THEN
IF (clkbaud_rec = '1') THEN
state_rec <= "0000";
recstart <= '0';
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END PROCESS;

PROCESS(rxd_buf) --將接受的數據用數碼管顯示出來
BEGIN
CASE rxd_buf IS
WHEN "00110000" =>
seg_data <= "00000011";
WHEN "00110001" =>
seg_data <= "10011111";
WHEN "00110010" =>
seg_data <= "00100101";
WHEN "00110011" =>
seg_data <= "00001101";
WHEN "00110100" =>
seg_data <= "10011001";
WHEN "00110101" =>
seg_data <= "01001001";
WHEN "00110110" =>
seg_data <= "01000001";
WHEN "00110111" =>
seg_data <= "00011111";
WHEN "00111000" =>
seg_data <= "00000001";
WHEN "01000001" =>
seg_data <= "00011001";
WHEN "01000010" =>
seg_data <= "00010001";
WHEN "01000011" =>
seg_data <= "11000001";
WHEN "01000100" =>
seg_data <= "01100011";
WHEN "01000101" =>
seg_data <= "10000101";
WHEN "01000110" =>
seg_data <= "01100001";
WHEN "01000111" =>
seg_data <= "01110001";
WHEN OTHERS =>
seg_data <= "11111111";

END CASE;
END PROCESS;

END arch;
2。可利用單片機的IO口與CPLD實現通信,其他人已經回答過了,我不再贅述。

閱讀全文

與atf15系列cpld編譯環境相關的資料

熱點內容
文件夾是冊還是本 瀏覽:626
java數據隊列 瀏覽:748
uc瀏覽器加密在哪裡打開 瀏覽:481
八上優加密卷語文試卷 瀏覽:807
linux刪除組命令 瀏覽:307
51單片機15 瀏覽:350
騰訊雲伺服器安裝pi節點 瀏覽:726
戴爾伺服器怎麼設置介面關閉 瀏覽:42
微信來電怎麼加密 瀏覽:56
命令提示符cd命令 瀏覽:457
什麼是數控框架編程 瀏覽:747
安裝jdk能用dos編譯嗎 瀏覽:602
cad適用於加工中心編程嗎 瀏覽:997
怎麼攻擊伺服器上 瀏覽:876
魔域游戲伺服器人數滿了怎麼辦 瀏覽:163
如何把c程序的編譯挪到上面 瀏覽:794
參加密室逃脫的演員 瀏覽:495
dvd壓縮碟製作 瀏覽:936
怎麼刪安卓app 瀏覽:619
程序員公關 瀏覽:512