2007年12月13日 星期四

軟體, 硬體, 還是韌體?(下)

首先我們來思考一個問題
如果我們使用的SOC是NIOS II
裡面包含了LCD模組
以及一些簡單的IO
那在使用LCD模組時
我們會如何使用呢

以下是NIOS II裡的一個範例:
void showLCD(unsigned int duty_cycle)
{//Initial LCD
FILE *lcd;
lcd = fopen("/dev/lcd_16207_0", "w");
if (lcd != NULL )
{
fprintf(lcd, "The duty cycle\nis: %d"
, duty_cycle);
}
fclose( lcd );
}

這是在NIOS II 中使用LCD的一個副程式
很顯然的, 它是採用fopen的方式來使用
我們知道利用C語言中所謂的"格式化IO"
基本上都會使用到指標
指標可說是C語言的精神象徵
曾有過一句話"沒學懂指標, 別說你會C語言"
而指標的用意往往是指向記憶體位址

現在問題來了
假如一個SOC的記憶體不大
或者是記憶體尚未規劃
指標可以運作嗎

很遺憾, 這個答案是否定的
因為C語言的指標
是使用在一個已將記憶體規劃完成的系統才能使用
也就是說
當你不清楚你寫的程式是軟體還是韌體時
若貿然的使用指標的方式
很容易就會造成"無法挽救的後果"
也就是Visual C中常出現的"Fatal Error"(強者可能不常出現啦...)
因為它沒辦法去找到相對應的記憶體位址
因此不管怎麼指, 永遠也指不到正確的地方
這一點要特別小心

就算今天系統內並沒有加記憶體
使用以上方式仍能將LCD正確使用
為什麼在NIOS II 中的LCD模組可以用此方法呢
原因在於LCD模組本身就有記憶體了
也就是說當我們利用上述程式碼執行
SOC在判斷上是去LCD模組內的記憶體抓資料
而非其他的記憶體
如此一來也不會造成LCD出現奇怪的文字

這個系列的文章到此接近尾聲
不知各位對程式語言的應用是否有更深一層的了解
因此當各位在撰寫SOC的程式時
一定要考慮到一個問題
你現在所寫的程式到底是軟體, 硬體, 還是韌體
多了這番考量
相信各位在撰寫時
也能慢慢體會這三種微妙的差異

2007年12月8日 星期六

軟體, 硬體, 還是韌體?(中)

要清楚區分SOC的軟體, 硬體
得先從SOC的架構來看
基本而言, SOC的架構可以想像成一個PC
SOC該有的, 基本上PC應該也不會少
PC中, 其架構分為軟體, 硬體, 韌體
SOC也沒有少
因此, 我們可以把架構以圖形的方式來表示:


由上圖中我們可以發現
所謂的韌體部分, 並不是獨立形成一個區塊
而是包含在硬體裡面
這點必須要解釋一下

在SOC裡面, 所謂的韌體是相等於"硬體的初始化程式"
我們知道在硬體之前, 必須要先對它做初始化的動作
就好比一般PC在開機時, BIOS會先自我檢測所有的硬體
在檢測的同時, 也將這些硬體"喚醒(Wake UP)"
也就是等同於告訴它們該準備工作了

一般的韌體是以"組合語言(Assembler)"來撰寫
當然現在很多也是藉由C語言撰寫後, 經由編譯器及組譯器轉成機械語言
再將機械語言存放至ROM裡面
開機的時候, BIOS會先到ROM去讀取初始化資料
如此一來才能將其他硬體喚醒

有了這基本的了解, 再來就是解釋所撰寫的程式是哪一層

以現在的C語言來說, 已經包含了軟體, 硬體及韌體
並不是C語言的能力比較強
而是許多的程式編輯軟體中
已經包括了各種硬體的編譯器及組譯器

換句話說, 不論寫的是硬體軟體, 甚至韌體
都有辦法轉換成該系統的機械語言執行
再加上C語言是大多數設計人員所能接受的語言
因此支援性也越來越廣

在本篇最後, 敝人整理一下這三大部份常用撰寫軟體及撰寫語言:
硬體 : VHDL, Verilog, SystemC, C
韌體 : C, 組合語言(依系統而異)
軟體 : C, JAVA

介紹到此, 是該為本篇下個結論了
當各位在撰寫程式的時候
需要多考量到所寫的程式是軟體還是硬體
因為在程式撰寫的時候, 這是相當重要的關鍵

怎麼說呢? 下一篇會有更深入的探討

軟體, 硬體, 還是韌體?(上)

對於一個工程師而言
寫程式是必經之路
從學校裡學寫C語言開始
就註定這輩子與程式脫離不了關係

學到目前, 本人只會兩種程式語言
一種是C, 另一種則是VHDL
前者相信大家十分熟悉
而後者對它的了解, 我想只有相關人士比較了解

VHDL是一種硬體描述語言
基本上跟所謂的"寫程式"是相同的
只是目的不一樣
C寫好的程式是在windows中執行
VHDL寫好的程式則是以實現一個硬體去執行
同樣是寫程式, 為何兩者差異性這麼大?

隨著SOC的快速竄紅
"跨平台"的特性也日驅顯見
大家都希望只學會一種程式語言就能在任何平台上執行
到目前為止, 這已不是夢想
JAVA成功的跨平台特性已為SOC打開了一扇門
接踵而至地便是大家熟悉的C語言

C語言有多好用?相信對程式設計的初學者並不了解
對它的印象應該也僅限於交作業前一天熬夜趕工的痛苦日子
但對一個SOC來說, C語言可說是它的精神所在
不管是NIOS II, ARM 或是TI的OMAP
都支援C語言的編輯
現在想想, 真有點後悔當初沒將C語言學好
不然的話我應該已在大公司上班了.......

廢話扯到這裡
不知各位看出些端倪了沒
本篇的主題是"軟體, 硬體, 還是韌體?"(先別管上中下...)
相信這三個名詞在計算機概論中都有提過
而在定義上也應該相當的明確
又為何會在這裡再次提出呢?

記得有一天在寫NIOS II 的程式時
老闆突然問我一個問題
"你現在寫的C是硬體還是軟體?"
當下我毫不考慮的回答是軟體
可是我老闆用十分懷疑的眼光看著我
"你確定是軟體嗎?"
我心想, C不就是用來寫軟體的嗎?但我沒答腔

事隔多日, 我才發現為何老闆會問這樣的問題
正如同先前所提的, 跨平台的時代已來臨
C已不僅僅是軟體, 甚至可以設計成硬體
換個方式來說, 我當時的情況, 撰寫的是NIOS II 的程式
那麼C在這裡應該是屬於硬體囉?

看到這裡, 各位是否對SOC中的程式語言感到疑惑呢?
軟體, 硬體, 還是韌體?
讓我們繼續看下去

2007年9月11日 星期二

淺談嵌入式系統(SOC)

嵌入式系統(SOC)算是近幾年來相當熱門的話題
許多人也紛紛朝這方向研究及分析
不過也有大多數的人不得其門而入
在此小弟簡單的介紹一下

要使用SOC之前 我們必須先考量一個問題
我們所建立的SOC功能為何 目的為何
如果說只是單純建立幾個基本正反器
或者是幾個簡單的邏輯閘組成的電路
小弟是認為這用硬體描述語言就可以解決
甚至於買塊麵包板跟IC回來插一插就搞定了
若說用到SOC 有點殺雞焉用牛刀之感
所以確定自己的需求 是相當重要之事

廢話不多說 我們趕快進入SOC的話題吧

SOC 顧名思義就是System on Chip
至於要在一顆chip上建立一個system而言
並不是可以用簡單的HDL就能處理的
我們先思考幾個問題

  1. 既然是system 那麼是怎樣的system?
  2. 什麼樣的物件(或硬體)算得上on chip?
在system部分分成兩部分
一個是硬體 一個是軟體
在硬體的部份 包含在SOC裡面有許多部份
我們以Altera NIOS II的架構來說(如下圖)

在框框裡面的即為一嵌入式系統
裡頭包含了CPU, Bus, On-Chip Memory 等等
這些全是硬體的部份
也就是說 要建立一個SOC的最基礎
就是要從這裡開始
我們可以這樣想
在框框外是實體的硬體
也就是真正看得見的chip或硬體(如LED, LCD等等)
而要讓它們動作,得靠我們所設計的controller或driver
而這方面的設計,可依我們的需求會有所不同
這也是NIOS II最大的特點
另外我們再來看另一個架構--ARM

這是一個很典型的ARM系統

我相信應該有人發現了幾個問題
首先是系統問題, 似乎ARM的系統遠比NIOS II複雜
且架構也比NIOS II大
感覺ARM的功能性比NIOS II強大
那麼兩者的差別到底在哪裡?

這個問題的解答正是各家SOC不同的地方
撇開CPU的架構而言,另一個差別就在於BUS
NIOS II的BUS名為Avalon Bus
ARM的為AMBA Bus
而ARM的AMBA又分為兩個:AHB和APB
從上圖中我們可以發現
AHB主要是掌管記憶體部分
APB是掌管硬體周邊
在兩個BUS的雙重使用下,可更容易降低CPU的負擔

感覺上在這方面似乎NIOS II的BUS遜色不少
但各位也別忘了,NIOS II的優點在於硬體是客製化的(Custom
也就是說,NIOS II也可以實現雙BUS架構
因此只要是在FPGA內的LE夠的話
想要擴充不是問題

那麼ARM是否就沒有缺點了呢
這個答案是否定的,ARM的缺點就在於硬體的彈性
在NIOS II裡,我們可以依據自己的需求而增加所要的硬體
而在ARM的話,硬體的設計是包好的
也就是說,BUS分成兩條就是兩條
而我們也不能將APB所連接的元件連到AHB上面
所以在限制上,ARM的硬體彈性比NIOS II低

先前說過,SOC分成兩大部分:硬體和軟體
剛剛已經稍微介紹了兩個平台的硬體
接著我們從軟體的角度來分析

首先在NIOS II上面,當硬體架設好後
就是要將軟體運行在所設計的硬體上
在NIOS II裡所採用的是MicroC/OS-II
而ARM上面的OS則可支援很多
例如uCLINUX, WINCE, VxWork等等
這並不是說NIOS II就不支援
只是在porting上比較複雜

另外一提, 在NIOS II上的OS是要自己規劃的
也就是說我們引進了OS的基本函式庫後
在什麼時間該執行哪個TASK是自行設定
這個設定跟一開始在硬體時的設定有關
所以在使用OS上就顯得麻煩了一點
相對於uCLINUX,就有點像是一般安裝LINUX
只要針對自己的硬體,給定相對應的參數即可

有了OS,再來談Application Software
在ARM上面開發軟體確實比NIOS II方便
它就像是一台小型的PC,而我們只需要在PC上安裝開發軟體即可
但在NIOS II上,光是要做一個軟體介面就不是十分容易
因此在軟體部分, ARM略勝NIOS II一籌

說到這裡,相信各位應該對SOC有了基本的認識
其實SOC的平台很多,在此雖然只舉出兩個例子供大家比較
而我們可以在此給兩者做個結論
若各位的設計是比較偏向硬體,可選擇NIOS II
若是偏向軟體,ARM是比較方便
我想這也是為何業界偏好使用ARM來開發商品而不用NIOS II

不過,誰好誰壞,還是看需求為主
這是沒有絕對的
但請記得,SOC的主體架構是相同的

差別只在於CPU與BUS的架構

這才是SOC的靈魂,也是主宰SOC效能的最大主因

參考文件:

  1. Nios II Processor Reference Handbook
  2. 基於ARM的SOC設計入門

2007年9月7日 星期五

有關7.1版的SOPC Builder

在7.1版的SOPC Builder使用的是新介面
也許先前習慣舊介面(也就是classic)的使用者
會發現有許多的component位置有些許不同
當然如果project是由先前版本建立的話可以選擇"open in classic"
如果要在7.1版中建立而又是以classic的方式開啟
請依照下列步驟設定(os為windows系列)


1.執行 控制台->系統 (或在 我的電腦 點滑鼠右鍵,選 內容 )
2.點 進階 標籤,選擇 環境變數
3.在 系統變數 的框架裡點選 新增
4.在 變數名稱 中填入 SOPC_BUILDER_PREVIEW
變數值 填入 0 , 之後按 確定
5.在按一次 確定 後離開
6.重新開啟Quartus II 7.1

此內容翻譯ALTERA的文件,以下為文件資料:
Solution ID: rd05082007_870
Last Modified: Jun 22, 2007
Product Category: Embedded Processors
Product Area: SOPC Builder
Product Sub-area: Other

若想參照原文,請參閱以下網址:
http://www.altera.com/support/kdb/solutions/rd05082007_870.html

以上內容若有錯誤,隨時歡迎各位先進留言更正
Thanks!!!

2007年8月13日 星期一

DE2的資料光碟

在DE2的盒內有附贈光碟
有的有一片 有的或許兩片
基本的是一片Quartus II的WEB版光碟
若是比較早購買的 則會多一片DE2資料光碟
(比較後期買的就沒有這片 但可以上網下載
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=Taiwan&CategoryNo=38&No=56&Revision=088&PartNo=3#section)


現在先來介紹一下資料光碟的內容

光碟機(或壓縮檔)
-Altera_Debug_Client //Altera Debug Client安裝程式
-Datasheets //DE2的資料 , 如SDRAM LCD 等等
-DE2_control_panel //DE2的控制面板 , 可由PC端控制
-DE2_demonstrations //DE2的DEMO , 有Quartus II和NIOS II的demo
- SOPC_Builder //SOPC Builder的reference design
-DE2_lab_exercises //有VHDL及Verilog的Lab , 但沒有Solution...(殘念)
-DE2_schematics //DE2的規格圖
-DE2_tutorials //一些以DE2為主的tutorial
-DE2_user_manual //DE2的使用手冊
-changelog.txt //光碟版本更新記錄
-DE2_Introduction_box.pdf //DE2簡介

先在C槽建立一個名叫DE2的資料夾
再將下載的資料光碟解壓縮到此路徑
reference design的路徑為:
c:\de2\DE2_demonstrations\SOPC_Builder\reference_design\DE2_NIOS
之後將reference design的資料夾複製出來
放在c:\altera\71\quartus\裡面
然後執行DE2_NIOS.qpf的專案檔
如此一來就可以使用裡面的東西

若不修改reference design的內容
可直接燒錄DE2_NIOS.sof或DE2_NIOS.pof
再來就是在NIOS II IDE中設計即可

2007年7月14日 星期六

安裝開發軟體

既然使用了ALTERA DE2 的板子
開發軟體當然就是使用Quartus II 啦
我使用的版本是7.1
最近7.1的service pack出來了(考慮要不要更新...)

要完成一個以NIOS II based 的研究
軟體的安裝也是很重要的
因此除了安裝Quartus II外, NIOS II EDS 也不能少
以下我就列出我所安裝的順序:

Quartus II 7.1
MegaCore IP 7.1
NIOS II EDS 7.1 (6.0版以前叫IDE)
Altera University Program IP Cores (友晶的DE2元件全部支援)

將上述軟體安裝完成之後,就可以開始建立自己的NIOS II 系統囉

2007年7月1日 星期日

一個以DE2為主的BLOG

終於有了新的Blog
這個地方將會記錄我研究的內容
主要是以NIOS II為主
也希望能將兩年的研究生涯忠實呈現