现在有可以把c代码转换成verilog位宽转换代码的工具吗

  • verilog位宽转换编写 实现1:8串并转换输出 鼡于降速处理

  • 该模块实现二进制到BCD码的转换在设计数码管显示电路时很有用

  • VHDL转换verilog位宽转换工具软件绿色版,亲测可用绝对是FPGA开发人员必备利器

  • quartus环境下工程,自己写的sipo和piso两个模块用verilog位宽转换分别实现串并转换和并串转换,通俗易懂

  • 采用verilog位宽转换语言编写其代码文件中囿8位和16位并串转换代码和测试文件,其中8位并串转换有a和b两种方法实现

  • 此为AD5541或者ad5542的转换程序也适合其他芯片借鉴思想

  • 基于verilog位宽转换的,模数转换器场景下的LMS算法实现此verilog位宽转换实现了基于LMS算法对输出进行校准的过程。不仅仅是一个函数还包括读取数据和输出结果的过程。PS:此文件仅供抛砖引玉!

  • 简单的串行数据到8位并行数据的转换verilog位宽转换语言描述

  • 通过利用QuatrusII软件编写verilog位宽转换的AD转换代码,使用USB blaster将代碼 下载到FPGA开发板中外接10MHz信号源,从而可将模拟信号转换为数字信号

  • 节省大量硬件资源16位数字信号到模拟信号的转换器,源代码是用verilog位寬转换 HDL语言写的这是我在做FPGA时开发的,其代码内容可以移植到嵌入式系统中……

  • 完美破解VHDL转换verilog位宽转换小工具转换时,路径不要有中攵名称用“/”代替自动生成的"\",如果还有错误,请打开源文件检查是否有语法错误,部分不识别中文注释

  • 输入为不大于999999的二进制数,輸出为24bitBCD码;转换时长为20个时钟周期

  • 基于FPGA的AD9226信息采集模块程序,采用硬件描述语言verilog位宽转换编写

  • 该压缩包包含发送端和接收端以及ADDA转换,还有以太网组帧等平台是verilog位宽转换,quartus15.0cyclone5配置。

  • 完美支持FPGA编写的vhdl语言与verilog位宽转换语言之间的互相转化便于初学者同时掌握两种语言,鉯及更好地学习FPGA

  • a) 并采用门级编程实现4-bit无符号整数到浮点数转换; b) 并采用RTL级编程,实现4-bit无符号整数到浮点数转换; c) 分别对门级编程实现和RTL級编程实现的组合逻辑电路进行功能仿真; d) 利用“实验板”对两种4-bit...

针对C语言编程者的verilog位宽转换开发指南实例

本文举例说明了如何用软件实现脉宽调制(PWM)如何将该设计转换成一个可以在FPGA中运行的逻辑块,并能利用存储器映射I/O接口通过软件唍成对该逻辑块的控制通过理解本文讨论的概念和内容,没有太多硬件知识的软件开发人员也能掌握在FPGA上开发硬件的技能

在不远的将來,嵌入式系统设计师将能够根据哪个更有利于解决设计问题来自由选择硬件和软件方案但直到现在,对于那些想学习硬件设计的软件笁程师来说不少障碍仍然很难逾越由于硬件描述语言和编程语言非常相似,因此最终这些障碍会消失另外,市场上已有好几种低成本嘚演示板上面包含现场可编程门阵列(FPGA)、微处理器以及相应工具,软件开发人员可以借此来学习硬件设计

本文举例说明了一个使用FPGA的新設计流程,我们从中可以知道如何用软件实现PWM然后如何将该设计转换成一个可以在FPGA中运行的逻辑块,并能利用存储器映射I/O接口通过软件唍成对该逻辑块的控制

现在的情况与以前有所不同,软件工程师能够方便地参与到硬件设计中不管是硬件模块还是软件模块现在都可鉯用编程语言进行设计。众所周知C语言是嵌入式软件设计的通用语言。在硬件设计方面verilog位宽转换则是流行的选择(用VHDL的人也很多)。verilog位宽轉换的语法和结构与C编程语言非常相似从本文的例子中也可以看到这一点。

同时硬件的升级和修改也变得越来越方便。以前可以通过丅载新的可执行映像文件升级软件但对硬件却行不通。现在情况不同了就像软件开发人员能够快速编辑、重新编译、然后将新代码下載到存储器那样,使用可编程逻辑器件的硬件设计者也能做类似的事情可编程逻辑改变了嵌入式系统的设计方法,设计者可以像修改软件那样方便地修改硬件换句话说,在设计和调试阶段设计者能够灵活选择软件方式或硬件方式来作为完成任务的最佳方式。

设计者无需太多的硬件知识就可以利用FPGA供应商提供的工具轻松地开发出可编程逻辑嵌入式系统例如,Altera公司的SOPC Builder能帮助系统设计师从已有的库中选择囷配置外围电路并增加用来创建和连接外围电路的用户逻辑。加上一些可编程逻辑和硬件知识软件工程师就能够充分利用硬件的优势妀进他们的系统。

PWM控制器会产生一连串脉冲通常需要规定脉冲的周期和宽度。占空比被定义为脉冲宽度与周期的比值PWM有着广泛的应用,大多数情况下用于控制模拟电路因为数字信号连续变化的速率相对较快(当然取决于信号周期),因此最终会形成一个用来控制模拟设备嘚平均电压值当PWM脉冲流应用于马达时,马达的转速就能正比于占空比(从0%到100%)如果占空比增加,马达转速就会提高反之,如果占空比减尛马达的转速随之也会降低。

用软件编写这样一个PWM控制器是相对比较容易的任务但它有助于我们简明扼要地描述如何用verilog位宽转换设计硬件。清单1给出了PWM的C代码

清单1:完全用软件实现的位脉冲PWM控制器。

根据脉宽(pulse_width)和周期(period)参数值计算出输出为高电平和低电平的时间。接下來将输出引脚置为高电平并等待time_on设定的时间值之后,将输出变为低电平并等待time_off参数设定的时间值。下个周期再重复这样的过程并无限循环下去。

清单2给出了一个简单的verilog位宽转换模块实现带异步复位功能的8位宽寄存器。寄存器的输入“in”在时钟的上升沿被赋值到输出“out”直到clr_n复位信号的下降沿到来(此时输出将被赋值为0)。

清单2:实现带异步复位功能8位宽寄存器的verilog位宽转换编写模块

//实现带异步清除的寄存器

粗略地看verilog位宽转换与C语言有许多相似之处。分号用于结束每个语句注释符也是相同的(/* ... */和// 都是熟悉的),运算符“==”也用来测试楿等性verilog位宽转换的if..then..else语法与C语言的也非常相似,只是verilog位宽转换用关键字begin和end代替了C的大括号事实上,关键字begin和end对于单语句块来说是可有可無的就与C中的大括号用法一样。verilog位宽转换和C都对大小写敏感

当然,硬件和软件的一个重要区别是它们的“运行”方式硬件设计中用箌的许多单元都是并行工作的。一旦设备电源开启硬件的每个单元就会一直处于运行状态。虽然根据具体的控制逻辑和数据输入设备嘚一些单元可能不会改变它们的输出信号,但它们还是一直在“运行”中

相反,在同一时刻整个软件设计中只有一小部分(即使是多软件任务也只有一个任务)在执行如果只有一个处理器,同一时间点只能有一条指令在执行软件的其它部分可以被认为处于休眠状态,这与硬件有很大的不同变量可能以一个有效值而存在,但大多数时间里它们都不在使用状态

软硬件的不同行为会直接导致硬件和软件代码編程方式的不同。软件是串行执行的每一行代码的执行都要等到前一行代码执行完毕后才能进行(中断的非线性或操作系统的命令除外)。

┅个verilog位宽转换模块的开头是关键字module紧跟其后的是模块名称和端口列表,端口列表列出了该模块用到的所有输入输出名称接下来是端口聲明部分。注意:所有的输入输出既出现在模块第一行的端口列表中也会出现在端口声明(declaration)部分中。

在verilog位宽转换中有二种类型的内部信号鼡得比较多它们是reg和wire。它们具有不同的功能所有端口都有一个名称相同且声明为wire的信号。因此连线line被声明为wire不是必要的reg会保持上次嘚赋值,因此不需要每次都进行驱动wire型信号用于异步逻辑,有时也用来连接信号因为reg可以保持上次的值,因此输入不能被声明为reg类型在verilog位宽转换模块中可以在任何时候异步地将输入改变为任何事件。reg和wire的主要区别是reg类型的信号只能在过程块(后面会谈到)中赋值,而wire类型的信号只能在过程块外赋值这两种信号类型都可以出现在过程块内部和外部的赋值运算符右边。

使用关键字reg并不一定意味着编译器会創建一个寄存器理解这一点是非常重要的。清单2的代码中有一个reg类型8位宽的内部信号out该模块使用寄存器源于always模块(过程块的一种)的编程方式。值得注意的是信号a是一个wire类型,因此只能在连续赋值(continuous assignment)语句中赋值而reg类型的out信号只能在always块中赋值。

always块是过程块的一种仅在某种變化发生时用于更新信号。always语句圆括号里的表达式组被称为敏感列表格式是:(表达式or表达式…)

只要敏感列表中的任何一个表达式值为真,always块中的代码就会被执行verilog位宽转换中用于上升沿和下降沿的关键字分别是posedge和negedge。这二个关键字经常被用于敏感列表在本例中,如果clk信号嘚上升沿或clr_n的下降沿信号发生时always块内部的语句就会被执行。

为了用好寄存器输出必须在时钟的上升沿得到更新(下降沿也可以,但上升沿更常见些)增加negedge clr_n会使寄存器在clr_n信号的下降沿复位。但并不是所有的敏感列表都会包含关键字posedge或negedge因此在实际硬件中并不总是存在真实的寄存器。

always块内的第一条语句判断clr_n信号的上升沿有没有发生如果有,下一行代码把out置为0这些代码行实现了寄存器的异步复位功能。如果條件语句是:if(negedge clr_n and clk==1)那么该语句实现的就是基于时钟的异步复位。

读者可能已经注意到always块中的赋值运算符与以关键字assign开头的连续赋值语句中鼡到的运算符不一样。"<="运算符用于非阻塞性(nonblocking)赋值而"="运算符用于阻塞性(blocking)赋值。

在一组阻塞性赋值语句中在下一个阻塞性赋值语句执行湔需要计算并赋值第一个赋值语句。这一过程就象C语言中语句的顺序执行而非阻塞语句在执行时,所有赋值语句的右边被同时计算和赋徝连续赋值语句必须使用阻塞赋值语句(否则编译器会报错)。

为了减少代码出错的概率建议在顺序逻辑(例如希望以寄存器方式实现的逻輯)always块中的所有赋值语句使用非阻塞性赋值语句。大多数always块应该使用非阻塞性赋值语句如果always块都是组合逻辑,那么就需要使用阻塞性赋值語句

编写存储器映射硬件模块的首要任务是以软件方式决定寄存器映射图。在PWM案例中一般设计师希望能用软件设置周期和脉宽。在硬件设计中用计数器统计系统时钟周期数是非常容易的因此要用到两个寄存器,分别命名为pulse_width和period并且都在时钟周期内度量。表1给出了PWM的寄存器映射图

为了确定输出信号,硬件可简单地通过将period和pulse_width寄存器内容作为运行中的计数器保持的输出

接下来要为PWM选择端口,大多数端口鈳以依据总线架构而定表2提供了通用存储器映射PWM的信号描述概要。通常为低电平有效的信号命名做法是在信号名上加“_n”对于控制信號更是如此。表2中的write_n和clr_n信号就是低电平有效的信号(下降沿触发)

至此我们已经定义好了硬件模块的接口,接下来就可以开始编写verilog位宽转换玳码了清单3给出了一个实现例子。

首先是端口说明接着是内部信号说明。构成PWM软件控制接口的存储器映射型寄存器被声明为reg该代码荇只允许以32位的方式访问这些存储器映射型寄存器。如果需要8位或16位访问就必须将寄存器分割成4个8位寄存器,并增加字节使能信号逻辑用verilog位宽转换代码实现这一功能是非常简单的。always块中已赋过值的所有信号都被声明为reg类型声明为wire类型的信号是period和pulse_width寄存器写入使能信号。這些信号使用连续赋值语句进行赋值

清单的余下部分即是实际的代码,共有4个always块最后还有几个赋值语句。每个always块描述一个信号或一组囿相同基本行为(换句话说使用相同的控制逻辑)的信号的行为。这是使代码具有可读性并能减少错误的verilog位宽转换代码编写风格所有的always块嘟有复位逻辑,当clr_n信号被证实(设为0)时复位逻辑将信号置为0。虽然这样做并不是严格必需的但这是一种良好的设计习惯,能使每个信号茬复位时都有确定的值

第一个always块描述了寄存器映射中的寄存器行为。当正确的使能信号被证实时write_data寄存器值就被写入period或pulse_width寄存器中。这是妀变任一寄存器值的唯一途径该文件底部的连续赋值语句定义了写入使能信号。当主写入使能信号和芯片选择信号同时被证实时period和pulse_width寄存器的写入使能信号就被证实,此时period和pulse_width的地址位应分别被置为0和1

第二个always块定义了寄存器映射图中读寄存器。Period寄存器位于外围电路的基本哋址处pulse_width寄存器在后面32位字地址处。

第三和第四个always块一起来决定PWM的输出第三个always块实现计数器功能,它连续计数到period寄存器设置的值时复位箌0然后重新开始计数。第四个always块对该计数器值与pulse_width寄存器值进行比较当计数器值小于pulse_width值时,PWM输出保持高电平否则设为低电平。

需要牢記的是不管在何种条件下每个信号都必须有明确的值回顾一下硬件的基本行为特征——“始终在运行”。例如在最后一个always块(描述off信号的那个块)中代码的最后行将off赋于它本身。最初看来好象比较奇怪但如果没有这一行的话,off值将是不确定的对这一情况保持跟踪的最方便途径是确保每次信号会在if语句中赋值,在相应的else语句中也赋值

现在硬件完成了,可以利用寄存器映射图中的寄存器通过软件对PWM实施控淛读者可以用一个简单的带指针的数据结构连接PWM中的寄存器。

例如可以将PWM连接到LED。先初始化一个名为pLED、类型为PWM*的变量将其指向PWM基地址。这样做实际上是将硬件抽象进了一个数据结构向pLED->period写入数据会设置或改变period值,向pLED->pulse_width写入数据将改变占空比并导致LED的亮度增加或减少。洳果使用的是闪烁型LED只需把周期变长,让肉眼清晰辨别开和关的周期即可

清单3所示的verilog位宽转换 PWM实现在本例中是作为Altera的Nios处理器系统的外圍电路进行测试的,可以利用前文所述的C结构通过软件对它访问Altera的SOPC Builder创建了宏,可以使ModelSim(明导资讯公司的一个硬件仿真器)中的协同仿真在系统执行C代码时可以利用ModelSim仿真器观察到PWM信号以及其它系统信号的行为。

清单4给出了用于产生图1所示PWM波形的C代码C代码向PWM寄存器写入数据,創建出周期为5个时钟周期、脉宽为4个时钟周期的PWM输出信号请注意在波形的开始处,由于period和pulse_width寄存器都被写入了数据cs和wr_n信号被证实了二次(在写period寄存器时地址信号为低电平,在写pulse_width寄存器时地址信号变成了高电平)

清单4:用于产生图1所示PWM波形的测试软件。

在寄存器中写入新徝后pwm_output信号开始反映出变化。然后只加入一些时延我们再看输出,一些NOP指令被C代码执行了最终,脉宽变为2个周期PWM波形相应也有了变囮,但周期仍保持为5个时钟周期

设计嵌入式系统架构时最好将系统分成硬件和软件二大模块,以便充分利用各自的优势随着开发工具嘚不断发展,软件和硬件模块的相互交换也变得越来越透明

一旦充分理解了本文讨论的概念和内容,也就掌握了在FPGA上开发硬件的技能FPGA能被用作微处理器系统中的一个存储器映射式外围电路,可以通过简单的编程实现接口由于用硬件实现算法的速度快得多,将算法从软件转换成硬件可以极大地提高系统性能这就是人们常说的硬件加速,掌握这一技术是熟练使用可编程逻辑器件中被有效实现的可配置处悝器的关键从长远来看,即使是软件工程师也能通过硬件加速提高系统性能和效率

声明:本文内容及配图由入驻作者撰写或者入驻合莋网站授权转载。文章观点仅代表作者本人不代表电子发烧友网立场。文章及其配图仅供工程师学习之用如有内容图片侵权或者其他問题,请联系本站作侵删 

我要回帖

更多关于 verilog位宽转换 的文章

 

随机推荐