菜鸟问题:硬件怎么设计呢?
看到一些复杂的硬件系统,没有想明白是怎么设计的?
PC软件目前多是线性运行,最多是多线程,真正并行的代码我们很难涉及,microsoft,intel给我们提供了库。
可是我发现,电子系统多是并的,尤其模拟电路。那么,这给电路,尤其系统涉及带来很大的复杂度。
我发现他无法使用类似程序流程图的方法进行描述。那么,实际当中大家是如何设计,并遍历可能出现的问题呢?状态图/表?
对于复杂的系统或大规模的模拟电路来说,是怎么进行的呢?
模块化?
采用Block(类似于c++的class?)
用port做端口(类似于C++的interface?)
逐个封装,再通过root sch进行封装?
每个模块在使用流程图和状态图分析并遍历各种状况?
请各位行家、前辈指点,谢谢!
俺也是菜鸟,没明白LZ的意思
呵呵,看样子我菜到一定程度了,话都没有说利索
我的意思是说:
在做电路设计的时候,可能有好几个功能部分,比如手机充电模块设计上(我猜的 ):
电池部分有:过压/欠压保护,过流保护,短路保护,恒压/恒流,温度控制等等
电源输入部分:过压/欠压保护,过流保护,短路保护
边打电话边充电的话,可能还有电源的旁路选择(我也不知道怎么称呼,我猜线充的时候,系统可能将电池给手机充电的电路断开,改由充电器直接给手机充电,这样应该能延长电池的寿命的吧?)
系统有这么多的情况,那么在做整体设计的时候(尤其不要CPU支持的情况下),如何遍历可能发生的情况呢?某个“量的变化”可能导致一种或几种情况的发生。而且每个节点上,存在N个IF_Then的情况。
这在软件设计的时候,流程图和状态图基本可以解决问题。但是电子电路是完全“并行”的,用线性思维的方法好像不实用啊?
因此,我这个搞软件的对硬件的设计感觉太高深了,希望大家给介绍介绍
呵呵,谢谢啦
(不知道说明白没)
听懂你的意思,可惜,俺也是菜鸟,,不知道如何做?和LZ一起等高人现身说法
俺恐无法完整回答,只能抛砖引玉,有些表述凭记忆可能不太准确,诚挚接受拍砖。
传统的电路通常是以一组器件去完成某一项功能,而多项功能时则往往需要用分别的电路去完成,这种自然的“并行处理”并非是刻意从难设计的,其实由独立的电路各自完成单一的功能反而是最简单的事。
软件执行的基础是数字时序电路,CPU概念源于“顺序存储,顺序执行”的冯·诺依曼结构,也就是在某一时刻CPU只做一件事。软件所说的并行处理其实只是宏观上,若把时间放大了看,在微观下指令仍然是被顺序执行的,只是通常PC在操作系统的调度下,应用程序的执行(进程)被分割成细微的碎片,由操作系统按一定的分时分优先级算法赋予或剥夺它们执行权,通常的用户因看不到这些细节以为真的是“并行处理”罢了。 当然,近年来的一些新型CPU为提高效率嵌入了能并行处理的流水线结构,不过这种极有限的“并行”跟硬件的全面铺开是不同的,总体还是“顺序”。
关于硬件设计,画电路图仍是最基本的手法。随着数字电路,尤其是时序电路规模的日益庞大,已有越来越多的工程师使用硬件描述语言来进行设计(典型的两大支柱是VHDL和Verilog HDL)。这些语言不是C,但对学过C的人来说并非难事,看了会有曾似相识感觉;另外还有干脆就是C的“System C”语言近年也崭露头角。不过跟已相当规范化的数电相比,在边边角角都有雕琢余地的模电要用语言来描述还有不少困难,要实现实用化的语言设计恐怕还尚需些时日。
(不知罗嗦了这么多,有没跟楼主的问题对上号……)
从软件转硬件的人开始时最易混淆就是“顺序”和“并行”。硬件描述语言里的每个process都是独立并行运行着的,不像软件,看着代码的前后就知道程序执行的顺序。
谢谢仙猫的回复,我要问的问题中心思想也基本类似。
无论vhdl,verilog等,虽然是语言,但是其过程是"并行"的,除了状态也许时序更为重要。
虽然,其"编程"的复杂度比PC程序大很多,但是对于模拟电路来说,问题可能变得更加复杂:不仅有时序,还有状态的很多种可能(数字电路不过01),电流电压范围更宽。
面对这种情况,对于进行系统设计(还是大规模的模数混合设计?)的工程师来说,如何在设计阶段是如何思考并进行设计的呢?
写一个hello world程序很简单,可是写一个操作系统却很难。
那么对于大规模的模数混合系统大家是怎样进行规划、设计、调试的呢?
系统不仅仅要能够正常运行,还要满足抗干扰,辐射、高低温湿度等等问题。
这些问题放在一起,搞总设计的人会怎样思考呢?
软件可以打补丁,可硬件……
我很好奇
问题好像宽泛了一些,可是我不懂电路,没法提出一个案例出来。
谁能提一个案例出来?最好不要IC和CPU的。
大系统也是可以化整为零分模块设计的。设计初期首先要弄清各I/O的技术指标(电压电流范围、速度等),然后选择合适的I/O和总控器件。较大的系统可能不止一个脑袋,好些I/O是可以智能地完成一部分作业的。比如串口用的UART,总控机不必老盯着串行线看,每完成一个或一块数据的传送,UART会提出中断请求,等等。
至于抗干扰、抗温漂时漂等,是要在器件选型和电路构成上考虑进去的。诚如所言,和做软件相比,硬件工程师要承受不允许犯错的巨大压力,好在现在有软硬兼顾的FPGA,已经让硬件设计者轻松了好多,它的逻辑在一定范围内允许改动。
谢谢仙猫的回复,我似乎找到了一些软件和硬件之间的一些相似点。
1.提出需求
2.模块化
2.1.模块需求具体化
2.2.定义某块接口(I/O)
3.各小组确定模块方案(时间、成本约束)
………………
可是,软件data type基本固定,加个struct或pointer也不过跑不过这些。
那么在硬件模块(系统内,或自己模块间)如何交换数据呢?
如果有数字部分甚至cpu,mcu还好理解,如果模拟的模块之间如何定义呢?
比如说(不知道例子是否正确)
A模块Pa口来的信号:正常为……, 但是,除了这个意外是什么呢? 是不是A模块的设计者,还要定义出Pa口信号为xxx,是什么情况,Pa口为yyy为什么情况?
此外,出故障的时候怎么处理呢?做软件的时候,我习惯做一个错误处理的模块,通过此模块协同各个模块错误处理。那么硬件出现错误之后是顺着信号链路逐步传递?还是有专门协同错误处理的模块呢?——可是我没看到过有这么干的。
另,
实际工作中,大家都是这么做的么?
另外,看到“几个硬件设计经验”,我有想到:
硬件有原理图设计和PCB layout、结构设计的。
比如原理图中接口布线顺序不合理会给layout带来很大麻烦。
如果pcb layout的把滤波电容放到好远,可能给系统带来很大的干扰。
那么,大家是如何协调这两个团队的呢?
仿真与实测
仙猫很专业,,,,
怎么大家对这个问题没有兴趣,还是这根本不是一个问题。
大家都知道,软件设计中有软件工程,进行软件项目的规划设计把握。可是即使如此还是出现种种的问题。
硬件设计中没有这个问题么?还是非常成熟了,已经不是一个问题呢?
按理说,硬件早于软件出现(毫无疑问),应该有一套成熟的硬件开发的规划、设计、控制以及管理的方法。
谁能给些提示?
再进一步,软件在交接的时候,有文字文档,有流程图,有代码,以及日志文件。
那么硬件交接的时候,难道只有原理图么?被交接的人,只有拿着原理图阅读?如果是一个大一点的,比如是计算机主板,这得咋看啊?