来来来,让我们一起,左手右手一个慢动作。每一个方向都值得一个人用一生去钻研,每一个步骤都有其自身的魅力。8 w" Y3 ~2 d/ }9 u, W
第一步,做出实体芯片。: l8 v' Z1 d" u" ?+ | f
单片机一般理解为MCU(Microcontroller Unit,微控制单元),包含定时器、ALU(Arithmetic Logic Unit,算术逻辑单元)、内存、寄存器、总线等部分。而普通的意义的单片机还包含GPIO、串口(UART)、DMA、协处理器、AD\DA等等。8 {9 R7 R" A" G6 ]
看懂如下图前置:计算机组成原理,微机原理。1 L- i5 m# q* w9 O
6 J1 i$ Y/ a$ Q2 h# `流水线- d& P% j' D2 s9 i
/ D5 V# i/ d* U& a( S& u: c
前置:数字逻辑电路,集成电路设计及其EDA技术,verilog4 x& `9 ]. [' z+ p, n6 l' R/ X
把各个模块细分为寄存器级,比如移位运算器、节拍器、译码器、存储器等
5 I4 ]+ c% G/ o, Q# x- : Y9 E. [4 v+ ?6 V5 n7 Y e
- module minicpu(clk, reset, run, in, cs, pcout, irout, qtop, abus, dbus, out);) y8 `4 [# A. v7 T
- ' Z* F! Y" ^9 G! T/ J4 c
- input clk,reset,run;
" ^( }6 X) ~9 X. _! o - input [15:0] in;. v+ F5 C+ Y+ i" x, i- Z' h
- output [1:0] cs;
& i( n0 Y. @, a" E4 g& U& ~ - output [15:0] irout, qtop, dbus, out;
7 X4 s( C: d3 U - output [11:0] pcout, abus;
: j- l+ B$ b( L* @& n3 c5 `4 c - wire [15:0] qnext, ramout, aluout;
( P3 o7 x3 F/ y1 s- K7 k6 k - reg [11:0] abus;
: n$ I5 x+ [9 u& X9 H& I - reg halt, jump, pcinc, push, pop, thru, qthru, dbus2qtop, dbus2ram, dbus2obuf, ir2dbus, qtop2dbus, alu2dbus, ram2dbus, in2dbus;
2 _4 T) D! z/ K& P8 h- S$ J - reg pop2, ir2abus, qtop2abus, qnext2abus;. A4 V, Y) ~2 l' ]3 G! B1 o
- reg [11:0] pcout, pcnext;
8 B# A3 ]7 k2 U - reg [15:0] out;
: f& f& a2 \9 b( ^ - T1 l, R# a: h% {0 r* |
- statef statef0(.clk(clk),.reset(reset),.run(run),.halt(halt),.cs(cs));
, q- u$ ]- T9 n) L3 _, e - stackm stackm0(.clk(clk),.reset(reset),.load(dbus2qtop),.push(push),.pop(pop),.pop2(pop2),.thru(qthru),.d(dbus),.dthru(ramout),.qtop(qtop),.qnext(qnext));
5 z" I* p* m2 _0 m - alu alu0(.a(qtop),.b(qnext),.f(irout[4:0]),.s(aluout));9 |$ g1 p7 u' R5 N! K: M! Y4 V- `
- dpram #(16,10,1024) dpram0(.clk(clk),.load1(dbus2ram),.addr1(abus),.addr2(pcnext),.d1(dbus),.q1(ramout),.q2(irout));
$ k5 T2 V C/ M* e9 U
复制代码
3 }1 F6 N+ m; _' J9 V- k物理上是这样的
* e; f- x" ?+ }8 m3 j$ j* L0 d' H# }( X
& a, C% ]! ]! z {7 g
然后会调试BUG,看时序。0 o6 y3 q* [7 Z* y- r
前置:时序用MODELSIM,综合用QUARTUS II 等等* i1 o7 [6 i+ p
9 d' x; g. K. f4 g. f
然后此时才刚刚开始。, Z) \0 W! Q# y- w5 I7 M! c
继续生成电路网表,时序收敛,如果不对继续返回上述流程继续调试。
+ n- Q3 C9 ]: i' Z9 R7 I D前置:Synopsys回顾一下
% F5 b8 m: u) t& d& c% S- v \4 f( [) t+ I# e8 j+ W! t
' h+ u) G% w. ]$ K, ?
9 q" u$ G. e* W, |3 v+ f6 i. ]( V C5 n5 Q9 W5 B0 y
9 c' G- ^. `) X1 v7 h
8 | ?$ I9 h1 g1 c- T) X2 c此时应该生成版图文件,然后根据制造厂商提供的物理器件库进行最后的各种设计规则检查。
& q1 h0 o% D' ]前置:集成电路版图设计,软件有Cadence:Virtuoso Layout Editor
) T1 h, g# W3 v# p
0 [+ Z* D% h5 v) T2 U8 I' Z s
, v! `9 o( p$ z& ?# y; R送到代工厂,还要懂元器件前置:半导体物理,半导体器件物理,固体物理,电介质物理,量子力学,热力学与数理统计。+ R: g6 T7 O o+ @/ I
H0 P9 ]1 o) g! m: Y
# O- h/ [' Z. w# J: M根据得到的图表设计版图和工艺流程,大概是这样 N `& r; F/ A. ?( Q
前置:集成电路制造
# B$ D+ e! s5 O0 D
( P/ \/ l9 d$ [0 h; l+ L/ |' V
然后进行电气测试,电磁测试,最后封装。
3 o- k7 E; M2 a2 i8 c( O前置:集成电路封装技术
' p6 j% [& U; c' G; S5 t3 ^( k& S" }) p3 S
- c0 W& i# ~5 x. ~1 \, ^; i0 Y, M0 U
( t1 L; L" r8 Q) N3 r最后不能忘记出片的时候+ h$ n# D1 d2 `2 X+ }( s
焚香沐浴更衣,朝南拜三拜,祈祷不会有大问题。4 `/ z- M) ^+ ^; l K7 z
7 n0 ^! z- F! Y1 V' t$ ~4 u
4 w1 I6 h+ X( ^( F1 o
第二步,设计系统驱动。* u. B |0 E( E! ?1 P. }
( Q/ z$ Z5 g. m* I
终于得到了物理上的片子! o ?9 M( m t n, p2 S" e
我们开始写汇编器,编译器。- t/ s5 W8 v9 k- d" H/ S7 m
本质上烧写进ROM的是这样的机器码。
2 X! P; O$ C3 m e. U5 c
1 u5 L8 R2 D/ B; o汇编器(把汇编语言变成机器码). I9 ^% H9 A, B; }4 ~" U3 M# ^
前置:perl- 5 H9 Y) M u- l
- #!/usr/bin/perl -W ~9 Q6 ? R# k5 n5 w3 @5 P
- //********
2 o& _% A- g1 E% z& n4 ]! B - *********//( |' k n* \, w/ u/ B* o3 d
- print "*** LABEL LIST ***\n";
2 h: V) _. U' T - foreach $l (sort(keys(%label))){
( V' ]8 G: q; \1 Q - printf "%-8s%03X\n",$l,$label{$l};
/ U A7 B: f3 e- e( X - }
2 X1 L ~. x( r7 {( m; } - 6 |8 ` E! u( l! b
- $addr=0;
- h V! P( i5 [3 {9 r' x - print "\n*** MACHINE PROGRAM ***\n";
! J, r& c, Q" ^; w - foreach (@source){/ G6 a2 q$ U$ I: t) M. B' \1 S
- $line = $_;4 \5 X U5 v6 y& g
- s/\w+://;
) n* d* b7 L% N2 S2 I+ z5 b6 Y - if(/PUSHI\s+(-?\d+)/){% u+ E4 l: Q8 O/ i9 D6 i% K2 L
- printf "%03X:%04X\t$line",$addr++,$MCODE{PUSHI}+($1&0xfff);
; ?, O/ l: J, M! E. F6 [ - } elsif(/(PUSH|POP|JMP|JZ|JNZ)\s+(\w+)/){' B r4 P2 Z( h. o$ W# o: `
- printf "%03X:%04X\t$line",$addr++,$MCODE{$1}+$label{$2};
% D. O% t7 H! x* V- g% b1 c - }elsif(/(-?\d+)/){4 x" t( B* K1 |# Q
- printf "%03X:%04X\t$line",$addr++,$1&0xffff;" M6 J+ F( \: V9 _
- } elsif(/([A-Z]+)/){
% u _% ] h2 Q V3 v3 Y - printf "%03X:%04X\t$line",$addr++,$MCODE{$1};
- A+ A, q8 B, {% [, [' W5 y - } else {! _& q- l6 \/ L3 t# ?
- print "\t\t$line";
G* P) B, l- \; D% s! ~ - }
. @* e. ]8 F! P) o - }
复制代码
( F5 q+ |% S8 @: P9 Z# H* M编译器 BISON和FLEX(把高级语言转换成汇编语言)
+ \4 X# G5 h0 q' Z) H N3 L前置:编译原理
. P; Y9 f( I; |) M/ t- 8 h, W# c# m# g3 v
- %{2 `: n; F" z: I2 t1 d% G3 {7 q; h
- #include <stdio.h>
$ s# @$ N- D+ [5 ~ - %}
2 L$ W4 g1 ~- D' l `9 I7 A6 \ - %union {char *s; int n;}$ |4 c& R" a: g$ z. k( D, h0 _
- %token <s> NAME NUMBER6 i! _0 C$ a* ]( J4 D* k
- %destructor { free($); } NAME NUMBER
! m/ q8 q/ n& f+ U - %token <n> IF WHILE DO1 `3 h; t2 O+ S/ m* d8 s4 @+ O
- %type <n> if05 _$ \$ z$ o x* U3 g2 m+ D9 T
- %token GOTO ELSE INT IN OUT HALT
4 l# ]; `! r" U5 } - ...# g7 q: j6 u$ Y d% ^$ |5 E
- ...
6 o/ h0 Z& V0 b6 F' K7 l% T; ] - %%$ G6 |" N1 B4 i/ ~3 \: `9 O- v& ^
- int yyerror(char *s){ printf("%s\n",s); }
& |3 Y- A) o+ X7 E& i - int main(){ yyparse(); }6 A9 O6 C0 G, n) o2 N% K; |& Z8 I$ C
- %{
! |* ?2 J8 z/ A4 [/ u0 w2 ` - #include <string.h>5 W. `) J5 o: O
- #include "y.tab.h"
% A# m- n. c. E; C+ ` - int n=0;
9 b0 w+ a8 X |; Q1 B! L! ^ - %}5 h7 Z3 F. `; H5 Z
- ...
& j2 ^& ^+ P8 m+ Z - ...
' k6 t! A: }* g0 Q" Y - while {yylval.n=++n;return(WHILE);}
Z {/ ^2 Q4 f - [0-9]+ {yylval.s=strdup(yytext);return(NUMBER);}$ k6 P: P; m B! b& X
- [a-zA-Z][a-zA-Z0-9]* {yylval.s=strdup(yytext);return(NAME);}1 ?) \3 V- c) u/ x
- . {return(yytext[0]);}
% Z- [) P( E; f- i# D" J - %%* H5 F1 y7 L3 o1 G2 e, t% [
- int yywrap(){ return(1);}
' r3 n- z ?# M7 a) I6 T6 Y
复制代码 " _7 ]" v" }0 P
终于可以固化进ROM可以跑程序了,你还需要一段小型的开启代码(bootloader)
k- a: @+ j& U R前置:汇编语言
. m( x( r! {' ?- 5 Q, P4 Q; W6 c. U% B
- start: JK start
" F- @( l, S/ ~0 B+ l9 D - nop
" q7 T- C# `* c6 R$ ^ I - sdal 32
1 T; f+ {6 j$ ^( m/ J) `) P - sdah 04 |1 X* Y) f0 e3 V$ s* p5 z
- datp) ?! o, _) q0 s" ?3 m6 G O
- loop: ting
' U4 u! H/ x1 c4 O1 r - inl
3 e: y1 H" j" A. m- O, ^- ?. W - ting
! W' u) F! a) R o9 P - inh
* d* Q5 E) V p, i$ d- Q - jend cxcute
3 t* n4 k( H4 t+ u - nop
$ M% L/ N; R3 u- O" q$ a% Z: R - jmp loop! h0 X; V; e0 z5 D' D- D. J; c
- inc
! A+ {' A. h p - excute: call 329 Z2 c: o1 C6 G0 O2 Z. K0 C. a
- nop: r* G, g5 A' H9 E* T
- jmp start# G5 n7 n7 \. g8 n' X( I
- nop
复制代码
" B7 r0 V3 U* d" U# q: X/ X2 g然后开始写操作系统
4 Y. b* m/ j. l$ [+ k6 o2 k前置:ucos(嵌入式操作系统)
& T4 h: }2 Y2 G+ r, S: z4 f' R) L系统宏定义,系统功能配置,系统头文件,初始化文件,调度文件,任务管理文件! ^0 X, Q1 S/ n& K# R
系统时间管理文件,信号量文件,邮箱文件,消息队列文件,内存管理文件,系统服务文件,MAIN文件。
A1 \7 e1 ?: H4 U3 u0 ^& f7 Z写操作系统中的任务5 l; T- i/ g1 Y, P2 d
前置:C语言,数据结构,算法导论。- v* D) {1 ~! K
- % I7 v" |0 n% _/ l0 V+ d4 ?
- double KalmanFilter(const double ResrcData,
+ q/ @. L8 P4 n& V, z6 H - double ProcessNiose_Q,double MeasureNoise_R,double InitialPrediction). j# L- }% A$ o' c& h
- {
" D* w3 p p1 g- p" L+ o - double R = MeasureNoise_R;3 y3 Z# @9 f( y" h
- double Q = ProcessNiose_Q;9 P6 Q! {6 I5 W5 [: [6 X
- 3 \- L. |# k& F; J6 _" ?& {
- static double x_last;8 j7 ]" E- S& i- B: X" [3 E
3 ]' K; Y v, N- double x_mid = x_last;
1 Z! t. S5 E! k# f& Z( z1 { - double x_now;
* A2 N0 J9 |) ]8 S9 H& S; R5 t
4 B4 k# D3 i# u* G+ ~- static double p_last;
& C0 G* ?( @3 x+ H - + m. u) S! T, ~5 n8 U( D) u
- double p_mid ;( ]0 U% z; `" J; o8 X8 ~4 a: p# u) D
- double p_now;1 \/ p1 P6 g; X5 J
- double kg; ; W2 W- t; {. o, ]0 h
1 K$ X! K# ~" a1 d8 h# G6 ^- x_mid=x_last; //x_last=x(k-1|k-1),x_mid=x(k|k-1)
3 b, G6 o( m }( f a - p_mid=p_last+Q; //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声
" Y2 Z2 {* J7 k* H+ L8 D - kg=p_mid/(p_mid+R); //kg为kalman filter,R为噪声9 C$ j0 p& @$ g+ F" P8 b
- x_now=x_mid+kg*(ResrcData-x_mid);//估计出的最优值
7 X2 e- o b$ X: m -
% a; T& l+ j: U - p_now=(1-kg)*p_mid;//最优值对应的covariance 7 y8 k3 M8 b0 G0 P
1 |2 C5 Z# D. O& n2 j# X. R- p_last = p_now; //更新covariance值
& O; |* T& Q/ Z- ]) E6 ? - x_last = x_now; //更新系统状态值+ Y% D# _, i3 i; g. I
2 k+ F/ ^- Q5 u- return x_now;
$ W# X. D+ Y6 ^9 x - }
复制代码
4 f w+ B4 o) x! p# c4 v$ v8 j! _拿着含辛茹苦的板子还需要配置最小系统以及外围器件
& G% s" D$ B1 p5 Q* X前置:PCB设计和制造,电焊等技艺,模电、高频电子线路,信号与系统
4 A7 m5 ?' V6 {7 J& ~" x. k+ p/ x$ j/ b) l; b/ h
, K5 T4 {1 M# \) N1 c1 ^/ d
( O& }/ ?* J9 v5 L" B0 q
/ G. q9 W0 T" b如果有信号传输
9 t3 p: g! w, L通讯协议
5 }8 S+ B, [0 W8 O( z前置:SPI,I2C,CAN,TCP/IP、wifi等等0 o& g! p% i- r+ M2 s" U# C# Z! x3 M
3 i0 H6 |& ^8 ?4 C! T- uint SPI_RW(uint uchar)
/ ~0 k# K+ e! g9 q" S5 k - {( V- a; x4 ~* g" V7 b& V
- uint bit_ctr;
u/ z) P; t: L5 F - for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit. v k% |4 ~& K, ?4 C# T
- {
: K: [# ?( e/ l0 i$ }8 V' I - MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
/ {1 B1 x* a( P0 S/ w" @ - uchar = (uchar << 1); // shift next bit into MSB..0 F( d7 A' e L0 V5 b1 D3 z
- SCK = 1; // Set SCK high..
8 m! d- _) C7 o2 v - uchar |= MISO; // capture current MISO bit U% j) M% p& H2 W: W
- SCK = 0; // ..then set SCK low again
9 ]& M; X" u# d% {5 g6 X% z7 G - }
$ }) Q& h1 y( o, k# C - return(uchar); // return read uchar3 v' B M* q* G( y! A7 I5 r& v8 e
- }
复制代码 RF天线+ D' f2 t3 ~2 i) m/ i' V
前置:微波技术,电磁场与电磁波,HFSS,天线技术等等。4 ]7 c8 |9 ]4 s2 }3 R
; m: x0 z" C9 E- o+ O Q |