预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共17页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

针对C语言编程者的Verilog开发指南实例 本文举例说明了如何用软件实现脉宽调制(PWM),如何将该设计转换成一个可以在FPGA中运行的逻辑块,并能利用存储器映射I/O接口通过软件完成对该逻辑块的控制。通过理解本文讨论的概念和内容,没有太多硬件知识的软件开发人员也能掌握在FPGA上开发硬件的技能。 在不远的将来,嵌入式系统设计师将能够根据哪个更有利于解决设计问题来自由选择硬件和软件方案。但直到现在,对于那些想学习硬件设计的软件工程师来说不少障碍仍然很难逾越。由于硬件描述语言和编程语言非常相似,因此最终这些障碍会消失。另外,市场上已有好几种低成本的演示板,上面包含现场可编程门阵列(FPGA)、微处理器以及相应工具,软件开发人员可以借此来学习硬件设计。 本文举例说明了一个使用FPGA的新设计流程,我们从中可以知道如何用软件实现PWM,然后如何将该设计转换成一个可以在FPGA中运行的逻辑块,并能利用存储器映射I/O接口通过软件完成对该逻辑块的控制。 软硬件划分 现在的情况与以前有所不同,软件工程师能够方便地参与到硬件设计中。不管是硬件模块还是软件模块现在都可以用编程语言进行设计。众所周知,C语言是嵌入式软件设计的通用语言。在硬件设计方面,Verilog则是流行的选择(用VHDL的人也很多)。Verilog的语法和结构与C编程语言非常相似,从本文的例子中也可以看到这一点。 同时,硬件的升级和修改也变得越来越方便。以前可以通过下载新的可执行映像文件升级软件,但对硬件却行不通。现在情况不同了。就像软件开发人员能够快速编辑、重新编译、然后将新代码下载到存储器那样,使用可编程逻辑器件的硬件设计者也能做类似的事情。可编程逻辑改变了嵌入式系统的设计方法,设计者可以像修改软件那样方便地修改硬件。换句话说,在设计和调试阶段,设计者能够灵活选择软件方式或硬件方式来作为完成任务的最佳方式。 设计者无需太多的硬件知识就可以利用FPGA供应商提供的工具轻松地开发出可编程逻辑嵌入式系统。例如,Altera公司的SOPCBuilder能帮助系统设计师从已有的库中选择和配置外围电路,并增加用来创建和连接外围电路的用户逻辑。加上一些可编程逻辑和硬件知识,软件工程师就能够充分利用硬件的优势改进他们的系统。 PWM软件 PWM控制器会产生一连串脉冲。通常需要规定脉冲的周期和宽度。占空比被定义为脉冲宽度与周期的比值。PWM有着广泛的应用,大多数情况下用于控制模拟电路。因为数字信号连续变化的速率相对较快(当然取决于信号周期),因此最终会形成一个用来控制模拟设备的平均电压值。当PWM脉冲流应用于马达时,马达的转速就能正比于占空比(从0%到100%)。如果占空比增加,马达转速就会提高,反之,如果占空比减小,马达的转速随之也会降低。 用软件编写这样一个PWM控制器是相对比较容易的任务,但它有助于我们简明扼要地描述如何用Verilog设计硬件。清单1给出了PWM的C代码。 清单1:完全用软件实现的位脉冲PWM控制器。 void pwmTask(uint32_tpulse_width,uint32_tperiod) { uint32_ttime_on=pulse_width; uint32_ttime_off=period-pulse_width; while(1) { pwm_output=1; sleep(time_on); pwm_output=0; sleep(time_off); } } 根据脉宽(pulse_width)和周期(period)参数值,计算出输出为高电平和低电平的时间。接下来将输出引脚置为高电平,并等待time_on设定的时间值之后,将输出变为低电平,并等待time_off参数设定的时间值。下个周期再重复这样的过程,并无限循环下去。 Verilog模块 清单2给出了一个简单的Verilog模块,实现带异步复位功能的8位宽寄存器。寄存器的输入“in”在时钟的上升沿被赋值到输出“out”,直到clr_n复位信号的下降沿到来(此时输出将被赋值为0)。 清单2:实现带异步复位功能8位宽寄存器的Verilog编写模块。 modulesimple_register(in,out,clr_n,clk,a); //端口声明 input input input[7:0] input output[7:0] clr_n; clk; in; a; out; //信号声明 reg[7:0] wire out; a; //实现带异步清除的寄存器 always@(posedgeclkornegedgeclr_n) begin if(clr_n==0)//couldalsobewritten