原创 FPGA学习笔记2之编程规范

2015-5-14 23:11 1581 13 15 分类: FPGA/CPLD

        最近看到一本CrazyBingo韩彬大神的书,它的特色之一就是结合自己的经验,给出了很多实用的FPGA编程习惯以及开发过程中的规范化设计。对于一个决定重头学习FPGA的人来说简直是久旱逢甘霖。关于FPGA学习中的一些良好的习惯无疑会为以后的发展和提高提供很大的帮助。于是我自己也总结了自己的一套编程规范。

        首先是工程的建立。工程文件夹下将所有的文件分成5类,用src,doc,sim,pro,ipcore 5个文件夹分类。源文件放在src,工程文件放在pro,仿真文件(testbench)放在sim,ip核文件放在ipcore,文档说明等放在doc。各种文件分门别类,一目了然,便于移植和管理。

        其次是Verilog书写规范。一个.v文件从开始到结束依次是:

第一部分:文件头编写,包括版权声明、作者、修订版本等:

/**************************************************************
Copyright Clarify : 
Copyrigt Ownership belongs to author,shall not be 
reproduced , copied , or used in otherways without permission.
Otherwise author have the right to persue legal responsibilities .
 
File name   : Count_Design
Author      : 
E-mail      : 
Date        : 2015-05-13
Description : 4-bit counter
 
Modification History:
Data          By          Version          Change Description
           
2015-05-13    author         V1.0 
 

***************************************************************/  

第二部分为module规范,注意时间单位和仿真精度的设定,便于modelsim仿真:          

`timescale 1ns/1ns
module Count_Design
(
//global signal
input clk,          //50Mhz
input rst_n,
 
//user interface
output reg [3:0] cnt
);
//**************************************************************
第三部分为always模块编写规范,每一个always模块要有功能描述,寄存器定义在当前always模块之前,else要写全等等:
//Count for 4-bit
always@(posedge clk or negedge rst_n)
begin
if(~rst_n)
cnt <= 4'b0;
else
cnt <= cnt + 1'b1;
end
第四部分为实例化部分,xx模块的例化名为u_xx等(这里还有一个疑问,例化的module的列表中信号的类型都为wire?):
下面是一个SPI slave模块的实例化,这个实例化是有问题的。问题在于rxd_data是模块接收到串行线上的数据后向模块外的输出,它应该是一个wire型的信号。参见编译报告:output or inout port "rxd_data"must be connected to a structural net expression
知道是.rxd_data的定义应该是wire型,发现错误后感觉好像也应该是wire型的。在SPI模块中rxd_data是个reg型变量。数据rxd_data从u_SPI_test0514输出后输入至另一个u_light_led模块中。这个rxd_data起的作用是将两个模块的相关信号连接起来,貌似应该用wire也就是连接线直接连起来,中间加一个寄存器感觉上就有点多余。度娘后也没有看到很好的解释。有没有同学能解释下?皱眉
 
module SPI_test_top
(
//global signal
input            clk,
input            rst_n,
 
//user interface
   input            CS_N,
   input            SCK,
   input            MOSI,
output           MISO,
 
   output  rxd_flag,
output     [1:0] led
);
 
//*************************************************************
//internal regs
reg           [7:0] txd_data = 8'h55;
reg           [7:0] rxd_data;
 
//*************************instantiation***********************
SPI_test0514 u_SPI_test0514
(
//global signal 
.clk(clk),
.rst_n(rst_n),
 
//user interface
.CS_N(CS_N),
.SCK(SCK),
.MOSI(MOSI),
.MISO(MISO),
 
.rxd_flag(rxd_flag),
.txd_data(txd_data),
.rxd_data(rxd_data)
);
 
light_led u_light_led
(
//global signal
.clk(clk),
.rst_n(rst_n),
 
//user interface
.SPI_rcv_data(rxd_data),
.led(led)
);
 
endmodule

文章评论2条评论)

登录后参与讨论

lzzno1888666_512355874 2015-5-20 21:58

好的,谢谢

用户1613626 2015-5-18 07:24

reg类型一般建模触发器,需要时钟,模块输出直接连线就可以了,没有时钟的概念。
相关推荐阅读
lzzno1888666_512355874 2015-06-16 09:21
FPGA的系统架构组成和器件互联问题(博文精选)
通常来讲,“一个好汉三个帮”,一个完整的嵌入式系统中由单独一个FPGA使用的情况较少。通常由多个器件组合完成,例如由一个FPGA+CPU来构成。通常为一个FPGA+ARM,ARM负责软件配置管理,界面...
lzzno1888666_512355874 2015-06-11 23:17
初次socket编程
在网络通信应用程序的编程中用到的socket,严格称来应该是socket APIs,它是一组将TCP/UDP/IP协议层的接口函数进行封装后的,供给应用程序调用的应用层接口函数。OSI的7层通信模...
lzzno1888666_512355874 2015-06-11 22:39
初次socket编程
        在网络通信应用程序的编程中用到的socket,严格称来应该是socket APIs,它是一组将TCP/UDP/IP协议层的接口函数进行封装后的,供给应用程序调用的应用层接口函数。O...
lzzno1888666_512355874 2015-06-03 21:53
以太网网口电路调试
    最近一块板卡上以太网网口始终没有调通,直至今天才解决。吸取教训,还是因为没有充分思考问题所在,没有多方面查证电路的问题。最终找到原因是因为网口处的匹配电阻焊错了,本来50欧的电阻买的时候商...
lzzno1888666_512355874 2015-05-30 17:42
ARM+FPGA架构笔记
        由于项目需求,最近学习了ARM+FPGA的设计架构,简单做个记录。 ARM和FPGA结构的通信大致可以分为两种: 1.     数据量小、通信速率要求不高的情况,可以考虑采...
lzzno1888666_512355874 2015-05-14 23:36
FPGA学习笔记之modelsim仿真和testbench编写
       仿真对于FPGA开发非常之重要,所以重头来过的必不可少的过程便是Modelsim的使用学习。于是不可避免的要学习testbench的编写了。        testbench编写...
我要评论
2
13
关闭 站长推荐上一条 /2 下一条