FPGA-Verilog的书写规范格式

简介: FPGA-Verilog的书写规范格式

代码规范有利于在项目和工程中的维护,养成习惯对后期的工作学习会有很大的帮助!

下面就看下各个情况的规范书写格式是什么

1.时序逻辑的规范写法:


always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintmp_init<=1'b0;endelsebegintmp_init<=time_ram_init;
endend

2.组合逻辑的规范写法:


always@(*)beginif(delay<DELAY_TIME)beginmath=sec_low;
endelseif(delay<DELAY_TIME*2)beginmath=sec_high;
endelseif(delay<DELAY_TIME*3)beginmath=min_low;
endelsebeginmath=min_high;
endend

3.always的规范写法:(一个always只穷举一个变量的各种情况)


always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintmp_a1<=0;
endelseif(vld_in)begintmp_a1<=a;
endelsebegintmp_a1<=tmp_a1;
endendalways@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintmp_b1<=0;
endelseif(vld_in)begintmp_b1<=b;
endelsebegintmp_b1<=tmp_b1;
endend

4.阻塞赋值与非阻塞赋值


//时序逻辑用非阻塞always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintmp_init<=1'b0;endelsebegintmp_init<=time_ram_init;
endend//组合逻辑阻塞always@(*)beginif(delay<DELAY_TIME)beginmath=sec_low;
endelseif(delay<DELAY_TIME*2)beginmath=sec_high;
endelseif(delay<DELAY_TIME*3)beginmath=min_low;
endelsebeginmath=min_high;
endend

5.对齐实例:begin 对齐 信号对齐


/*对齐示例*///信号对齐:inputclk                      ;
inputrst_n                    ;
inputtime_ram_init            ;
inputtime_ram_wr              ;
input  [ONEDATA_W-1:0] time_ram_data            ;
input  [ADRESS_W-1:0] time_rd_times            ;
inputtime_en                  ;
outputtime_ram_ovful           ;
outputtime_vld_out             ;
output [NUM_W-1     :0] time_num_out             ;
regtime_ram_ovful           ;
regtime_vld_out             ;
reg    [NUM_W-1:0] time_num_out             ;
reg    [ADRESS_W-1:0] wr_adr                   ;
reg    [ADRESS_W-1:0] rd_adr                   ;
regtmp_init1                ;
regtmp_init2                ;
regflag_init_wadr           ;
regtmp_wr1                  ;
regtmp_wr2                  ;
regwr_en                    ;
reg    [CNT_W-1:0] count                    ;
reg    [CNTOF_W-1:0] cnt_ovful                ;
reg    [CNTVLD_W-1:0] cnt_vld                  ;
reg    [ONEDATA_W-1:0] data_ram [DATARAM_W-1:0] ;
reg    [CNTVLD_W-1:0] vld_cnt_tmp              ;
//begin end对齐:always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintmp_init1<=1'b0;endelsebegintmp_init1<=time_ram_init;
endend

6.信号的书写规范


/*参数、宏定义字母必须用大写*///参数的定义:parameterADRESS_W=11;
parameterONEDATA_W=32;
parameterNUM_W=8;
parameterCNTOF_W=4;
parameterCNTVLD_W=4;
parameterCNT_W=20;
parameterDATARAM_W=2048;
//宏定义`defineOC8051_ALU_NOP4'b0000`defineOC8051_ALU_ADD4'b0001`defineOC8051_ALU_SUB4'b0010`defineOC8051_ALU_MUL4'b0011`defineOC8051_ALU_DIV4'b0100`defineOC8051_ALU_DA4'b0101`defineOC8051_ALU_NOT4'b0110

7.时钟复位信号使用示例


//时钟只能用在敏感列表,一个模块只能用一个时钟always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintmp_init1<=1'b0;endelsebegintmp_init1<=time_ram_init;
endend
//禁止信号做时钟,而要用改成时钟使能的方式;//正确的做法:always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begincounter<=1'b0;endelseif(counter==7)begincounter<=0;
endelsebegincounter<=counter+1;
endendalways@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)beginen<=0;
endelseif(counter==7)beginen<=1;
endelsebeginen<=0;
endendalways@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintmp_init1<=1'b0;endelseif(en==1)begintmp_init1<=time_ram_init;
endelsebegintmp_init1<=tmp_init1;
endend

8.reg和wire的使用


/*reg类型的使用*/regtmp_init1                ;
regtmp_init2                ;
/*时序逻辑*/always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintmp_init1<=1'b0;endelsebegintmp_init1<=time_ram_init;
endend/*组合逻辑*/always@(*)begintmp_init2=tmp_init1;
end/*wire类型的使用*/wiresys_rst_n;
wireclk_25m;
system_ctrlu_system_ctrl(
    .clk                (clk_50m),//input       .sys_rst_n          (sys_rst_n),//output    .clk_c0             (clk_25m)   //output);

9.输入输出的规范


/*不能用组合输出*///正确的做法modulekey(clk,rst_n,key,key_out);
inputclk    ;
inputrst_n  ;
inputkey    ;
outputkey_out;
regkey_out;
************always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)beginkey_out<=1'b0;endelseif(count==COUNT_TIME-1)beginkey_out<=1'b1;endelsebeginkey_out<=1'b0;endendendmodule//错误的做法modulekey(clk,rst_n,key,key_out);
inputclk    ;
inputrst_n  ;
inputkey    ;
outputkey_out;
regkey_out;
************always@(*)beginkey_out=sw_5&(~sw_4);
endendmodule
目录
相关文章
|
8月前
|
存储 编译器 索引
Verilog基础【一】
Verilog基础【一】
291 0
|
6月前
|
C语言 芯片 异构计算
FPGA新起点V1开发板(六-语法篇)——verilog简介+基础语法
FPGA新起点V1开发板(六-语法篇)——verilog简介+基础语法
102 1
|
8月前
|
存储 人工智能 安全
Verilog基础【二】
Verilog基础【二】
273 1
|
8月前
|
算法 异构计算
m基于FPGA的Alamouti编码verilog实现,包含testbench测试文件
m基于FPGA的Alamouti编码verilog实现,包含testbench测试文件
90 5
|
8月前
|
存储 C语言 异构计算
|
开发工具 芯片 异构计算
Verilog 设计方法
Verilog 的设计多采用自上而下的设计方法(top-down)。即先定义顶层模块功能,进而分析要构成顶层模块的必要子模块;然后进一步对各个模块进行分解、设计,直到到达无法进一步分解的底层功能块。这样,可以把一个较大的系统,细化成多个小系统,从时间、工作量上分配给更多的人员去设计,从而提高了设计速度,缩短了开发周期。
182 1
|
编译器 芯片 异构计算
【数字逻辑 | 组合电路基础】Verilog语法
【数字逻辑 | 组合电路基础】Verilog语法
【数字逻辑 | 组合电路基础】Verilog语法
|
算法 测试技术 异构计算
m基于FPGA的数字下变频verilog设计
m基于FPGA的数字下变频verilog设计
225 0
m基于FPGA的数字下变频verilog设计
|
芯片 异构计算
Verilog语法之测试文件
要测试我们设计的模块功能是否正常,最直接的办法就是烧写到FPGA芯片中进行验证,但是这种方式往往结果并不直观,且出现问题后也不容易定位。为提高工作效率,我们可通过电脑仿真的方式进行功能验证,待仿真通过后,再烧写到FPGA中,这样可以快速排除电路中存在的绝大多数bug。在电脑上进行仿真,除了我们设计的功能模块之外,还需要另一模块——testbench,用于产生被测模块所需的激励信号。由于testbench只是用于电脑端的仿真,而不需要最终综合成电路,因此其写法更加灵活,可以使用verilog语法中的一些不可综合的语句,如initial、#、$display、$readmemb、forever等。
274 0
|
算法
Verilog语法入门
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
126 0