单片机集成wifi等_从零制作单片机需要哪些知识?

1309a1d57c77bdeb792cc21363d79767.gif1309a1d57c77bdeb792cc21363d79767.gif1309a1d57c77bdeb792cc21363d79767.gif  请点击上面 免费关注...

说一下从芯片制作开始到最后编写驱动程序整个过程中每一步所需要的知识。

作者:彭谟威
链接:https://www.zhihu.com/question/28580074/answer/93515413

来来来,让我们一起,左手右手一个慢动作。

每一个方向都值得一个人用一生去钻研,每一个步骤都有其自身的魅力。

第一步,做出实体芯片。

单片机一般理解为MCU(Microcontroller Unit,微控制单元)
包含定时器、ALU(Arithmetic Logic Unit,算术逻辑单元)、内存、寄存器、总线等部分
而普通的意义的单片机还包含GPIO、串口(UART)、DMA、协处理器、AD\DA等等。

看懂如下图
前置:计算机组成原理,微机原理。

96ec91756f95f483971e1b9c26f9d708.png


流水线

d089ffe0677716d9824f133f0e8cf7b9.png


前置:数字逻辑电路,集成电路设计及其EDA技术,verilog
把各个模块细分为寄存器级,比如移位运算器、节拍器、译码器、存储器等

module minicpu(clk, reset, run, in, cs, pcout, irout, qtop, abus, dbus, out);

input clk,reset,run;
input [15:0] in;
output [1:0] cs;
output [15:0] irout, qtop, dbus, out;
output [11:0] pcout, abus;
wire [15:0] qnext, ramout, aluout;
reg [11:0] abus;
reg halt, jump, pcinc, push, pop, thru, qthru, dbus2qtop, dbus2ram, dbus2obuf, ir2dbus, qtop2dbus, alu2dbus, ram2dbus, in2dbus;
reg pop2, ir2abus, qtop2abus, qnext2abus;
reg [11:0] pcout, pcnext;
reg [15:0] out;

statef statef0(.clk(clk),.reset(reset),.run(run),.halt(halt),.cs(cs));
stackm stackm0(.clk(clk),.reset(reset),.load(dbus2qtop),.push(push),.pop(pop),.pop2(pop2),.thru(qthru),.d(dbus),.dthru(ramout),.qtop(qtop),.qnext(qnext));
alu alu0(.a(qtop),.b(qnext),.f(irout[4:0]),.s(aluout));
dpram #(16,10,1024) dpram0(.clk(clk),.load1(dbus2ram),.addr1(abus),.addr2(pcnext),.d1(dbus),.q1(ramout),.q2(irout));

物理上是这样的

8add2889b39c07ff504d4608cea7c58e.png


然后会调试BUG,看时序。
前置:时序用MODELSIM,综合用QUARTUS II 等等

然后此时才刚刚开始。
继续生成电路网表,时序收敛,如果不对继续返回上述流程继续调试。
前置:Synopsys

回顾一下

b7406bb0662f709677d41ef72213cf66.png
7d2ba7b7e96e2334c45d84a028331634.png


此时应该生成版图文件,然后根据制造厂商提供的物理器件库进行最后的各种设计规则检查。
前置:集成电路版图设计,软件有Cadence:Virtuoso Layout Editor

c916bf6a757809e03a7f3810e787d36f.png


送到代工厂

还要懂元器件
前置:半导体物理,半导体器件物理,固体物理,电介质物理,量子力学,热力学与数理统计。

2b6b2345a7f7cac252568385f7987289.png


根据得到的图表设计版图和工艺流程,大概是这样
前置:集成电路制造

cc1767b35a52e4cd7dc37cc93fc53034.png

然后进行电气测试,电磁测试,最后封装。
前置:集成电路封装技术

a3272be5034de652f45922acf44ded0c.png

最后不能忘记出片的时候
焚香沐浴更衣,朝南拜三拜,祈祷不会有大问题。

6d8c8a35f0ae7ee7ba930c0455614500.png

第二步,设计系统驱动。

终于得到了物理上的片子
我们开始写汇编器,编译器。
本质上烧写进ROM的是这样的机器码。

b968b37a2fb6e8b3cdadc336e8c53ec5.png


汇编器(把汇编语言变成机器码)
前置:perl

#!/usr/bin/perl -W
//********
*********//
print "*** LABEL LIST ***\n";
foreach $l (sort(keys(%label))){
   printf "%-8s%03X\n",$l,$label{$l};
}

$addr=0;
print "\n*** MACHINE PROGRAM ***\n";
foreach (@source){
   $line = $_;
   s/\w+://;
   if(/PUSHI\s+(-?\d+)/){
      printf "%03X:%04X\t$line",$addr++,$MCODE{PUSHI}+($1&0xfff);
   } elsif(/(PUSH|POP|JMP|JZ|JNZ)\s+(\w+)/){
      printf "%03X:%04X\t$line",$addr++,$MCODE{$1}+$label{$2};
   }elsif(/(-?\d+)/){
      printf "%03X:%04X\t$line",$addr++,$1&0xffff;
   } elsif(/([A-Z]+)/){
      printf "%03X:%04X\t$line",$addr++,$MCODE{$1};
   } else {
      print "\t\t$line";
   }
}


编译器 BISON和FLEX(把高级语言转换成汇编语言)
前置:编译原理

%{
#include
%}
%union {char *s; int n;}
%token NAME NUMBER
%destructor { free($$); } NAME NUMBER
%tokenIF WHILE DO
%typeif0
%token GOTO ELSE INT IN OUT HALT
...
...
%%
int yyerror(char *s){ printf("%s\n",s); }
int main(){ yyparse(); }
%{
#include
#include "y.tab.h"
int n=0;
%}
...
...
while    {yylval.n=++n;return(WHILE);}
[0-9]+       {yylval.s=strdup(yytext);return(NUMBER);}
[a-zA-Z][a-zA-Z0-9]*    {yylval.s=strdup(yytext);return(NAME);}
.            {return(yytext[0]);}
%%
int yywrap(){ return(1);}


终于可以固化进ROM可以跑程序了,你还需要一段小型的开启代码(bootloader)
前置:汇编语言

start: JK start
      nop
      sdal 32
      sdah 0
      datp
loop:  ting
      inl
      ting
      inh
      jend cxcute
      nop
      jmp loop
      inc
excute: call 32
       nop
       jmp start
       nop

然后开始写操作系统
前置:ucos(嵌入式操作系统)
系统宏定义,系统功能配置,系统头文件,初始化文件,调度文件,任务管理文件
系统时间管理文件,信号量文件,邮箱文件,消息队列文件,内存管理文件,
系统服务文件,MAIN文件。

写操作系统中的任务
前置:C语言,数据结构,算法导论。

double KalmanFilter(const double ResrcData,
                                       double ProcessNiose_Q,double MeasureNoise_R,double InitialPrediction)
{
       double R = MeasureNoise_R;
       double Q = ProcessNiose_Q;

       static        double x_last;

       double x_mid = x_last;
       double x_now;

       static        double p_last;

       double p_mid ;
       double p_now;
       double kg;        

       x_mid=x_last; //x_last=x(k-1|k-1),x_mid=x(k|k-1)
       p_mid=p_last+Q; //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声
       kg=p_mid/(p_mid+R); //kg为kalman filter,R为噪声
       x_now=x_mid+kg*(ResrcData-x_mid);//估计出的最优值
               
       p_now=(1-kg)*p_mid;//最优值对应的covariance        

       p_last = p_now; //更新covariance值
       x_last = x_now; //更新系统状态值

       return x_now;                
}

拿着含辛茹苦的板子还需要配置最小系统以及外围器件
前置:PCB设计和制造,电焊等技艺,模电、高频电子线路,信号与系统

b1cdc1632398d7422eeef0476ae6a26f.png
fefb7d7d556030a9ed29ced288825423.png

如果有信号传输
通讯协议
前置:SPI,I2C,CAN,TCP/IP、wifi等等

uint SPI_RW(uint uchar)
{
uint bit_ctr;
  for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  {
MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
uchar = (uchar << 1);           // shift next bit into MSB..
SCK = 1;                      // Set SCK high..
uchar |= MISO;        // capture current MISO bit
SCK = 0;              // ..then set SCK low again
  }
   return(uchar);            // return read uchar
}


RF天线
前置:微波技术,电磁场与电磁波,HFSS,天线技术等等。

Xinghom

33 人赞同了该回答

想从头开始制作单片机,...
It's a long story~
OK, let‘s rock.

/*************************分割线****************************/

单片机-->学名MCU  ( micro control unit)  
首先,它是个芯片~  芯片设计的流程
------>>>>现在的芯片都是如何设计的呢?- 芯片(集成电路)(总概 from @又见山人)

其中所需要的知识有:(仅考虑设计MCU)

电路分析,
数字电路,
模拟电路,
半导体工艺与器件,
计算机结构,
微处理器原理,
HDL语言,
EDA工具(综合,仿真,布局布线) 等

芯片设计好没问题之后呢,需要拿你的设计去foundry制作~ 
这又是一个美妙又漫长的故事~ 
好在普林斯顿的phd大神耐心的写出了这个详细具体又生动的故事

——>芯片里面有几千万的晶体管是怎么实现的?- 中央处理器 (CPU)  from @呆涛

想要学习芯片制造工艺里面的知识就更多了,比如:物理(如半导体物理,量子物理),材料等和芯片制造工艺有关的内容及步骤....    自己没切身接触过,涉猎不足,有待补充.

这样下来,从设计前端,到后端,验证,再到工艺制作,流片,封装 之后。MCU就制作出来啦!Oh,Cool!

如果是ARM的单片机, 你就可以往里面烧 bootlooder ,系统 ,写驱动了...(嵌入式开发方向)
需要的知识有:C语言,汇编,操作系统(linux wince 等), linux内核....  etc

整个过程的任何一个 “步骤” 都需要要考虑很多方面的东西,成为IC领域的学习方向,并非一句话带过那么简单。正如又见山人的回答,如果你一己之力学会了整个芯片设计制作,写驱动就真是如喘气放屁一般....

编辑于 2015-03-09

0335c268246f572e3c342f272a5628f6.png

axiom

电路原理,模拟电路,数字电路

c语言

然后买个开发版,一个个例程跑吧!!

又看了一下问题。添加如下:

找一本电子书。上面开始有介绍固体物理,掺杂,二极管,三极管原理

然后是场效应管,然后是集成电路制造。

数字电路,逻辑门,触发器,乘法器,搞明白了,可以自己学hdl
语言,写FPGA,你可以自己搞一个8位得单片机了。有源代码!!可以看。

然后是软件编程,看汇编语言,51入门简单,资料多!!

结合8051得微内码结构,取指令,译指令,自己理解cpu结构!!!!(现在都RISC体系,好像微内码不好找了)

然后是c语言了,c++。这个又是一步

编辑于 2015-03-09

二氧化硅--情商堪忧的少年

本人作为一个微电子本科的学生,感觉如果说你只是为了制作一块MCU,你可以不特别会比较基础的东西,比如半导体物理,电子器件一类的课程,但是你得必须会写硬件描述语言。MCU的逻辑结构是非常复杂的,这一步会相当相当难。ok,现在你写好了MCU的硬件描述语言脚本,也仿真无误了。然后用EDA软件综合仿真,最后用画版图的软件画出MCU的集成电路版图,这一步也是非常复杂的,不过现在数字集成电路的版图可以自动布局布线,但是你必须得会基本的版图绘制方法,因为接口一类的都是模拟电路,是不能自动生成的。然后什么版图检查DRC,LVS,寄生参数什么一类的,等到版图里没有一点错误,物理上还有电学上都符合要求的时候就算版图绘制完成。

———我是设计和工艺的分割线—————

现在你就可以把你画的版图交给厂商流片,这一步会画很多很多钱。。。然后测试,封装。OK你自己的MCU就做好了。

如果说你连工艺都要自己弄,先不说课程的事,土豪能做个朋友吗?

———我是硬件和软件的分割线—————

至于驱动一类的很简单了,按照之前硬件描述语言脚本里的逻辑,把各个功能用函数的形式写出来就行。。

个人感觉一个人可以完成所有的步骤,但是时间啊,金钱啊,性能啊。。。

至于你得会啥。。数电,模电,硬件描述语言,EDA软件使用,微机原理,汇编以及C语言还有很多细枝末节的知识,随时都可能会有问题出现

个人看法,欢迎各位大神给予指导

本文转自网络,版权归原作者,如果您觉得不好,请联系我们删除!

↓点击下方

“阅读原文”

查看更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab案例_基于matlab和frost平台的cassie案例足式机器人运动学和动力学计算实现过程...

1、软件平台Maltab2019aMathematica 12.1.0Frost2、实现步骤&#xff08;1&#xff09;、安装matlab2019a&#xff08;2&#xff09;、安装Mathematica 12.1.0&#xff08;3&#xff09;、下载frost-dev-master软件说明&#xff1a;https://ayonga.github.io/frost-dev/pages/i…

计算机毕业设计----SSM实现的一个在线文具学习用品购买商城

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员信息管理,查看用户信息,新闻公告信息管理,文具类型信息管理,城市信息管理,配货点信息管理,文具信息管理,订单信息…

python2和3语法区别_python2和3语法区别

以下是Python2和Python3中的一些语法差异&#xff0c;有需要的小伙伴可以学习下。 print语句 在Python 2里&#xff0c;print是一个语句。无论你想输出什么&#xff0c;只要将它们放在print关键字后边就可以。在Python 3里&#xff0c;print()是一个函数。就像其他的函数一样&a…

python如何循环使用input_python基础知识input到while循环

j周笔记 输入与输出 1.输入 input (请输入内容) 字符串 2.输出 print(输出到控制台) 变量vairable 变量就是相当于我们人的名字 1.名字 2.存储位置 3.该存储位置的内容解释 ​ name(名字) 张三(值(存储位置)) 变量名 值 注意: 给变量取名字时,一定要遵循python语法规范 1.变量…

echarts tooltip被遮挡_echarts 的tooltip定位到当前图,避免溢出和遮挡

问题&#xff1a;tooltip初始是跟着鼠标移动&#xff0c;当内容过多&#xff08;宽度高度过大&#xff09;&#xff0c;会被其他遮挡或者会溢出屏幕外解决&#xff1a;思路&#xff1a;根据官方文档&#xff0c;鼠标在左侧时&#xff0c;tip在右侧&#xff0c;鼠标在右侧时&…

idea mysql错误提示_idea提示错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

碰见了一个问题&#xff0c;一直无法解决&#xff0c;希望大家帮帮忙。这是连接mysql的JdbcUtils代码&#xff1a;public class JdbcUtils {// 配置文件private static Properties props null;// 静态块保证只加载一次static {InputStream in JdbcUtils.class.getClassLoader…

python中seed的用法_Python中的seed()方法怎么用

Python中的seed()方法怎么用?下面是seed()方法的相关介绍&#xff1a; 描述 seed() 方法改变随机数生成器的种子&#xff0c;可以在调用其他随机模块函数之前调用此函数。 语法 以下是 seed() 方法的语法&#xff1a;import random random.seed ( [x] ) 注意&#xff1a;seed(…

bootstrap 输入错误提示_win7系统提示explorer.exe应用程序错误怎么办

在电脑当中弹出错误提示框可谓是多种多样&#xff0c;详细有很多电脑都有碰到过&#xff0c;最近有位win7系统用户在使用电脑的过程中&#xff0c;系统总是提示“explorer.exe应用程序错误”&#xff0c;用户不知道怎么解决这个问题&#xff0c;为此非常苦恼&#xff0c;那么wi…

json阅读器_Flutter小说阅读器系列一:使用Bloc模式获取起点小说关键字提示

Bloc模式下的小说关键字提示效果图最近难得有些闲暇时间&#xff0c;所以我又打算做一个小说阅读器&#xff0c;以前倒是用RNGolang写了一个&#xff0c;不过当时太过放飞自我导致自己看起来都很费力&#xff0c;这次我准备换成Flutter试一下。先简单将小说阅读器分为以下几个部…

python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法

我来教你 js文件怎么通过python访问数据库&#xff0c;希望能够为你带来帮助。 1、如果是要提交表单内容给 服务器的 python 处理&#xff0c;那么只需要在表单 里面的 action 填写服务端的处理路由就可以了。或者用 指向服务器路由get querystring。前端方面不需要python啊。…

python 初始化一个4维向量_看图学NumPy:掌握n维数组基础知识点,看这一篇就够了...

摘要:NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。国外有位程序员讲NumPy的基本运算以图解的方式写下来,让学习过程变得轻松有趣。 NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。然而对初学者来说,NumPy的大量运算…

win8 mysql6_Win8系统 MySQL 6.0 安装图解

Win8系统 MySQL 6.0 安装图解(作者&#xff1a;wanghui2015/04/08)1、首先双击mysql-6.0.10-msi&#xff0c;会出现如下图所示界面。点击next&#xff1b;2、出现如下界面&#xff1a;这三个为选择安装类型&#xff0c;新手可以选择Typical或Complete就可以了。咱们为了看一下安…

python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统

如前篇所介绍&#xff0c;用Shell Lab测试台软件配合之前介绍的任意款实验板&#xff0c;都能方便地实现ADC电压测量&#xff0c;但遇到两个问题&#xff1a;示例代码虽然众多&#xff0c;但大都默认ShellLab类型的控制器&#xff0c;需要手动改为Mcush.Mcush类型才能运行&…

java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase

转载自微信公众号Hadoop实操温馨提示&#xff1a;如果使用电脑查看图片不清晰&#xff0c;可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github&#xff1a;https://github.com/fayson/cdhproject提示&#xff1a;代码块部分可以左右滑动查看噢1文章编写目的越…

wxpython使用简介_wxpython简介

Python​ Python是一种成功的脚本语言&#xff0c;它最初是由Guido van Rossum开发的。它于1991年首次发布。Python的灵感来自于ABC和Haskell编程语言。Python是一种高级的、通用的、多平台的、解释型的语言。有人更喜欢称它为动态语言。它很容易学习。Python是一种极简主义语言…

电脑4次连续故障音_格力空调电子膨胀阀故障判定与“E6”处理方法

一、电子膨胀阀常见故障原因电器电子膨胀阀是一种利用电子控制器通过电缆向线圈发出脉冲控制信号&#xff0c;控制施加于膨胀阀上的电压或电流&#xff0c;从而控制阀针的动作实现阀口流通面积改变达到流量自动调节目的的节流器件&#xff0c;是空调器的重要部件之一&#xff0…

mysql+性能+计算列_MYSQL性能优化的最佳20+条经验

当你查询表的有些时候&#xff0c;你已经知道结果只会有一条结果&#xff0c;但因为你可能需要去fetch游标&#xff0c;或是你也许会去检查返回的记录数。在这种情况下&#xff0c;加上 LIMIT 1 可以增加性能。这样一样&#xff0c;MySQL数据库引擎会在找到一条数据后停止搜索&…

ClickHouse 入门与实战教程

目录 1. ClickHouse 简介 什么是 ClickHouse&#xff1f; ClickHouse 的优势和特点 适用场景 2. 安装 ClickHouse 3. ClickHouse 的基本概念 4. ClickHouse 的基本操作 创建数据库和表、插入和查询数据 使用 MergeTree 引擎处理时序数据 管理分区 创建带有分区的 Mer…

sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据

算开个头&#xff0c;不算特别实战扫描电子显微镜&#xff0c;材料开发不可缺少的分析仪器。原理就不详述了。材料的形貌&#xff0c;具体长什么样的都可以看得很清楚。材料表面的形貌很多情况下会和材料的物性产生直接关系&#xff0c;比如说可以从SEM看出粒子的直径分布&…

arcgis制作空间变化图怎么做_听说如果做数据分析不用GIS,会被开?

Q你有没有遇到这样的情况&#xff1f;身边的同事或同学经常说什么高程图、坡向图、坡度图、生态水文图、热力密度图、大数据算法&#xff0c;而自己却一无所知&#xff0c;心里感到特别的慌啊。文末附ArcGIS最新版及超强数据神器 很多人会说&#xff0c;“设计师是感性的&#…