zxopencc

  • 2019-08-07
  • 发表了主题帖: 6个步骤 让你成为FPGA设计高手

    掌握FPGA可以找到一份很好的工作,对于有经验的工作人员,使用FPGA可以让设计变得非常有灵活性。掌握了FPGA设计,单板硬件设计就非常容易(不是系统设计),特别是上大学时如同天书的逻辑时序图,看起来就非常亲切。但FPGA入门却有一定难度,因为它不像软件设计,只要有一台计算机,几乎就可以完成所有的设计。FPGA设计与硬件直接相关,需要实实在在的调试仪器,譬如示波器等。这些硬件设备一般比较昂贵,这就造成一定的入门门槛,新人在入门时遇到一点问题或者困难,由于没有调试设备,无法定位问题,最后可能就会放弃。其实这时如果有人稍微指点一下,这个门槛很容易就过去。 6个步骤 让你成为FPGA设计高手   我用FPGA做设计很多年了,远达不到精通的境界,只是熟悉使用,在这里把我对FPGA学习步骤理解写出来,仅是作为一个参考。   FPGA学习步骤1:工欲善其事,必先利其器。   计算机必不可少。目前FPGA应用较多的是Altera和xilinx这两个公司,可以选择安装quartusII或者ISE软件。这是必备的软件环境。硬件环境还需要下载器、目标板。虽然有人说没有下载器和目标板也可学习fpga,但那总是纸上谈兵。这就像谈女朋友,总是嘴上说说,通个电话,连个手都没牵,能说人家是你朋友?虽说搭建硬件环境需要花费,但想想,硬件环境至多几百元钱,你要真的掌握FPGA的设计,起薪比别人都不止高出这么多。这点花费算什么   FPGA学习步骤2:熟悉verilog语言或者vhdl语言 ,熟练使用quartusII或者ISE软件。   VHDL和verilog各有优点,选择一个,建议选择verilog。熟练使用设计软件,知道怎样编译、仿真、下载等过程。起步阶段不希望报一些培训班,除非你有钱,或者运气好,碰到一个水平高、又想把自己的经验和别人共享的培训老师,不然的话,培训完后总会感觉自己是一个冤大头。入门阶段可以在利用网络资源完成。   FPGA学习步骤3:设计一个小代码,下载到目标板看看结果此时可以设计一个最简答的程序,譬如点灯。   如果灯在闪烁了,表示基本入门了。如果此时能够下载到FPGA外挂的flash,FPGA程序能够从flash启动,表明FPGA的最简单设计你已经成功,可以到下一步。   FPGA学习步骤4:设计稍微复杂的代码,下载到目标板看看结果。   可以设计一个UART程序,网上有参考,你要懂RS232协议和FPGA内置的逻辑分析仪。网上下载一个串口调试助手,调试一番,如果通信成功了, 恭喜,水平有提高。进入下一步。   FPGA学习步骤5:设计复杂的代码。   下载到目标板看看结果。譬如sdram的程序,网上也有参考,这个设计难度有点大。可用串口来调试sdram,把串口的数据存储到sdram,然后读回,如果成功,那你就比较熟悉FPGA设计了   FPGA学习步骤6:设计高速接口。   譬如ddr2或者高速串行接口,这要对FPGA的物理特性非常了解,而且要懂得是时序约束等设计方法,要看大量的原厂文档,这部分成功了,那就对FPGA的物理接口掌握很深,你就是一个高手了

  • 2019-08-04
  • 发表了主题帖: verilog任务调用

    虽然任务中不能出现 initial 语句和 always 语句语句, 但任务调用语句可以在 initial 语句 和 always 语句中使用,其语法形式如下: task_id[(端口1,  端口 2, ........,  端口 N)]; 其中 task_id是要调用的任务名,端口 1、端口 2,…是参数列表。参数列表给出传入任 务的数据(进入任务的输入端)和接收返回结果的变量(从任务的输出端接收返回结果) 。 任务调用语句中,参数列表的顺序必须与任务定义中的端口声明顺序相同。任务调用语句是 过程性语句,所以任务调用中接收返回数据的变量必须是寄存器类型。下面给出一个任务调 用实例。 例:通过 Verilog HDL 的任务调用实现一个 4 比特全加器。 module EXAMPLE (A, B, CIN, S, COUT);   input [3:0] A, B; input CIN; output [3:0] S; output COUT;   reg [3:0] S; reg COUT; reg [1:0] S0, S1, S2, S3;   task ADD;   input A, B, CIN; output [1:0] C;   reg [1:0] C; reg S, COUT;   begin S = A ^ B ^ CIN; COUT = (A&B) | (A&CIN) | (B&CIN); C = {COUT, S}; end endtask   always @(A or B or CIN) begin ADD (A[0], B[0], CIN, S0); ADD (A[1], B[1], S0[1], S1); ADD (A[2], B[2], S1[1], S2); ADD (A[3], B[3], S2[1], S3); S = {S3[0], S2[0], S1[0], S0[0]}; COUT = S3[1]; end endmodule 在调用任务时,需要注意以下几点: (1)任务调用语句只能出现在过程块内; (2)任务调用语句和一条普通的行为描述语句的处理方法一致; (3)当被调用输入、输出或双向端口时,任务调用语句必须包含端口名列表,且信号 端口顺序和类型必须和任务定义结构中的顺序和类型一致。需要说明的是,任务的输出端口 必须和寄存器类型的数据变量对应。 (4)可综合任务只能实现组合逻辑,也就是说调用可综合任务的时间为“0” 。而在面 向仿真的任务中可以带有时序控制,如时延,因此面向仿真的任务的调用时间不为“0” 。

最近访客

现在还没有访客

< 1/0 >

统计信息

已有--人来访过

  • 芯币:21
  • 好友:--
  • 主题:2
  • 回复:0
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言