技术论坛

  • FPGA

    Xilinx大学计划官方FPGA开发板(DIGILENT全球唯一原厂) & Pmods积木式传感器

    发帖数

    209
    PmodMaxsonar超声波传感器Verilog代码分享
    PmodMaxsonar超声波传感器有三种读取距离数据的方式:1)UART串口2)PWM3)Analog模拟信号下图是PmodMAXsonar所使用的芯片的时序图,当FPGA给rx接口高位信号时,超声波传感器会开始检测距离并通过三种接口返回距离的数值,单位是英尺(1inch=2.54cm),范围是6~255英尺(15-648厘米)。下面是mod模块的接口表。注意,in编号和上图芯片的编号不同,以下面的表格为准。在代码中,我们使用读取PWM的方式计算距离数值。所以只需要给RX高位信号、从PWM接口计算duty即可。周期是49ms,每147us的脉冲记为1英寸。比如距离为6英寸,PWM的宽度就为6*147us约等于0.88ms。////////////////////////////////////////////////////////////////////////////////////Every147uSthattheinismeasuredatalogiclevelhighvoltagestateisequivalentto1inchaway.Ifthesignalismeasuredtobehigh//for2.205milliseconds,thenthedetectedobjectis15inchesawayfromthefrontofthePmodMAXSONAR.The//maximummeasuredulsetimeof37.5millisecondsindicatesthatthereisnoobjectwithin255inchesofthe//Pmod.//eroid=49msmodulemodmaxsonar(inutclk,inutwm,oututlogicrx,oututlogic[7:0]distance//led);logic[22:0]count_eroid;//49ms=4900000countlogic[13:0]count_inch;//147us=14700count=1inchlogic[7:0]distance_count;//15-255inchlogic[3:0]wm_d;//debounceassignrx=1'b1;//alwaysonalways_ff@(osedgeclk)beginwm_d<={wm_d[2:0],wm};if(count_eroid==23'b100_1010_1100_0100_1010_0000)begincount_eroid<=23'b0;distance<=distance_count;distance_count<=8'b0;count_inch<=14'b0;endelsebeginif(count_inch==14'b11_1001_0110_1100)begincount_inch<=14'b0;if({wm_d,wm}==5'b1_1111)begindistance_count<=distance_count+1;endendelsebegincount_inch<=count_inch+1;endcount_eroid<=count_eroid+1;endendendmodule
    发布于 前天 10:41
  • 开源微控制器(LabVIEW支持)

    树莓派(Raspberry Pi)、BeagleBone Black、chipKIT

    发帖数

    31
    labviewmakerhub检测不到com口
    驱动已经装了但是检测不到COM6是什么情况我又用arduinoIDE试试,是可以下载程序的,但是labviewmakerhub刷新不到这个com口,是什么原因labview也检测不到设备,什么情况在上图的使用指南上,添加即插即用设备,串口,下载驱动,就可以了。。。。
    发布于 12-30
  • 口袋仪器

    Analog Discovery 2、Analog Discovery、Electronics Explorer

    发帖数

    39
    AD2+LabVIEW 实现彩色LED控制
    AD2使用一段时间后,发现其功能丰富,而且可以快速去验证一些我们的灵感和创意,这不,有外国童鞋使用AD2实现了对彩色LED的控制,有助于大家PWM波形生成等功能有进一步了解~ThegoalofthisrojectistoteachyouhowtocontroltheAnalogDiscoverywithLabVIEW.InarticularthisrojectwilldemonstratehowtocontroltheAnalogDiscovery'sdigitalIOandPWMins.ThisrojectrimarilyfocusesonthePWMgeneration.Intherojectthereisa2dcolorallet.DeendingonwhereyouclickaRGBcolorvalueisselected.ThisRGBvalueisconvertedtoaPWMdutycycleandusedtodriveatricolorLED.ThreeotherLEDSthatemitonlyRed,GreenandBluelightarealsodrivenbyPWMsignals.TheyaretheretovisualizeamountofRedGreenandBluethatareresentinselectedcolor.Wheneverthemouseisclickedwithinthecolorma,theAnalogDiscovery’sdigitalinsareusedtodriveaSevenSegmentDislay.Whendriventhesevensegmentdislayreads“On”.TodemonstratethatthecolormasvirtualRGBmatchestheactualLEDcolors,somevirtualLEDsareanimatedonthefrontaneloftheroject.TheseLEDsarechangecolorbasedonwhereyouclickinthecolorma.Aboveisavideooftherojectinaction.Ste1:MaterialsPerquisites:Youmusthavecomletedste2inthereviousroject.FollowingOtion2.1(i.eInstallLabVIEW)fromareviousrojectisrequired.HardwareRequired:Thesearetheonlymaterialsyoureallyneedtodotheroject.AnalogDiscoveryTricolorLEDwithacommoncathode.Otional:Thesematerialsareonlyneededifyouwantsomeextraeffects.ClearLEDthatroducesredlight.ClearLEDthatroducesbluelight.ClearLEDthatroducesgreenlight.DualsevensegmentdislaySoftwareWaveFormsversion2.6.2orlaterLabVIEW(versions2013and2014havebeentestedtoworksofar)Ste2:MainGUICodeOverviewInGUIMain,thecodeisasimlifiedderivativeofGUIMainfromthereviousLabFormsProject.ForneatnessalotoftheWaveformsAPIcallshavebeengrouedtogetherintosubVIs.InthenewGUIMaintherearetworimarysectionstofocuson,theDeviceSelectionLooandtheRunDeviceFunctionsSection.DeviceSelectionLooTheDeviceSelectionLoohasacoulerimaryfunctions.Firstitsearchesforcomatibledevicestoconnecttousingthe"FindConnectedDevices.vi".ArefreshbuttonotionhasbeenaddedsoyoucanconnectadeviceafterstartingtheGUIMain.vi.The"FindConnectedDevices.vi"checkstomakesurenootheralicationsarealreadyusingthedeviceyouwanttooen.Ifthedeviceisalreadyinuse,thefrontanelcontrolsareconfiguredsothe"OK"buttonisgrayedout.Thisreventsyoufromoeningadevicethatisalreadyinuse.Ifthedeviceisn'tinuseyoucanhit'OK'tomoveontotheoeningrocess.OncetheoeningrocessbeingstheDeviceSelectionLooterminates,andtheRunDeviceFunctionssectionisinitiated.RunDeviceFunctionsThefirstortionofthissectionoenstheselecteddevice.Therocessisratherselfexlanatoryanddoesnotneedtobeexlainedindetail.Refertothenumberedcommentsinthecodeformoreinfo.Oncethedeviceisoened,anycustomVIyoudesignedwillbegintorun.Inthisrojectthe"GUICustomWaveformGen.vi"isrun.Ifyouwanttoscoeyourcustomsignaloutut,youcanclicktheEnableScoebuttonbeforeselectingthedevice.ThiswilloenthestandardoscilloscoewindowfromLabForms.Ste3:WiringWiringfortherojectisfairlystraightforward.TheonlyrequiredwiringforonthebreadboardisfortheTricolorLED.IfyouwanttoknowhowtowireaTricolorLEDgohere.Thesevensegmentdislayisanotionalfeature.BecauseofthisandthefactthewiringforSevenSegmentdislaysvariesdeendingonthemanufacture,itswiringwillnotbediscussed.Asidefromthebreadboardwiring,thewiringlefttoconsiderisfortheAnalogDiscovery.IrecommendusingjumerstoconnecttheAnalogDiscovery'swirestothebreadboard.YougettoselectwhichAnalogDiscoveryinsareusedtodriveaartofthecircuit.Todosoyoujustneedtochangetheinnumbersinthecode.RefertothismanualifyouareunfamiliarwiththeAnalogDiscovery'sinout.Ste4:PrefaceToroerlyunderstandhowthisrojectfunctions,itisimortanttounderstandtheWaveformsSDK.NormallytheanalogdiscoveryiscontrolledthroughthefreesoftwareackageWaveforms.WaveFormsalsocomeswithanoensourcedevelomentkit.ThisSDKgivesyouaccesstoaC/C++APIlibraryallowinganyonetowritetheirownsoftwareinterfacefortheAnalogDiscovery.AnoverviewofallthefunctionsavailableintheAPIcanbefoundintheWaveFormsReferenceManual.AtitscorethisLabVIEWrojectissimlycallingtheC/C++APIfunctions.SecialVIsusedtocalleachindividualWaveformsAPIfunctioninLabVIEW.YoucanseelistoftheavailableAPIfunctionsbyclickingthedigilent.lvllibintherojectwindow.EveryVIinthislisthasacorresondingC/C++APIfunction.FormoreinfoabouthoweachfunctionworksrefertotheWaveFormsReferenceManual,asillustratedintheimageabove.IfyouwanttolearnmoreabouthowtocallCfunctionsinLabVIEWcheckoutthefollowinglinks.Ste5:DigitalOututGUICodeThisVIthatHandlestheGUIanimationsaswellascallingthefunctionstocontroltheanalogDiscovery.ThisstewilldiscussthecodeincontextoftheColorMaCode,theAnimationCode,theAnalogDiscoveryControlCode.NOTE:Therojectcodeisattachedabove.ColorMaBeforebeginningthelootheVIreadsinixelmaofaJPEG.TheJPEGisanimageofacolorma.TheRGBvaluesforeachixelintheixelmaaresortedintothreearrays,oneforeachcolor.A2ndcoyoftheixelmaismadeanddrawnonthefrontanelwhereitcanbeclicked.Thisclickableimageislabeled"2DColorMa".Deendingonwhereyouclickthe2DColorMaaRGBcolorvalueisselected.Thisisdonebyusingthemouseointercoordinates(relativetothe2DColorMa’sborders)toaccessthesortedcolorarraysthatwerecreatedfromtheixelma.ThesecolorvaluesareusedforanimationurosesaswellascontrollingtheAnalogDiscovery.AnimationTogiveavirtualvisualizationofwhattherealTricolorLEDwouldlooklike,virtualLEDsareanimatedonthefrontanel.TheRGBvaluesgrabbedfromthesortedcolorarraysarealiedtotheLEDsdrawnonthefrontanel.OneoftheLEDsonthefrontanel(thetricolorLED)showsthemixedRGBvalues.EachoftheotherthreeLEDsarededicatedtosinglecolorchannel(Red,Blue,orGreen).TheLEDsonthefrontanelaremadefromdecorationshaes.InLabVIEWalldecorationreferencesforaVIsfrontanelarecontainedwithinanarraycalledDecos[].Usingadecorationsreferenceyoucancontrolcertainroertiesofthedecorationsuchascolor.AfterIhaddrawntheLEDs(usingtworectangles,andonecircleforeach),IdeterminedtheirositionintheDecos[]array.Ididthisbylugginginanindexvalue(obtainingthedecorationsreference)andhidingandunhidingthedecoration.AfterseeingwhatdecorationchangeddisaearedIknewwhatindexinDecos[]corresondedtoit.UsingthisrocessIderivedtheclusterconstantsof“LEDShaeIDNumbers”.Note,thatIcallthenumber“ShaeIDNumbers”buttheyarereallyindexvaluesoftheDecos[]array.Bewareifyouaddadecoration,ormodifyadecorationtheindexvaluesinDecos[]change.Thiswillcausetheanimationtomalfunction.WiththeroerShaeIDNumbersIuseaforlootoselectagrouofdecorations,andalythearoriateRGBcolors.ThisishowtheLEDsareanimatedonthefrontanel.AnalogDiscoveryControlTocontroltheAnalogDiscoveryaneventstructureisused.Theeventstructuretriggerswheneverthemouseismoved,orclickedwithinthe2DColorMa.TheeventstructurealsotriggersifthePWMvaluesorPWMchange.ThePWMvaluesarecalculatedbasedontheRGBvalues.InaJPEGcolorsare8bitmeaningthenumbers0to255areusedtoreresenthowintenseacolorchannelis(i.ehowinteseRedGreenorBluevalueofaixelis).TocalculatethePWMdutycycleercentage,thecolorvaluesaredividedby255.Thesevaluesarefedintothe“TricolorLEDPWMOut.vi”ThisVIisrimarilyfororganization.Itcontains3identicalVIsthatgeneratePWMsignalsontheAnalogDiscovery.RefertothenextstefordetailsabouthowPWMisgenerated.TheeventstructurethatcontrolsthePWMVI'salsotriggersafewDigitalWritecommandsfortheAnalogDiscovery.Thisiswhatcausesotionalsevensegmentdislaytolightu.TheinnumberfortheDigitalWriteishardcodedintheeventstructure.Feelfreetochangethemandexeriment,butbesureyoudonottrytousethesameinforPWMandDigitalwrite.FordetailsabouthowtheDigitalWriteVIworksrefertothenextste.
    发布于 11-13

创客圈

  • 创客小组(项目集散地)

    这里不仅有灵感与创意,更有实践、激情、与同道。创者无畏!

    发帖数

    21
    极客DIY限时挑战 ——12月挑战任务:用Arty FPGA开发板制作一款无线压强感应垫
    引言:感谢Digilent社区给我这次机会。接触了半年的FPGA,一直用的是其他公司的FPGA,而且项目的大部分时间都用来调试和查找问题上。一直想找机会学习一下主流的FPGA芯片以及综合工具,偶然的机会报名了这个挑战,但是很遗憾,该项目只完成了一半,没有挑战成功。在此发帖,希望能够找到同学能已实现的基础上继续完成该项目。该项目是基于ArtyA7开发板制作一款无线压强感应垫一、项目说明:制作一个无线压强感应垫,实现实时检测压强变化,并在压强变化超过临界值时通过HTTPServer发送邮件通知的功能。二、项目资源开发板:ArytA7传感器:PmodDPG1压强传感器、PmodWiFi无线通信模块、PmodOLED-128*32像素单色OLED屏。制定软件:XilinxVivado三、项目框图四、项目进展情况1、传感器数据和OLED显示打通。2、PmodWiFi模块需要用到MicroBlaze处理器,尚未完成。计划是通过FPGA将数据传给wifi模块,wifi模块连接一个路由器,路由器连接互联网。通过调用网络邮箱接口,发送邮件给自己。3、联合调试。五、设计详情1、PmodDPG压力传感器PmodDPG1设计用于通过压阻检测0kPa至10kPa范围内的表压传感器,该传感器和主板通过SPImode0(CPOL=0,CHPL=0)协议通信,该传感器的反应时间是1ms,传输带宽是500HZ。传感器数据在片选信号被拉低后每个时钟的下降沿传出来,主机在上升沿采样数据,数据一共16位,前4位为0,后面12位是有效数据。2、SPI通信协议si(serialeriheralinterface),串行外围设备接口。由一个主设备和一个或多个从设备组成。主设备启动一个与从设备的同步通讯,从而完成数据的交换。SPI,是一种高速的、全双工、同步的通信总线。在芯片的管教上只占用四根线,节约了芯片的管教,该接口的四条线为:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线CS。SPI通信原理,以主从方式工作,需要四根线,SDO-主设备数据输出,从设备数据输入;SDI-主设备数据输入,从设备数据输出;SCK-时钟信号,由设备产生;CS-片选信号,由设备控制。SPI总线有四种工作方式(SP0,SP1,SP2,SP3),其中使用的最为广泛的是SPI0和SPI3方式。SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。以下是SPI时序图该项目中传感器的选择的模式是mode0,SCK空闲的时候为底电平,第一个上升沿采样数据。片选信号为0,数据从最高位开始采样。Debug调试如下:3、verilog设计moduleSPI_slave(inutwireCLK,inutwireRST,inutwireSPI_EN,inutwireMISO,oututreg[15:0]SPI_DATA,oututregCS,oututregSCLK,oututregSPI_FIN);wirerising;reg[4:0]state;reg[11:0]DELAY_MS;regDELAY_EN;reg[17:0]CS_counter;reg[7:0]counter;regSCLK_d1,SCLK_d2;always@(osedgeCLKornegedgeRST)beginif(!RST)CS<=1;elseCS<=((CS_counter>=1)&am;&am;(CS_counter<=4096))?0:1;//CS_counter[16];endalways@(osedgeCLKornegedgeRST)beginif(!RST)CS_counter<=0;elseCS_counter<=CS_counter+1;endalways@(osedgeCLKornegedgeRST)beginif(!RST)counter<=0;elseif((!CS)&am;SPI_EN)begincounter<=counter+1;endelsecounter<=0;endalways@(osedgeCLKornegedgeRST)beginif(!RST)SCLK<=0;elseif(!CS&am;SPI_EN)SCLK<=counter[7];elseSCLK<=0;endalways@(osedgeCLK)beginSCLK_d1<=SCLK;SCLK_d2<=SCLK_d1;endassignrising=SCLK_d1&am;&am;(~SCLK_d2);always@(osedgeCLKornegedgeRST)beginif(!RST)beginstate<=5'd0;SPI_FIN<=0;endelseif(rising&am;&am;!CS)begincase(state)5'd0:beginSPI_DATA[15]<=MISO;SPI_FIN<=0;state<=5'd1;end5'd1:beginSPI_DATA[14]<=MISO;SPI_FIN<=0;state<=5'd2;end5'd2:beginSPI_DATA[13]<=MISO;SPI_FIN<=0;state<=5'd3;end5'd3:beginSPI_DATA[12]<=MISO;SPI_FIN<=0;state<=5'd4;end5'd4:beginSPI_DATA[11]<=MISO;SPI_FIN<=0;state<=5'd5;end5'd5:beginSPI_DATA[10]<=MISO;SPI_FIN<=0;state<=5'd6;end5'd6:beginSPI_DATA[9]<=MISO;SPI_FIN<=0;state<=5'd7;end5'd7:beginSPI_DATA[8]<=MISO;SPI_FIN<=0;state<=5'd8;end5'd8:beginSPI_DATA[7]<=MISO;SPI_FIN<=0;state<=5'd9;end5'd9:beginSPI_DATA[6]<=MISO;SPI_FIN<=0;state<=5'd10;end5'd10:beginSPI_DATA[5]<=MISO;SPI_FIN<=0;state<=5'd11;end5'd11:beginSPI_DATA[4]<=MISO;SPI_FIN<=0;state<=5'd12;end5'd12:beginSPI_DATA[3]<=MISO;SPI_FIN<=0;state<=5'd13;end5'd13:beginSPI_DATA[2]<=MISO;SPI_FIN<=0;state<=5'd14;end5'd14:beginSPI_DATA[1]<=MISO;SPI_FIN<=0;state<=5'd15;end5'd15:beginSPI_DATA[0]<=MISO;SPI_FIN<=1;state<=5'd0;endendcaseendelsebeginSPI_FIN<=0;SPI_DATA<=SPI_DATA;endendendmodule4、OLED显示模块该OLED支持标准SPI传输协议,传输的速度最大可到10MHZ。该模块最多可以显示128*32像素点,在该项目中,我们是以8*8构成一个数字或者字母,所以显示最多可以显示四行,每行16个数字或字母。该模块的代码直接在社区中给的例子的基础上修改htt://www.digilent.com.cn/community/227.html。所给的参考代码附有英文单词和0-9的数据的字模,用的时候在代码的基础上修改即可。需要调试的是,传感器数据得到的是16进制数据,目前代码中显示的也只是16进制数据,如果需转成10进制的,还需做一个转换。字模所对应的顺序和含义如下:初始化显示如下:代码流程:5、PmodWiFi无线通信模块该模块的主要接口如下:主要用到的是MRF24WG0MA这块芯片,该芯片所用的引脚通过Pmod接口引出来。以下是该芯片所用到的引脚及其含义:~RESETModuleResetinut~WPWriterotect(thisinisusedtoenableFLASHudate)HIBERNATEHibernatemodeenable(highinutwilldisablethemodule)SDISPIdatainSCKSPIclockinut~INTInterrutoutut(oendrain–requiresaull-u)SDOSPIdataout~CSSPIChiSelectinut,constantdriveorull-urequired计划是通过FPGA将数据传给wifi模块,wifi模块连接一个路由器,路由器连网。通过调用网络邮箱接口,发送邮件给自己。刚才接触该wifi模块的时候找了很多资料,后来在群里得知该模块需用MicroBlaze软核用c语言对该模块进行配置,折腾了一段时间没折腾出来,在此发帖找寻感兴趣的同学icku这个项目。关于使用MicroBlaze软核的教程链接:htts://reference.digilentinc.com/learn/rogrammable-logic/tutorials/arty-microblaze-base-system-design/start关于PmodWiFi无线通信模块的GitHub的项目:htts://github.com/Digilent/vivado-library/tree/master/i/Pmods/PmodWIFI_v1_0五、未解决问题1、PmodWiFi无线通信模块尚未打通2、PmodDPG压力传感器数据与实际生活相结合,整个系统联合调试。备注:如有感兴趣的同学可邮箱联系1041320533@qq.com。
    发布于 02-11
  • 竞赛 & 活动

    全国大学生智能互联创新大赛、江苏省虚拟仪器竞赛、极客DIY限时挑战等

    发帖数

    13
    幕后故事 | Playable FPGA @DIGILENT全国大学生创客冬令营
    谨借此篇文章,为你还原一个全国各大高校FPGA“迷弟迷妹”们自行互相勾搭的世界...纯粹的FPGA“迷弟迷妹”,一颗爱玩爱造的心,不安分也不甘平庸,想趁着年轻干点事儿,这是我们身上共同的标签。DIGILENTFPGA中文技术社区,在这里,我们彼此分享创新的乐趣,发现更好的自己,这是凝聚我们在一起的私密小天地,过去的一周,我们走到一起,与志同道合者面对面相互勾搭,碰撞对FPGA的激情,并留下大学时光中一段美好的回忆,只因「PlayableFPGA@DIGILENT全国大学生FPGA创客冬令营」...▼时间:2017情人节为起点的4天3夜地点:合肥工业大学创客空间人物:我们搞基形式:技术动手培训、挑战作品制作、得意作品交流、DIGILENT全国各大高校创客空间成长交流&am;muchmore...营员随笔01随笔|刘雨轩坐标|清华大学最初是基友拉我入的圈儿,没用过Xilinx的我怀着向来(bao)学(da)习(tui)的心态报了名,成为集体中的一员。三天下来,如果让我用三个字形容冬令营生活,那便是:赞赞赞!一赞主办方Digilent提供了零基础顺利上手的B3开发板和细致入微耐心讲解的老师~二赞全程陪同的臻哥,每次需要你时你都在(更满足了我对高富帅的所有憧憬,此处眼中闪小星星)~三赞活动本身,能在大学的最后一年,拿着熟悉的小车,搭上一群志同道合的小伙伴,为了共同的梦想熬个通宵,足矣~我和队友王克非是这次活动里唯一用Verilog写代码的组,也许是专业相关,也许是兴趣相投吧,当时一拍即合~虽然最后的算法没能跑全,但我们还是从中收获良多,其中也包括了信心与快(ji)乐(qing)~满心希望这类活动能一直开展,给更多感兴趣的弟弟妹妹们接触FPGA的机会~还有我,即使毕业了工作了,也愿与Digilent和FPGA一起走得更远~最后附图两张,基友团和自己的小车~共同奋斗了三天,相见恨晚的“战友们”我们的作品02随笔|蔡玉彤坐标|东南大学春暖花开日,相聚庐阳城。电机隆隆响,营员编程忙。小车找平衡,人人有妙想。逻辑遍天下,技术欢乐多。这次在合工大的DIGILENTFPGA创客冬令营收获颇多。冬令营期间分组所挑战的二轮自平衡小车项目使用Basys3和MicroBlaze软核进行设计,让我更加熟悉了使用BlockDesign方式设计FPGA内部逻辑,并进一步理解了AXI总线的原理和使用方法。同时,与我搭档的是这次年纪最大的—位博三的学长前辈,研究的是图像识别与处理方向。在与学长的交流中,也进一步了解到了FPGA的一些前沿研究方向,深受启发。被偷拍到的凌晨为项目奋战中的自己,汉子一条可不是另外,借着此次活动,终于能把DIGILENT中文技术社区微信群里的同学和真人对应起来了。之前经常因为姓名关系在群里被小伙伴们误认为是妹子,相信借着活动大家终于知道我是一个实实在在的东北汉子了。[请脑补我时常为此而哭笑不得的表情]03随笔|赵康坐标|扬州大学最早参加DIGILENT的活动是2016年江苏省的FPGA设计邀请赛,是这次比赛帮我打开了神奇FPGA世界的大门,了解到众多基于XILINX+DIGILENT平台的精妙创新设计,也是这次比赛的经历给了我参加DIGILENT创客冬令营的机会。14号到合肥,第一天活动轻松且愉快,合工大的创客空间的开放意识和创新意识给人印象很深刻,见到了酷酷的Mr.D,参加了DIGILENT创客空间的揭牌仪式,晚上甚至抽空和小伙伴看了一场电影。第二第三天的感受则截然不同,当自平衡小车的任务分发下来,整个冬令营便变得十分紧张起来,感叹项目制作过程中各个小组都无比认真和努力。这次冬令营,最惊叹是DIGILENT软硬件对创客活动的完整支持,最感动是看到创客们对技术和创新的不断追求,最高兴是收获小伙伴们的友谊,最感激是Mr.D以及DIGILENT工程师Evelyn为活动顺利进行所做的大量工作,让我们能够借着活动分享创新的乐趣,发现更好的自己。04随笔|徐新涛坐标|合肥工业大学子曰:有朋自远方来,不亦乐乎。用这句形容这几天我的心情正好。三天的冬令营,我怀着难以抑制的激动心情迎接来自各校的42位同学,看到了他们分享的各项创意作品,听着他们对于FPGA的理解,自己也获得了进步。三天,有意思的事情,好玩的作品,点点滴滴,让人难以忘怀。  时间回退到第一天早上,我们去酒店迎接即将来工大的营员,他们热情很高,大多数人打车前往了学校,我们惊讶的发现少数营员骑着单车去了,毕竟我们的想象力是无穷的。等我们最后到达工培,竟是最后一批了。最早的活动是在开始前一天的下午,各创客空间负责人会议,大家介绍各自的发展,互相学习,晚上聚餐后汇聚在这里,开始我们的狼人杀桌游,很投入,很开心!周老师在冬令营期间和我们提过:行然后知不足。经历冬令营,感受到营员的热情外,也让自己了解兴趣驱动自主实验的具体着眼点。  那夜的狼人杀,天黑请闭眼...期间,我们还共同一起见证了“合肥工业大学-DIGILENT校企协同开源软硬件创客实验室”的正式揭牌仪式落地。记得最后一天送别矿大同学,我收获到他们送给我的一罐啤酒,回创客空间后与同学分享了这特殊礼物,那刻心中充满暖流。在第二天晚上,白天的活动虽已结束,然而本应夜深人静的工培却热闹非凡,大家留下来完成冬令营的任务,匆匆的身影与惺忪的眼睛让人感受到的却是朝气蓬勃。我犹记一位上科大的营员来到我桌前,主动为我提供的帮助;我犹记和矿大同学的交流让自己在活动中收获了很多。冬令营就是这样一个充斥着思想火花碰撞的地方,给营员一个认识志同道合的朋友的机会。很感谢这中发生的许多事。迪芝伦FPGA创客冬令营,注定让这个冬天不平凡。05随笔|康子琛坐标|南京邮电大学非常幸运能够参加由Digilent公司办的冬令营,虽然只有短短三天的时间,但是给我留下了深刻的印象。刚来到合工大,就感受到了创客空间学生们的热情,第一天臻哥的讲座刷新了我对FPGA的认识。而下午的交流分享活动最令我难忘,来自各高校的小伙伴们都拿出各自奇思妙想的成果,从体感鼠标到动态图像识别,还有乒乓球机器人,象棋机器人等,每一个作品都给了我强大的震撼,让我真正理解了没有做不到,只有想不到。随后的两天,我们在迪芝伦工程师们的指导下自己动手制作基于Basys3的平衡小车,这是一次对编程能力和硬件搭建能力的综合考验,在制作过程中,大家遇到问题,都会相互交流讨论,老师们也非常耐心地为我们解答,每一个人都专注地思考,克服重重困难,甚至有同学通宵编写代码,这种对知识的渴求欲望也令我们非常敬佩。DIGILENT工程师在为我们悉心解答问题短短的三天很快就过去了,这次的冬令营不仅仅提高了我的FPGA操作能力,更重要的是在与各高校小伙伴们的交流分享中拓展了自己的思维。他们的一些异想天开的制作带给我极大的启发,让我对自己的作品有了新的思考和遐想。最后,真的感谢Digilent公司能给我这样一个提升自我和相互交流的机会,我会以此为良好的开始,用FPGA做出更好的作品。06随笔|刘兴成坐标|东南大学在这个寒假的尾巴上赶上了FPGA冬令营这列技术成长快车,四天三夜下来收获颇多,在这里记录下几行文字。这次的冬令营是Digilent公司主办的,地点在合肥工业大学创客空间,主题是围绕着FPGA技术展开的。东大我们一共三个同学过去参加了活动,因为很大一部分活动参与者都是来自Digilent与各大高校共建的创客空间技术部或运营部的,所以这次活动也是一次创客空间共建者们的见面会。第一天中午到达了合肥,这里的天气不算冷。赶上跟河海的同学一列高铁,所以到了宾馆之后就一起去了合工大参加了下午举办的一个小会,这个小会是面向创客空间的同学们的,算是第一学期创客空间发展情况交流会。我和云逸两人连拉带抱地把东大创客空间的两个展示作品带了过去,从南京把两个体积不小的家伙带到合肥也是挺拼的。到了合工大之后,稍许寒暄之后就是下午活动的正式开始,先是工大的张毅同学给我们介绍了工大创客空间在2016年的发展轨迹。张毅是个充满活力的小伙子,他性格外向,很有想法。他讲了很多他自己的想法,有关于大学的,有关于空间的,确是真正做了一回地道的主场。此外,还有来自矿大创客空间的刘灿斌,来自河海大学创客空间的周浩都上台做了汇报。大家总结了不少自己空间办的活动,一些做得好的地方和不好的地方。个人感觉,其实这上一个学期都是一个初步探索的阶段,各个空间接受的流入会员很多都是各方面的新手,所以主要任务还是在如何培训这些新手上面。想起我们东大创客空间这半年来开过的技术培训课,也是感慨颇多,要想让一个大一新生从什么都不懂到对各个技术层面都有一定感知还是一条比较艰难的路的,不过前期培养好了他们的基础,也是技术型空间在后续发展中的必然之路,内心中默默祈祷在下一学期的活动中,我的会员们能够让我看到我们的投资没有白费。从第二天开始是正式的技术培训。用两天时间,来自Digilent的工程师分别给我们介绍了vivado工具链的基本使用方法,basys3开发板的资源、使用方式,Verilog基础语法回顾等等。参加培训的营员们基本上都是大三以上的同学,大部分对于FPGA有技术积累,所以这些基础的内容基本上也是一掠而过,重头戏还是在microblaze开发上。之前听说过通过vivado的HLS进行高层次综合和编程,直接将c语言转化成Verilog语言,那是一种c语言开发fga的方法,实际上这次介绍给我们的基于microblaze的开发在某种程度上也算是另一种高层次的fga开发,这是一种FPGA异构开发方式。通过将cu和fga结合在一起进行开发。将一部分外设或者运算封装成FPGA的IP核加入到以microblaze为核心的一个soc上去,相当于自己diy了一个定制化的单片机。还是挺有趣的一种玩法的。整个培训活动照例还是以PojectOriented的方式进行的,两人一组,目标就是在basys3上基于microblaze设计一个二轮自平衡小车。其他方面还好说,比较头疼的是提供给我的传感器是一个PmodNAV九轴姿态传感器,这个没有现成的例程,所以之后花了一整天再加上一个凌晨才调通。当时已经是第三天的凌晨3点多,现场还有大概五六组坚守在创客空间里,顿时也是觉得大家蛮拼的,这种精神还是不错的,只是整个活动下来人就像散了架一般很累。当然最终我也高估了自己的能力,到了第四天快要验收的时候,PID还是调的不够好,究其原因,应该是没有用到编码器,乱调一通不去做完备的数学运算是不行的,自己还是太年轻。不过很幸运还是拿到了一个“优秀营员”的荣誉证书,也算是对辛苦了几个晚上的一个鼓励吧。每位小伙伴都是那么的聚精会神优秀营员颁奖整个冬令营十分有趣,感谢合工大的小伙伴们还有Digilent公司给我们来自全国的爱好者们一次相聚和学习的机会,之后的FPGA技能树还是要慢慢一步一步往上爬!07随笔|高国栋坐标|江苏科技大学我一直都很幸运,这次也不例外。当接到冬令营组织方的电话,问我愿不愿意参加这个活动时,如果说话可以更随意一点,我会说:“我当然愿意,一万个愿意!”。寒假中,我细心准备着用于交流与分享的创意作品,并努力把自己一直想做的项目向前推进。在实现过程中遇到了一些问题,最终导致所准备的材料设想的成分多一些。在后来的冬令营分享中,我也尽全力把几张粗糙的PPT讲得详细一点。其他同学的分享比我的更加实在一点,因为他们基本上都有成型的作品或者是详细的技术方案。但我觉得这并没有什么丢脸的,因为技术的博大精深也包括其胸怀。紧张而刺激的项目挑战环节更让我印象深刻。基于FPGA的二轮自平衡车和很多其它项目一样,在技术上看似很简单,然而在实现上其实并不简单。我们这组用的是较新的PmodNAV模块,相关资料较少,仅有的读写库又存在一点瑕疵。所以当时在读取PmodNAV模块时遇到了困难,整个项目在这一环节停滞。到最后的项目验收也没有读出稳定的数据。通过这次项目挑战,我得到的经验是:不要过于相信和依赖现有库,搞技术要有一定的怀疑态度和批判精神,更多时候需要自己去思考和创造。虽然冬令营已经过去两天了,但冬令营现场搞技术的热烈场面仍历历在目。还有不到两个月的时间我就要毕业了,这次冬令营活动,可以说是我的学生电子之路的压轴美景。对即将进入社会的我来说,以后的路还很长,学生的时期所获得的各项技能、经验和教训必将助我少走弯路,让我终生受益。最后来一张本次冬令营的“全家福”
    发布于 02-20
  • 工科街(校园话题区)

    一条纯粹属于在校工科生的话题街。尽情释放内心的小怪兽,海侃校园内外,闲聊天南地北

    发帖数

    17
    强文推荐 | 硬件工程师是不是越老越吃香?
    作者:朱晓明来源:硬件十万个为什么【关于“青春饭”与“越老越吃香”】以前在研究所的时候,一些老工程师不断的返聘,一些现场的疑难杂症,年轻人束手无策的时候,老教授一出马,药到病除。若干年前,还有人会说:“程序员是吃青春饭,做硬件好,做硬件越老越吃香”。现在说的人越来越少了,为什么呢??硬件工程师已经不再是越老越吃香了?也变成吃青春饭了?“为什么会有越老越吃香一说?”老工程师的优势在于:经验的积累,但是精力和体力并不一定优于年轻工程师;硬件工程师的工作需要比较长时间的积累和理解,有一定的技术积累门槛。“为什么会有青春饭一说?”年轻工程师的优势往往在于:愿意接受新鲜事物,学习速度快,体力和精力比较旺盛。家庭的负担相对轻一些。首先任何工种都需要积累和经验,所以程序员也不能算是吃青春饭的,因为成为卓越的软件工程师也需要大量的软件代码的编程积累和经验。作家格拉德威尔在《异类》一书中指出:“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件”。他将此称为“一万小时定律”。要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。这就是一万小时定律。那么为什么会觉得硬件工程师也会变成吃青春饭的感觉了呢?【硬件技术的入门门槛确实在降低】首先,由于工具的发达、芯片的进步,特别是数字电路的发展,软件的功能强大,端管云架构的逐步成为现实——硬件技术的入门门槛确实在降低。工具的发达:Saber、ADS、Multisim、candence等工具越来越强大,很多经验积累的内容,或者需要生产之后才能够看到的数据、波形和电路特性已经可以通过仿真工具,在电路生产之前进行分析和优化。包括嵌入式软件的工具的完善和强大,使得嵌入式软件的开发门槛也在降低。芯片的进步:芯片的集成度高,对于PCB的设计复杂度相对降低很多,例如:开关电源设计,集成MOSFET的芯片能够承载的功耗越来越高,对于硬件工程师对于原理图和PCB的设计复杂度越来越低;SoC的发展,MCU和CPU的功能越来越强大,集成的存储、ADC、DAC等外设越来越多,参数越来越好;包括一些射频的功能组件的集成度也越来越高,国内的研究所单片的均衡器可以做到1mm*0.7mm的尺寸;Zynq实现了FPGA和ARM的集成、Intel收购了Altera计划推出X86集成FPGA的芯片降低了高速总线的互连需求;早些年,一些算法的实现,由于ADC的速率,DSP的处理能力等限制,还有通过模拟电路进行实现的,现在几乎看不到了。芯片发展到最后,会不会出现:芯片加连线到接口,完成设计。不得而知。端管云架构逐步实现:对于智能硬件的开发来说,最大的问题在于将产品接入云,并与软件、硬件完美兼容。云计算是实现物联网的技术核心,作为在智能硬件开发中的重要工具,云端可以实现可靠地传输、储存和备份,保证后台的可管可控。运行良好的云端可以降低整个产品的运营成本,提供与用户接触的入口,增加了解用户需求的机会,进而不断完善产品。从某种意义上说,只有包含了云接入的设备,才是真正适合当下市场发展的优秀产品。把计算和存储都放置在云端,云端实现服务器的归一化,其实是对云端硬件设计要求的降低;同时在通信领域的全IP化的实现,“端”归一化程度也非常的高,接口的种类、数量都在减少;终端主要是传感器的采集和界面的呈现,并且随着MEMS的发展,传感器的模拟电路开发的工作量也越来越少。【敢问路在何方】如果“硬件就是连连线”,岂不是不需要一些经验和积累就可以做出硬件产品了?简单硬件和复杂硬件:首先我一向认为硬件设计,需要区分“简单硬件”和“复杂硬件”,一些简单硬件,例如,类似:MP3、电子贺卡、蓝牙耳机。电路结构比较简单,开发门槛比较低,不需要非常深厚的经验的工程师去开发,可能问题也不会大,即使出了问题,检查问题和修正问题的代价也不会特别高,所以对工程师的要求也不是特别高。但是电路的功耗高于20W,管脚数量超过10k,则驾驭电路的设计和调试,问题的解决就变得复杂,一旦出现问题往往不是那么容易分析和处理。所以当你的产品属于复杂硬件的设计时候,还是应该找一些专业和有经验的工程师,至少是有问题的解决思路的人来从事相关的工作,来驾驭复杂系统。简单硬件更适合供应链有优势的企业和个人去开发和突破。走向射频:由于ADC的速率毕竟是有限的,也不可能所有的系统都做成软件无线电,所以射频的电路还是需要经验积累和硬件设计的。但是由于仿真工具的强大,射频工程师对软件的使用熟练度变得更为重要,而不是像更早的时候,经验非常之重要,并且需要深厚的理论知识积累和理解。射频因为需要深厚的电磁场理论知识,所以需要有一定的门槛。如果你从事射频的相关工作,恭喜你你的堡垒暂时还没被攻破。但是按照趋势发展,射频的工作也会变得越来越简单。走进芯片:在华为时,一些大佬硬件出身,有深厚的网络协议的理论基础、产品应用经验、对处理器有深厚的应用功底,或者有FPGA的设计功底,转到“海思”去规划芯片或者设计芯片,发展的不错。由于硬件人员对芯片的应用有比较多的积累,也容易从芯片应用的角度去思考芯片设计,所以有机会去走进芯片内部,是一个不错的选择。未来随着中国人口红利的消退,人力成本优势的消失,现在的SMT、PCB加工很可能从中国消失,跟欧美一样没有相关的低附加值的产品生产,而需要去类似于印度、越南等还具备人力成本优势的区域去加工生产。软硬结合,成为综合性人才:多知识的结构效率大于单一知识运行效率。人的知识体系结构跟企业的结构一样,效率大于运营效率。知识也是如此,我们光从软件的角度来说,软件解决成本低,忽略了在这种情况下,硬件成本;反之亦然。软硬件结合,能从技术角度角度寻找到全局成本最低点。项目中,软件可以用IO口模拟出一些接口,SPI主、I2C主、I2C从、UART从、UART主。有时候,单片机没有这些接口,又不能及时换方案的前提下,软件可以降低硬件开发成本;对于一些模拟信号的滤波,经过ADC变成数字信号。既可以采用模拟滤波器滤波,也可以采用数字滤波器滤波。两者可以结合结合,硬件不用更多的器件,软件也不用更高的计算量。不然,上算力更高的芯片,带来的改动不是一点点。软硬工程师都很伤。在嵌入式方面成为软硬结合的工程师,甚至包括懂结构设计、ID设计、网站设计、射频;成为一个综合性的人才,更有可能成为极客,你只需要一个idea,就可以动手去实践,去改变世界。同时,全栈工程师也可以走向工程、做系统集成。提升为系统设计师:在华为的技术发展路线里面,一个硬件工程师,有三条路可以走:1、管理者;2、硬件专家;3、系统工程师。而纵观华为各个产品线的工程师的发展路径,硬件工程师更容易成长为一个系统工程师,而软件工程师更容易成长成为项目经理。这是由于硬件工程师的知识体系相对更完善,去理解其他领域的工作更容易决定的。华为硬件工程师任职资格对照表(表格来源《百度文库》)资格等级工作经验一级1年以上硬件类工作经验;熟悉硬件类基础知识,具备独立处理一般硬件类技术问题的经验。具备独立完成单板硬件详细设计、原理图设计的经验。或者具备基本的网上设备维护经验。二级获得硬件或相关技术以及任职资格后,继续从事硬件类工作1年以上。具备独立进行硬件类开发的经验,具备独立完成单板总体设计到单元测试的经验,具备产品工程领域的基本知识。或者具备3个月以上网上设备维护经验以及独立解决网上一般问题的能力。三级获得硬件或相关技术二级资格后,继续从事硬件类工作2年以上。巨额被分析单板需求并完成单板全过程开发的经验,具备产品工程领域较全面的知识,具备复杂单板或简单产品硬件开发设计的经验,具备解决研发、生产现场硬件技术问题的经验,具备知道相关设计人员进行硬件开发的经验;具备提出流程优化建议的能力和经验。或者具备网上疑难问题定位处理、组织网上问题攻关、网上设备巡检/开局支持/入网测试,以及指导相关维护人员处理网上问题的经验。四级获得硬件或相关技术三级任职资格后,继续从硬件类工作2年以上。具备产品硬件技术领域全面的知识,具备组织产品硬件开发设计或中等难度技术研究项目的经验,具备解决产品开发过程中的重大技术问题的经验,曾参与硬件类技术发展决策活动;具备1年以上的网上设备维护经验;具备参与开发流程建设和优化的经验。五级获得硬件或相关技术四级任职则个后,继续从事硬件类工作2年以上。具备产品硬件技术领域及系统领域全面的知识,具备解决产品开发过程中的重大技术难题的经验,遇见企业未来产品某领域的硬件技术走向,具备组织跨产品的中等复杂项目开发经验,具备开发公司内领先技术的经验,享有技术专利;具备相关流程及技术规范标准的建设和优化经验,是公司领域的技术带头人。六级获得硬件或相关技术五级资格后,继续从事硬件类工作2年以上。具备产品硬件技术领域、系统领域广博精深的知识,具备解决产品开发过程的重大系统类、硬件技术难题的经验,具备组织跨产品线的大型项目开发的经验或者具备开发业界先进技术的经验;在外部期刊杂志上发表论文;参与决策企业未来产品的技术走向,是公司硬件类技术的权威。曾经有一家物联网公司,朋友介绍,去谈一谈项目合作和外包的事情。这家公司做得不错,老板也有思路。但是在交流的过程中,表达了大量硬件可靠性不重要的观点。所以这个项目我都没有兴趣去谈项目的报价,直接委婉的拒绝了合作的意向。我们认知硬件设计的价值,不能只从功能实现角度去思考。除了实现功能之外,对于DFx的理解,包括可制造性、可供应性、可测试性、等方面的积累,利于硬件工程师成长为一个系统工程师。废话不说了,总之要成为一个有用的人。你的价值,不是由你的工作量决定的,而是由你的工作不可替代性决定的。
    发布于 02-03

干货热帖

  • PmodMaxsonar超声波传感器Verilog代码分享
    PmodMaxsonar超声波传感器有三种读取距离数据的方式:1)UART串口2)PWM3)Analog模拟信号下图是PmodMAXsonar所使用的芯片的时序图,当FPGA给rx接口高位信号时,超声波传感器会开始检测距离并通过三种接口返回距离的数值,单位是英尺(1inch=2.54cm),范围是6~255英尺(15-648厘米)。下面是mod模块的接口表。注意,in编号和上图芯片的编号不同,以下面的表格为准。在代码中,我们使用读取PWM的方式计算距离数值。所以只需要给RX高位信号、从PWM接口计算duty即可。周期是49ms,每147us的脉冲记为1英寸。比如距离为6英寸,PWM的宽度就为6*147us约等于0.88ms。////////////////////////////////////////////////////////////////////////////////////Every147uSthattheinismeasuredatalogiclevelhighvoltagestateisequivalentto1inchaway.Ifthesignalismeasuredtobehigh//for2.205milliseconds,thenthedetectedobjectis15inchesawayfromthefrontofthePmodMAXSONAR.The//maximummeasuredulsetimeof37.5millisecondsindicatesthatthereisnoobjectwithin255inchesofthe//Pmod.//eroid=49msmodulemodmaxsonar(inutclk,inutwm,oututlogicrx,oututlogic[7:0]distance//led);logic[22:0]count_eroid;//49ms=4900000countlogic[13:0]count_inch;//147us=14700count=1inchlogic[7:0]distance_count;//15-255inchlogic[3:0]wm_d;//debounceassignrx=1'b1;//alwaysonalways_ff@(osedgeclk)beginwm_d<={wm_d[2:0],wm};if(count_eroid==23'b100_1010_1100_0100_1010_0000)begincount_eroid<=23'b0;distance<=distance_count;distance_count<=8'b0;count_inch<=14'b0;endelsebeginif(count_inch==14'b11_1001_0110_1100)begincount_inch<=14'b0;if({wm_d,wm}==5'b1_1111)begindistance_count<=distance_count+1;endendelsebegincount_inch<=count_inch+1;endcount_eroid<=count_eroid+1;endendendmodule
    亮了(0) 12 0 前天 10:41
  • PmodNAV模块官方reference需注意点
    来源:EEboard前言我购买了PmodNAV这个模块。digilent提供的i没有doc,而且这个模块的driver没有编写完成,只提供了PmodNAV.hPmodNAV.c两个写好的文件头。未来不知道会不会添加。没办法我要用,我就自己设计不用他的driver咯。自己弄一个玩咯。那我就先看看现有的设计吧。主体我使用了Digilent的PmodNAV模块,在使用digilent提供的IP中PmodNAV,遇到了很多问题,现在分享一下,这个Library中提供的i是基于vivado的。我先理解这些i的设计思想,然后自己在edk中自己重新设计i介绍一下情况吧:这个i中实例化了AXIGPIO,AXIQUADSPI和digilent的modbridge。现在搞通这几个的关系。开始axi-gio首先看一下axigio的接口这个可以在PG144-AXI-GPIO这个文档找到。这里很明显我们看到这里的I.O.T端口。这些端口在wraer之后会综合成这里使用的是原语IOBUF,能看见。说下端口I->inutT->trile-stateO->oututIO->bidirectional这简单英语不解释。其中IO这个端口会被引出。现在就复制黏贴下这个原语的作用IOBUF#(.DRIVE(12),//Secifytheoututdrivestrength.IBUF_LOW_PWR("TRUE"),//LowPower-"TRUE",HighPerformance="FALSE".IOSTANDARD("DEFAULT"),//SecifytheI/Ostandard.SLEW("SLOW")//Secifytheoututslewrate)IOBUF_inst(.O(O),//Bufferoutut.IO(IO),//Bufferinoutort(connectdirectlytoto-levelort).I(I),//Bufferinut.T(T)//3-stateenableinut,high=inut,low=outut);//EndofIOBUF_instinstantiation这些代码相信都能看的明白。不解释来继续看gioGPIO的双通道的mod-bridge现在看看bridge怎么实现//Coyright1986-2015Xilinx,Inc.AllRightsReserved.//--------------------------------------------------------------------------------//ToolVersion:Vivadov.2015.4(win64)Build1412921WedNov1809:43:45MST2015//Date:FriFeb0515:23:132016//Host:WK116running64-bitmajorrelease(build9200)//Command:generate_targetmod_concat.bd//Design:mod_concat//Purose:IPblocknetlist//--------------------------------------------------------------------------------`timescale1s/1smodulemod_concat(in_to_bus_I,in_to_bus_O,in_to_bus_T,in_to_uart_gio_bus_I,in_to_uart_gio_bus_O,in_to_uart_gio_bus_T,in_to_i2c_gio_bus_I,in_to_i2c_gio_bus_O,in_to_i2c_gio_bus_T,in_bottom_bus_I,in_bottom_bus_O,in_bottom_bus_T,in_bottom_uart_gio_bus_I,in_bottom_uart_gio_bus_O,in_bottom_uart_gio_bus_T,in_bottom_i2c_gio_bus_I,in_bottom_i2c_gio_bus_O,in_bottom_i2c_gio_bus_T,in0_I,in1_I,in2_I,in3_I,in4_I,in5_I,in6_I,in7_I,in0_O,in1_O,in2_O,in3_O,in4_O,in5_O,in6_O,in7_O,in0_T,in1_T,in2_T,in3_T,in4_T,in5_T,in6_T,in7_T,out0_I,out1_I,out2_I,out3_I,out4_I,out5_I,out6_I,out7_I,out0_O,out1_O,out2_O,out3_O,out4_O,out5_O,out6_O,out7_O,out0_T,out1_T,out2_T,out3_T,out4_T,out5_T,out6_T,out7_T);arameterTo_Row_Interface="None";arameterBottom_Row_Interface="None";outut[3:0]in_to_bus_I;inut[3:0]in_to_bus_O;inut[3:0]in_to_bus_T;outut[1:0]in_to_uart_gio_bus_I;inut[1:0]in_to_uart_gio_bus_O;inut[1:0]in_to_uart_gio_bus_T;outut[1:0]in_to_i2c_gio_bus_I;inut[1:0]in_to_i2c_gio_bus_O;inut[1:0]in_to_i2c_gio_bus_T;outut[3:0]in_bottom_bus_I;inut[3:0]in_bottom_bus_O;inut[3:0]in_bottom_bus_T;outut[1:0]in_bottom_uart_gio_bus_I;inut[1:0]in_bottom_uart_gio_bus_O;inut[1:0]in_bottom_uart_gio_bus_T;outut[1:0]in_bottom_i2c_gio_bus_I;inut[1:0]in_bottom_i2c_gio_bus_O;inut[1:0]in_bottom_i2c_gio_bus_T;oututin0_I;oututin1_I;oututin2_I;oututin3_I;oututin4_I;oututin5_I;oututin6_I;oututin7_I;inutin0_O;inutin1_O;inutin2_O;inutin3_O;inutin4_O;inutin5_O;inutin6_O;inutin7_O;inutin0_T;inutin1_T;inutin2_T;inutin3_T;inutin4_T;inutin5_T;inutin6_T;inutin7_T;inutout0_I;inutout1_I;inutout2_I;inutout3_I;inutout4_I;inutout5_I;inutout6_I;inutout7_I;oututout0_O;oututout1_O;oututout2_O;oututout3_O;oututout4_O;oututout5_O;oututout6_O;oututout7_O;oututout0_T;oututout1_T;oututout2_T;oututout3_T;oututout4_T;oututout5_T;oututout6_T;oututout7_T;generatecase(To_Row_Interface)"GPIO":beginassignin_to_bus_I={out3_I,out2_I,out1_I,out0_I};assign{out3_O,out2_O,out1_O,out0_O}=in_to_bus_O;assign{out3_T,out2_T,out1_T,out0_T}=in_to_bus_T;end"UART":beginassignin_to_uart_gio_bus_I={out3_I,out0_I};assign{out3_O,out0_O}=in_to_uart_gio_bus_O;assign{out3_T,out0_T}=in_to_uart_gio_bus_T;//assignin1_I=out1_I;assignin2_I=out2_I;assignout1_O=in1_O;//assignout2_O=in2_O;assignout1_T=0;assignout2_T=1;end"I2C":beginassignin_to_i2c_gio_bus_I={out1_I,out0_I};//InutisI2Cbus,oututistoPmodPinsassign{out1_O,out0_O}=in_to_i2c_gio_bus_O;assign{out1_T,out0_T}=in_to_i2c_gio_bus_T;assignout2_O=in2_O;assignout3_O=in3_O;assignout2_T=in2_T;assignout3_T=in3_T;assignin2_I=out2_I;assignin3_I=out3_I;enddefault:beginassignout0_O=in0_O;assignout1_O=in1_O;assignout2_O=in2_O;assignout3_O=in3_O;assignout0_T=in0_T;assignout1_T=in1_T;assignout2_T=in2_T;assignout3_T=in3_T;assignin0_I=out0_I;assignin1_I=out1_I;assignin2_I=out2_I;assignin3_I=out3_I;endendcaseendgenerategeneratecase(Bottom_Row_Interface)"GPIO":beginassignin_bottom_bus_I={out7_I,out6_I,out5_I,out4_I};assign{out7_O,out6_O,out5_O,out4_O}=in_bottom_bus_O;assign{out7_T,out6_T,out5_T,out4_T}=in_bottom_bus_T;end"UART":beginassignin_bottom_uart_gio_bus_I={out7_I,out4_I};assign{out7_O,out4_O}=in_bottom_uart_gio_bus_O;assign{out7_T,out4_T}=in_bottom_uart_gio_bus_T;assignout5_O=in5_O;assignout6_O=in6_O;assignout5_T=in5_T;assignout6_T=in6_T;assignin5_I=out5_I;assignin6_I=out6_I;end"I2C":beginassignin_bottom_i2c_gio_bus_I={out5_I,out4_I};assign{out5_O,out4_O}=in_bottom_i2c_gio_bus_O;assign{out5_T,out4_T}=in_bottom_i2c_gio_bus_T;assignout6_O=in6_O;assignout7_O=in6_O;assignout6_T=in6_T;assignout7_T=in7_T;assignin6_I=out6_I;assignin7_I=out7_I;enddefault:beginassignout4_O=in4_O;assignout5_O=in5_O;assignout6_O=in6_O;assignout7_O=in7_O;assignout4_T=in4_T;assignout5_T=in5_T;assignout6_T=in6_T;assignout7_T=in7_T;assignin4_I=out4_I;assignin5_I=out5_I;assignin6_I=out6_I;assignin7_I=out7_I;endendcaseendgenerateendmodule这个代码自己可以ackage一个IP看看。作用就是PMOD的接口那个在上那个在下。现在看PMODNAV的管脚图看到这里5-6-11-12这里是vccgnd继续看这个看不清可以在这下点击下载来继续这个图就是si输出到modbridge的123端口对应的si协议的3-wire片选对应的是由GPIO来完成。对应的123对应mod的234端口,和上边的原理图不冲突来继续看gio这里GPIO的channel1通道输出来继续看这个然后看这个代码这个代码在上边可找到PmodNAV_mod_bridge_0_0mod_bridge_0(.in0_I(axi_gio_0_GPIO_TRI_I[3]),.in0_O(axi_gio_0_GPIO_TRI_O[3]),.in0_T(axi_gio_0_GPIO_TRI_T[3]),.in1_I(axi_quad_si_0_SPI_0_IO0_I),.in1_O(axi_quad_si_0_SPI_0_IO0_O),.in1_T(axi_quad_si_0_SPI_0_IO0_T),.in2_I(axi_quad_si_0_SPI_0_IO1_I),.in2_O(axi_quad_si_0_SPI_0_IO1_O),.in2_T(axi_quad_si_0_SPI_0_IO1_T),.in3_I(axi_quad_si_0_SPI_0_SCK_I),.in3_O(axi_quad_si_0_SPI_0_SCK_O),.in3_T(axi_quad_si_0_SPI_0_SCK_T),.in_bottom_bus_I(axi_gio_0_GPIO_TRI_I[2:0]&am;axi_gio_0_GPIO_TRI_I[4]),.in_bottom_bus_O(axi_gio_0_GPIO_TRI_O[2:0]&am;axi_gio_0_GPIO_TRI_O[4]),.in_bottom_bus_T(axi_gio_0_GPIO_TRI_T[2:0]&am;axi_gio_0_GPIO_TRI_T[4]),.out0_I(mod_bridge_0_Pmod_out_PIN1_I),.out0_O(mod_bridge_0_Pmod_out_PIN1_O),.out0_T(mod_bridge_0_Pmod_out_PIN1_T),.out1_I(mod_bridge_0_Pmod_out_PIN2_I),.out1_O(mod_bridge_0_Pmod_out_PIN2_O),.out1_T(mod_bridge_0_Pmod_out_PIN2_T),.out2_I(mod_bridge_0_Pmod_out_PIN3_I),很明显。这里axi_gio_0_GPIO_TRI_T[4]这个信号被接地。小节结束整个的设计很多的坑让跳,没有提供这些i的说明。希望以上能对使用PmodNAV的小伙伴带来帮助。最后,上一下PmodNAV所对应的STLSM9DS1的官方PDF文档。
    亮了(0) 74 0 02-16
  • 一个简单的8位处理器完整设计过程及Verilog代码
    来源:EETOPBBS作者:weiboshe此文分享的是一个简单的8位处理器完整设计过程及verilog代码,适合入门学习参考,并含有作者个人写的指令执行过程。1:CPU自定义我们按照应用的需求来定义计算机,本文介绍一个非常简单的CPU的设计,它仅仅用来教学使用的。我们规定它可以存取的存储器为64byte,其中1byte=8bits。所以这个CPU就有6位的地址线A[5:0],和8位的数据线D[7:0]。我们仅定义一个通用寄存器AC(8bits寄存器),它仅仅执行4条指令如下:InstructionInstructionCodeOerationADD00AAAAAAAC<—AC+M[AAAAAA]AND01AAAAAAAC<—AC^M[AAAAAA]JMP10AAAAAAGOTOAAAAAAINC11XXXXXXAC<—AC+1除了寄存器AC外,我们还需要以下几个寄存器:地址寄存器A[5:0],保存6位地址。程序计数器PC[5:0],保存下一条指令的地址。数据寄存器D[7:0],接受指令和存储器来的数据。指令寄存器IR[1:0],存储指令操作码。2:取指设计在处理器执行指令之前,必须从存储器取出指令。其中取指执行以下操作:1〉通过地址端口A[5:0]从地址到存储器2〉等待存储器准备好数据后,读入数据。由于地址端口数据A[5:0]是从地址寄存器中读出的,所以取指第一个执行的状态是Fetch1:AR<—PC接下来cu发出read信号,并把数据从存储器M中读入数据寄存器DR中。同时c加一。Fetch2:DR<—M,PC<—PC+1接下来把DR[7:6]送IR,把DR[5:0]送ARFetch3:IR<—DR[7:6],AR<—DR[5:0]3:指令译码Cu在取指后进行译码一边知道执行什么指令,对于本文中的CPU来说只有4条指令也就是只有4个执行例程,状态图如下:4:指令执行对译码中调用的4个例程我们分别讨论:4.1ADD指令ADD指令需要CPU做以下两件事情:1〉从存储器取一个操作数2〉把这个操作数加到AC上,并把结果存到AC所以需要以下操作:ADD1:DR<—MADD2:AC<—AC+DR4.2AND指令AND指令执行过程和ADD相似,需要以下操作:AND1:DR<—MAND2:AC<—AC^DR4.3JMP指令JMP指令把CPU要跳转的指令地址送PC,执行以下操作JMP1:PC<—DR[5:0]4.4INC指令INC指令执行AC+1操作INC1:AC<—AC+1总的状态图如下:5:建立数据路径这一步我们来实现状态图和相应的寄存器传输。首先看下面的状态及对应的寄存器传输:Fetch1:AR<—PCFetch2:DR<—M,PC<—PC+1Fetch3:IR<—DR[7:6],AR<—DR[5:0]ADD1:DR<—MADD2:AC<—AC+DRAND1:DR<—MAND2:AC<—AC^DRJMP1:PC<—DR[5:0]INC1:AC<—AC+1为了设计数据路径,我们可以采用两种办法:1〉创造直接的两个要传输组件之间的直接路径2〉在CPU内部创造总线来传输不同组件之间的数据首先我们回顾一下可能发生的数据传输,以便确定各个组件的功能。特别的我们要注意把数据载入组件的各个操作。首先我们按照他们改变了那个寄存器的数据来重组这些操作。得到如下的结果:AR:AR<—PC;AR<—DR[5:0]PC:PC<—PC+1;PC<—DR[5:0]DR:DR<—MIR:IR<—DR[7:6]AC:AC<—AC+DR;AC<—AC^DR;AC<—AC+1现在我们来看每个操作来决定每个组件执行什么样的功能,AR,DR,IR三个组件经常从其他的组件载入数据(从总线),所以只需要执行一个并行输入的操作。PC和AC能够载入数据同时也能够自动加一操作。下一步我们把这些组件连接到总线上来,如图所示:如上图所示,各个组件与总线之间通过三态连接,防止出现总线竞争。AR寄存器送出存储器的地址,DR寄存器用于暂存存数起来的数据。到现在为止我们还没有讨论有关的控制信号,我们现在只是保证了所有的数据传输能够产生,我们将在后面章节来使这些数据传输正确的产生---控制逻辑。现在我们来看以下者写数据传输中有没有不必要的传输:1〉AR仅仅提供数据给存储器,所以他不需要连接到总线上。2〉IR不通过总线提供数据给任何组件,所以他可以直接输出到控制单元(后面章节)。3〉AC不提供数据到任何的组件,可以不连接到总线上。4〉总线是8bit宽度的,但是有些传输是6bit或者2bit的,我们必须制定寄存器的那几位送到总线的那几位。5〉AC要可以载入AC和DR的和或者逻辑与的值,数据路径中还需要进行运算的ALU。由此我们做以下工作:1〉去掉AR,IR,AC与总线的连接。2〉我们约定寄存器连接是从总线的低位开始的。AR,PC连接到Bus[5:0],由于IR是接受DR[7:6]的,所以可以连接到总线的Bus[7:6]。3〉我们设定,AC作为ALU的一个输入,另一个输入来自总线Bus。下面我们检查是否有争用总线的情况,幸运的是这里没有。修改后的CPU内部组织图如下:6:ALU设计这个CPU的ALU执行的功能就是两个操作数相加、逻辑与。这里不作详细介绍。电路如下:7:控制单元现在我们来考虑如何产生数据路径所需的控制信号,有两种方法:硬布线逻辑和为程序控制。这里我们用硬布线逻辑来实现。这个简单的CPU需要的控制逻辑由三个部件组成:1〉计数器:用于保存现在的状态2〉译码器:生成各个状态的控制信号3〉其他的组合逻辑来产生控制信号一个通用的控制单元原理图如下:对于这个CPU来说,一共有9个状态。所以需要一个4bit的计数器和一个4-16的译码器。接下来的工作就是按照前面的状态转换图来对状态进行赋值。首先考虑如何的对译码输出状态进行赋值才能达到最佳状态。我们按照以下规则:1〉给Fetch1赋计数器的0值,并用计数器的清零端来达到这个状态。由这个CPU的状态图可以看出,除了Fetch1状态外的状态都只能由一个状态转化而来,Fetch1需要从4个分支而来,这4个分支就可以发出清零信号(CLR)来转移到Fetch1。2〉把连续的状态赋连续的计数器值,这样就可以用计数器的INC输入来达到状态的转移。3〉给每个例程的开始状态赋值时,要基于指令的操作码和这个例程的最大状态数。这样就可以用操作码来生成计数器的LD信号达到正确的状态转移。首先,在Fetch3状态发出LD信号,然后要把正确的例程地址放到计数器的输入端。对这个CPU来说,我们考虑以地址1[IR]0作为计数器的预置输入。则得到状态编码如下:InstructionStateIRcounterFetchFetch10000Fetch20001Fetch30010ADDADD1001000ADD2001001ANDAND1011010AND2011011INCINC1101100JMPJMP1111110如上表所示,下面我们需要设计产生计数器的LD、INC、CLR等信号,总的控制单元的逻辑如下图:下面我们用这些译码信号来产生数据路径控制所必需的AR、PC、DR、IR、M和ALU的控制信号。首先考虑寄存器AR,他在Fetch1状态取PC的值,并在Fetch3状态取DR[5:0]的值,所以我们得到ARLOAD=Fetch1orFetch3。以此类推我们可以得到如下结果:PCLOAD=JMP1PCINC=Fetch2DRLOAD=Fetch1orADD1orAND1ACLOAD=ADD2orAND2IRLOAD=Fetch3对于ALU的控制信号ALUSEL是用来控制ALU做逻辑或者算数运算的,所以有:ALUSEL=AND2对于片内总线的控制较为复杂,我们先来看DR,对于DR他只在Fetch3、AND2、ADD2和JMP1状态占用总线进行相信的数据传输,所以有:DRBUS=Fetch3orAND2orADD2orJMP1其他类似有:MEMBUS=Fetch2orADD1orAND1PCBUS=Fetch1最后,控制单元需要产生存储器的读信号(READ),它发生在Fetch2、ADD1、AND1三个状态:READ=Fetch2orADD1orAND1这样我们得到了总的控制逻辑,完成了整个CPU的设计。8:验证设计我们执行如下指令进行设计验证,0:ADD41:AND52:INC3:JMP04:27H5:39H指令执行过程如下(初始化所有寄存器为全零态):InstructionStateActiveSignalsOerationsNextStateADD4Fetch1PCBUS、ARLOADAR<—0Fetch2Fetch2READ、MEMBUSDRLOAD、PCINCDR<—04HPC<—PC+1Fetch3Fetch3DRBUS、ARLOADIRLOADIR<—00AR<—04HADD1ADD1READ、MEMBUSDRLOADDR<—27HADD2ADD2DRBUS、ACLOADAC<—0+27HFetch1AND5Fetch1Fetch2Fetch3ADD1ADD2INCFetch1Fetch2Fetch3INC1JMP0Fetch1Fetch2Fetch3JMP1最后,适合初学者的Verilog代码参考请见附件。
    亮了(1) 136 0 02-10
  • 25条 Verilog / VHDL 代码编写通则
    导读VHDL精密,Verilog简洁,但要写好任一种都要遵守这25条代码编写通则...■■■初学者往往头疼于选哪种入门合适。其实,随便选一种即可。最关键的是要养成良好的代码编写风格,在满足功能和性能目标的前提下,增强代码的可读性、可移植性。良好代码编写风格的通则概括如下:01对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写;02使用有意义的信号名、端口名、函数名和参数名;03信号名长度不要太长;04对于时钟信号使用clk作为信号名,如果设计中存在多个时钟,使用clk作为时钟信号的前缀;05对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;06对于低电平有效的信号,应该以一个下划线跟一个小写字母b或n表示。注意在同一个设计中要使用同一个小写字母表示低电平有效;07对于复位信号使用rst作为信号名,如果复位信号是低电平有效,建议使用rst_n;08当描述多比特总线时,使用一致的定义顺序,对于verilog建议采用bus_signal[x:0]的表示;09尽量遵循业界已经习惯的一些约定。如*_r表示寄存器输出,*_a表示异步信号,*_n表示多周期路径第n个周期使用的信号,*_nxt表示锁存前的信号,*_z表示三态信号等;10在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;11使用适当的注释来解释所有的always进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;12每一行语句独立成行。尽管VHDL和Verilog都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72个字符,这样做都是为了提高代码得可读性;13建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC设计中心2如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB键,这样可以避免不同机器TAB键得设置不同限制代码得可移植能力;14在RTL源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog和VHDL语言的关键字;15在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:输入信号的clk、rst、enablesothercontrolsignals、dataandaddresssignals。然后再申明输出信号的clk、rst、enalbesothercontrolsignals、datasignals;16在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug连线错误;17如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性;18尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数;19对一些重要的always语句块定义一个有意义的标号,这样有助于调试。注意标号名不要与信号名、变量名重复;20代码编写时的数据类型只使用IEEE定义的标准类型,在VHDL语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE的标准;21在设计中不要直接使用数字,作为例外,可以使用0和1。建议采用参数定义代替直接的数字。同时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系;22不要在源代码中使用嵌入式的dc_shell综合命令。这是因为其他的综合工具并不认得这些隐含命令,从而导致错误的或较差的综合结果。即使使用DesignComiler,当综合策略改变时,嵌入式的综合命令也不如放到批处理综合文件中易于维护。这个规则有一个例外的综合命令,即编译开关的打开和关闭可以嵌入到代码中;23在设计中避免实例化具体的门级电路。门级电路可读性差,且难于理解和维护,如果使用特定工艺的门电路,设计将变得不可移植。如果必须实例化门电路,我们建议采用独立于工艺库的门电路,如SYNOPSYS公司提供的GTECH库包含了高质量的常用的门级电路;24避免冗长的逻辑和子表达式;25避免采用内部三态电路,建议用多路选择电路代替内部三态电路。
    亮了(0) 78 0 02-08
  • 强文推荐 | 硬件工程师是不是越老越吃香?
    作者:朱晓明来源:硬件十万个为什么【关于“青春饭”与“越老越吃香”】以前在研究所的时候,一些老工程师不断的返聘,一些现场的疑难杂症,年轻人束手无策的时候,老教授一出马,药到病除。若干年前,还有人会说:“程序员是吃青春饭,做硬件好,做硬件越老越吃香”。现在说的人越来越少了,为什么呢??硬件工程师已经不再是越老越吃香了?也变成吃青春饭了?“为什么会有越老越吃香一说?”老工程师的优势在于:经验的积累,但是精力和体力并不一定优于年轻工程师;硬件工程师的工作需要比较长时间的积累和理解,有一定的技术积累门槛。“为什么会有青春饭一说?”年轻工程师的优势往往在于:愿意接受新鲜事物,学习速度快,体力和精力比较旺盛。家庭的负担相对轻一些。首先任何工种都需要积累和经验,所以程序员也不能算是吃青春饭的,因为成为卓越的软件工程师也需要大量的软件代码的编程积累和经验。作家格拉德威尔在《异类》一书中指出:“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件”。他将此称为“一万小时定律”。要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。这就是一万小时定律。那么为什么会觉得硬件工程师也会变成吃青春饭的感觉了呢?【硬件技术的入门门槛确实在降低】首先,由于工具的发达、芯片的进步,特别是数字电路的发展,软件的功能强大,端管云架构的逐步成为现实——硬件技术的入门门槛确实在降低。工具的发达:Saber、ADS、Multisim、candence等工具越来越强大,很多经验积累的内容,或者需要生产之后才能够看到的数据、波形和电路特性已经可以通过仿真工具,在电路生产之前进行分析和优化。包括嵌入式软件的工具的完善和强大,使得嵌入式软件的开发门槛也在降低。芯片的进步:芯片的集成度高,对于PCB的设计复杂度相对降低很多,例如:开关电源设计,集成MOSFET的芯片能够承载的功耗越来越高,对于硬件工程师对于原理图和PCB的设计复杂度越来越低;SoC的发展,MCU和CPU的功能越来越强大,集成的存储、ADC、DAC等外设越来越多,参数越来越好;包括一些射频的功能组件的集成度也越来越高,国内的研究所单片的均衡器可以做到1mm*0.7mm的尺寸;Zynq实现了FPGA和ARM的集成、Intel收购了Altera计划推出X86集成FPGA的芯片降低了高速总线的互连需求;早些年,一些算法的实现,由于ADC的速率,DSP的处理能力等限制,还有通过模拟电路进行实现的,现在几乎看不到了。芯片发展到最后,会不会出现:芯片加连线到接口,完成设计。不得而知。端管云架构逐步实现:对于智能硬件的开发来说,最大的问题在于将产品接入云,并与软件、硬件完美兼容。云计算是实现物联网的技术核心,作为在智能硬件开发中的重要工具,云端可以实现可靠地传输、储存和备份,保证后台的可管可控。运行良好的云端可以降低整个产品的运营成本,提供与用户接触的入口,增加了解用户需求的机会,进而不断完善产品。从某种意义上说,只有包含了云接入的设备,才是真正适合当下市场发展的优秀产品。把计算和存储都放置在云端,云端实现服务器的归一化,其实是对云端硬件设计要求的降低;同时在通信领域的全IP化的实现,“端”归一化程度也非常的高,接口的种类、数量都在减少;终端主要是传感器的采集和界面的呈现,并且随着MEMS的发展,传感器的模拟电路开发的工作量也越来越少。【敢问路在何方】如果“硬件就是连连线”,岂不是不需要一些经验和积累就可以做出硬件产品了?简单硬件和复杂硬件:首先我一向认为硬件设计,需要区分“简单硬件”和“复杂硬件”,一些简单硬件,例如,类似:MP3、电子贺卡、蓝牙耳机。电路结构比较简单,开发门槛比较低,不需要非常深厚的经验的工程师去开发,可能问题也不会大,即使出了问题,检查问题和修正问题的代价也不会特别高,所以对工程师的要求也不是特别高。但是电路的功耗高于20W,管脚数量超过10k,则驾驭电路的设计和调试,问题的解决就变得复杂,一旦出现问题往往不是那么容易分析和处理。所以当你的产品属于复杂硬件的设计时候,还是应该找一些专业和有经验的工程师,至少是有问题的解决思路的人来从事相关的工作,来驾驭复杂系统。简单硬件更适合供应链有优势的企业和个人去开发和突破。走向射频:由于ADC的速率毕竟是有限的,也不可能所有的系统都做成软件无线电,所以射频的电路还是需要经验积累和硬件设计的。但是由于仿真工具的强大,射频工程师对软件的使用熟练度变得更为重要,而不是像更早的时候,经验非常之重要,并且需要深厚的理论知识积累和理解。射频因为需要深厚的电磁场理论知识,所以需要有一定的门槛。如果你从事射频的相关工作,恭喜你你的堡垒暂时还没被攻破。但是按照趋势发展,射频的工作也会变得越来越简单。走进芯片:在华为时,一些大佬硬件出身,有深厚的网络协议的理论基础、产品应用经验、对处理器有深厚的应用功底,或者有FPGA的设计功底,转到“海思”去规划芯片或者设计芯片,发展的不错。由于硬件人员对芯片的应用有比较多的积累,也容易从芯片应用的角度去思考芯片设计,所以有机会去走进芯片内部,是一个不错的选择。未来随着中国人口红利的消退,人力成本优势的消失,现在的SMT、PCB加工很可能从中国消失,跟欧美一样没有相关的低附加值的产品生产,而需要去类似于印度、越南等还具备人力成本优势的区域去加工生产。软硬结合,成为综合性人才:多知识的结构效率大于单一知识运行效率。人的知识体系结构跟企业的结构一样,效率大于运营效率。知识也是如此,我们光从软件的角度来说,软件解决成本低,忽略了在这种情况下,硬件成本;反之亦然。软硬件结合,能从技术角度角度寻找到全局成本最低点。项目中,软件可以用IO口模拟出一些接口,SPI主、I2C主、I2C从、UART从、UART主。有时候,单片机没有这些接口,又不能及时换方案的前提下,软件可以降低硬件开发成本;对于一些模拟信号的滤波,经过ADC变成数字信号。既可以采用模拟滤波器滤波,也可以采用数字滤波器滤波。两者可以结合结合,硬件不用更多的器件,软件也不用更高的计算量。不然,上算力更高的芯片,带来的改动不是一点点。软硬工程师都很伤。在嵌入式方面成为软硬结合的工程师,甚至包括懂结构设计、ID设计、网站设计、射频;成为一个综合性的人才,更有可能成为极客,你只需要一个idea,就可以动手去实践,去改变世界。同时,全栈工程师也可以走向工程、做系统集成。提升为系统设计师:在华为的技术发展路线里面,一个硬件工程师,有三条路可以走:1、管理者;2、硬件专家;3、系统工程师。而纵观华为各个产品线的工程师的发展路径,硬件工程师更容易成长为一个系统工程师,而软件工程师更容易成长成为项目经理。这是由于硬件工程师的知识体系相对更完善,去理解其他领域的工作更容易决定的。华为硬件工程师任职资格对照表(表格来源《百度文库》)资格等级工作经验一级1年以上硬件类工作经验;熟悉硬件类基础知识,具备独立处理一般硬件类技术问题的经验。具备独立完成单板硬件详细设计、原理图设计的经验。或者具备基本的网上设备维护经验。二级获得硬件或相关技术以及任职资格后,继续从事硬件类工作1年以上。具备独立进行硬件类开发的经验,具备独立完成单板总体设计到单元测试的经验,具备产品工程领域的基本知识。或者具备3个月以上网上设备维护经验以及独立解决网上一般问题的能力。三级获得硬件或相关技术二级资格后,继续从事硬件类工作2年以上。巨额被分析单板需求并完成单板全过程开发的经验,具备产品工程领域较全面的知识,具备复杂单板或简单产品硬件开发设计的经验,具备解决研发、生产现场硬件技术问题的经验,具备知道相关设计人员进行硬件开发的经验;具备提出流程优化建议的能力和经验。或者具备网上疑难问题定位处理、组织网上问题攻关、网上设备巡检/开局支持/入网测试,以及指导相关维护人员处理网上问题的经验。四级获得硬件或相关技术三级任职资格后,继续从硬件类工作2年以上。具备产品硬件技术领域全面的知识,具备组织产品硬件开发设计或中等难度技术研究项目的经验,具备解决产品开发过程中的重大技术问题的经验,曾参与硬件类技术发展决策活动;具备1年以上的网上设备维护经验;具备参与开发流程建设和优化的经验。五级获得硬件或相关技术四级任职则个后,继续从事硬件类工作2年以上。具备产品硬件技术领域及系统领域全面的知识,具备解决产品开发过程中的重大技术难题的经验,遇见企业未来产品某领域的硬件技术走向,具备组织跨产品的中等复杂项目开发经验,具备开发公司内领先技术的经验,享有技术专利;具备相关流程及技术规范标准的建设和优化经验,是公司领域的技术带头人。六级获得硬件或相关技术五级资格后,继续从事硬件类工作2年以上。具备产品硬件技术领域、系统领域广博精深的知识,具备解决产品开发过程的重大系统类、硬件技术难题的经验,具备组织跨产品线的大型项目开发的经验或者具备开发业界先进技术的经验;在外部期刊杂志上发表论文;参与决策企业未来产品的技术走向,是公司硬件类技术的权威。曾经有一家物联网公司,朋友介绍,去谈一谈项目合作和外包的事情。这家公司做得不错,老板也有思路。但是在交流的过程中,表达了大量硬件可靠性不重要的观点。所以这个项目我都没有兴趣去谈项目的报价,直接委婉的拒绝了合作的意向。我们认知硬件设计的价值,不能只从功能实现角度去思考。除了实现功能之外,对于DFx的理解,包括可制造性、可供应性、可测试性、等方面的积累,利于硬件工程师成长为一个系统工程师。废话不说了,总之要成为一个有用的人。你的价值,不是由你的工作量决定的,而是由你的工作不可替代性决定的。
    亮了(0) 133 0 02-03
  • GPIO Product Guide学习+流水灯实例
    1.ProductGuide笔记GPIO是通用并行IO接口的简称。他将总线信号转化为IO设备要求的信号类型,实现地址译码输出数据,锁定输入数据缓冲的功能。GPIO控制器的基本结构如图1所示。总线接口模块实现地址译码,并将特定总线信号转化为内部总线;中断逻辑模块,根据中断控制以及中断产生条件产生中断请求信号。输入/输出控制模块将内部总线信号转化为基本的输入/输出引线,并实现输出数据锁定,输入数据暂存的功能。图中只画出1位数据的原理图,多位数据需要多组都同样的结构。输入/输出控制模块包括内部译码控制模块。输出使能控制寄存器(GPIO_TRI),输入数据输出寄存器数据输入寄存器(GPIO_DATA),数据采样寄存器(GPIO_IN)。需要首先向(GPIO_TRI)写入零。然后再向GPIO_DATA写数据。数据才能传输到外部引脚上。如果要输入外部引脚的数据,那么必须同时使能GPIO_DATA_IN和READ_REG_IN。并且使得MUX选择GPIO_IO的数据。同样可以通过控制MUX读取使能状态GPIO_TRI,由输入输出模块的原理图,可知程序可以先通过读取什么状态,了解外部引脚信号再根据需要修改输出到GPIO_IO上。以下以赛灵思AXI总线GPIOIP核为例来介绍GPIO控制器的具体应用。该GPIO控制器IP核支持两个独立的GPIO通道,并且每个通道可以支持1-32位的数据输入/输出,可配置为单,输入单输出或双向输入输出。控制器包括接口总线模块,中断产生逻辑模块以及双通道输入输出模块。双通道输入输出模块的原理框图2如下,该GPIO包括两个通道,并且独立工作,只有中断信号由同一个一个引脚输出,两个通道都可以输入输出,但是任意时刻仅作为输入或输出接口使用,其数据的传输方向通过什么控制,当输出低电平时,数据输出,反之则输入。GPIO内部寄存器如表所示,所有寄存器采用小字节序,即数据的第一位对应引脚的地位。GPIO的各部分分别控制GPIO的各位为输入或输出,当GPIO_TRI末位为0时,GPS对应的IO配置为输出。当GPIO_TRI某位为1,相应的IO配置为输入。如果我们只是配置GPIO,作为简单的输出接口,不需要使用中断机制,那么对GPIO编程控制,只需要先写GPIO_TRI,然后再输出数据到GPIO_DATA就可以了。2.具体实现Tis:这次演示一个Microblaze的流水灯background:首先你要在你的FPGA开发板(比如ZYBO)搭建好软核AddIP->gio选择你要用的通道,比如我有7个LED,都为OUTPUT,你可以选择Alloutut或者不选择(会作为inout)之后在SDK调用时对GPIO_TRI写0作为输出端口,连接好GPIO的时钟、控制线、复位(可以选择自动连接)修改顶层模块的端口定义,加上LED修改XDC文件综合编译工程,生成bit文件ExortHardware->LaunchSDK编写C语言程序(这个就很简单了。。。)首先你要看看你的GPIOBASEAddress是多少,每个外设都有自己的地址,学过微机原理的童鞋都好理解。如图所示,我的是0x40010000(记得去掉中间的"_",SDK会报错)我们先介绍一下GPIO外设常用的几个函数(学过51单片机,或者是STM32的童鞋就非常容易上手)其实这是直接对寄存器操作的函数,并不是GPIO外设特有的。(详细定义参考xil_io.h头文件)#defineXil_In8(Addr)(*(volatileu8*)(Addr))#defineXil_In16(Addr)(*(volatileu16*)(Addr))#defineXil_In32(Addr)(*(volatileu32*)(Addr))*Performaninutoerationforaxx-bitmemorylocationbyreadingfromthe*secifiedaddressandreturningthevaluereadfromthataddress.**@aramAddrcontainstheaddresstoerformtheinutoerationat.**@returnThevaluereadfromthesecifiedinutaddress.以上是读GPIO数据的函数,使用前确保你设置GPIO_TRI对应的那1位为1(或者你已经配置了allinut),否则noeffect#defineXil_Out8(Addr,Value)\(*(volatileu8*)((Addr))=(Value))#defineXil_Out16(Addr,Value)\(*(volatileu16*)((Addr))=(Value))#defineXil_Out32(Addr,Value)\(*(volatileu32*)((Addr))=(Value))*Performanoututoerationforaxx-bitmemorylocationbywritingthe*secifiedvaluetothesecifiedaddress.以上是写GPIO数据的函数,使用前确保你设置GPIO_TRI对应的那1位为0(或者你已经配置了alloutut),否则noeffect打开system.mss,还可以看到eriheralDrivers里面有GPIO外设提供的API函数实质就是把Xil_Out这样的函数封装了罢了,本次例子较为简单,就不细讲(而且每次调用这些函数都要Initialize,有点麻烦)请自己打开页面去查看函数功能附送代码:(示例均在FPGA开发板成功验证)1.直接写寄存器的方法#include<stdio.h>#include<xarameters.h>#include<xgio.h>#include<xintc.h>#include<xtmrctr.h>#include<xuartlite.h>#include"latform.h"#include<microblaze_slee.h>#defineLED_BASE0x40010000#defineLED_BASE_TRI0x40010000+0x04intmain(){inti=1;Xil_Out8(LED_BASE_TRI,0x00);//设置为输出while(1){//MB_Slee(1000);for(;i<=0x80;i=i<<1){Xil_Out8(LED_BASE,i);//写数据MB_Slee(10);}i=0x01;}cleanu_latform();return0;}2.使用GPIO的API函数方法#include<stdio.h>#include<xarameters.h>#include<xgio.h>#include<xintc.h>#include<xtmrctr.h>#include<xuartlite.h>#include"latform.h"#include<microblaze_slee.h>intmain(){intsts;inti;init_latform();sts=XGio_Initialize(&am;gioLed,XPAR_HIER_PERIPH_GPIO_LEDS_DEVICE_ID);if(sts!=XST_SUCCESS)rintf("giolediniterror!\n");while(1){for(i=0x01;i<=0x80;i=i<<1){XGio_DiscreteWrite(&am;gioLed,1,i);//ledhigniseffectiveMB_Slee(500);}i=0x01;}反思:学习FPGA不自己去阅读英文文档是不行的,有问题可以去Xilinx英文论坛讨论。总而言之,官方的文档还是比较重要的第一手资料吧楼主还会继续学习中断控制器IntcIP和TimerIP、SPIIP。如果有时间,楼主会分享学习经验。
    亮了(1) 123 3 01-30
解决问题:30
干货热帖:101
会员总数:3222
总帖数:351
我要发帖

贡献榜

  • hahavchen

    创新创业教育知名圈内人

    常隐匿于江湖的资深攻城狮,拥有超过10年的半导体与测控行业产品研发、技术支持、市场拓展及区域销售经验。目前同时担任上海交通大学本科生企业导师。

    • 王斌Jr

      工程师

      Andorid工程师,书呆子

    • mysunday2

      本科生

      武汉大学在读研究生,懂一点Java,懂一点LabVIEW

    • 风雨兼程

      本科生

      热爱科研,忠于技术,渴望在LabVIEW的世界里遨游。

    • 地板

      媒体人

      资深媒体人,现任职于国内某知名电子行业媒体

  • EltonLiang

    工程师

    汽车电子方向系统集成工程师,坐标北京。精通LabVIEW与测控技术,乐于分享总结。

    • Superlava

      工程师

      国家电网工程师,对于创新创造,我是真爱粉!

    • chnwjian

      研究生

      擅长物理实时测量和ardunio

    • linon

      教师

      东南大学电子科学与工程学院

    • suo ivy

      创业者

      乐忠于机器人的创业少年

  • CC

    研究生

    擅长FPGA以及LabVIEW程序设计,拥有多年项目开发经验,曾开发过高速误码仪、自动泊车系统,研发并将PM2.5检测仪推入市场,目前致力于FPGA的图像处理研究。

    • 冰淇淋

      研究生

      略懂c语言,爱玩爱交流

    • Veritas

      电子技术爱好者

      非电类专业的在校纯技术爱好者

    • 竹杖芒鞋轻胜马

      研究生

      擅长电子电力,电源,逆变器,Matlab的同济骚年

    • 熊猫家的猫

      研究生

      热爱电子设计,熟悉LabVIEW编程,希望和大家一起学习进步。

    • 李比希

      电子技术爱好者

      喜欢LabVIEW,会点c语言,痴迷玩创,让激情碰出创意的火花!

    • 糊涂宝宝

      研究生

      精通C语言与电路设计。善于软硬件结合开发实际工程项目。

    • LabVIEWers

      工程师

      汽车电子电控领域工程师。个人信条:追求卓越。

    • 南瓜粥

      本科生

      致力于精密测量@天津大学

  • philo

    工程师

    刚毕业的新晋TI验证工程师一枚。内心埋有一个小小的希望靠技术改变世界的种子。CLD(认证LabVIEW开发工程师)持有者,并熟悉C语言与MATLAB。

    • 阳光的新手125

      研究生

      Strict coding is the boddy, smart thoughts are the soul.

    • AoduLabVer

      工程师

      华为数字视频领域工程师,技术宅,CLD,热衷LabVIEW

    • 西兰花教负责人

      创业者

      俗称“福建三本“的某985高校毕业,正不务正业地创业中

    • berwin

      创业者

      好奇主义 & 观察者 & 行动派

  • RockMOOC

    教师

    博士,现于哈尔滨工业大学任教。拥有超过8年基于FPGA的数字系统硬件设计经验,精通FPGA开发。

    • wonderm

      本科生

      熟悉LabVIEW/Matlab/Verilog,擅长STM32/K60硬件开发

    • diguaguowang

      研究生

      一直羡慕会各种编程的人,也在向着这个方向努力

    • 阿Q

      工程师

      精通FPGA的酷创达人

    • wigger

      工程师

      Digilent元老级大牛

  • Mr. D

    工程师

    部落的发起者与第一位"Digger",非典型张江男一枚。致力于为有执着有梦想的志同道合者缔造一个可以互相勾搭的中文开源技术社区。