最近看到一本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
lzzno1888666_512355874 2015-5-20 21:58
用户1613626 2015-5-18 07:24