FPGA-12-Verilog的書寫規範格式
阿新 • • 發佈:2018-11-17
程式碼規範有利於在專案和工程中的維護,養成習慣對後期的工作學習會有很大的幫助!
下面就看下各個情況的規範書寫格式是什麼
1.時序邏輯的規範寫法:
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
tmp_init<=1'b0;
end
else begin
tmp_init<=time_ram_init;
end
end
2.組合邏輯的規範寫法:
always @(*)begin if(delay<DELAY_TIME)begin math=sec_low; end else if(delay<DELAY_TIME*2)begin math=sec_high; end else if(delay<DELAY_TIME*3)begin math=min_low; end else begin math=min_high; end end
3.always的規範寫法:(一個always只窮舉一個變數的各種情況)
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin tmp_a1<=0; end else if(vld_in)begin tmp_a1<=a; end else begin tmp_a1<=tmp_a1; end end always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin tmp_b1<=0; end else if(vld_in)begin tmp_b1<=b; end else begin tmp_b1<=tmp_b1; end end
4.阻塞賦值與非阻塞賦值
//時序邏輯用非阻塞 always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin tmp_init<=1'b0; end else begin tmp_init<=time_ram_init; end end //組合邏輯阻塞 always @(*)begin if(delay<DELAY_TIME)begin math=sec_low; end else if(delay<DELAY_TIME*2)begin math=sec_high; end else if(delay<DELAY_TIME*3)begin math=min_low; end else begin math=min_high; end end
5.對齊例項:begin 對齊 訊號對齊
/*對齊示例*/
//訊號對齊:
input clk ;
input rst_n ;
input time_ram_init ;
input time_ram_wr ;
input [ONEDATA_W -1:0] time_ram_data ;
input [ADRESS_W -1:0] time_rd_times ;
input time_en ;
output time_ram_ovful ;
output time_vld_out ;
output [NUM_W-1 :0] time_num_out ;
reg time_ram_ovful ;
reg time_vld_out ;
reg [NUM_W -1:0] time_num_out ;
reg [ADRESS_W -1:0] wr_adr ;
reg [ADRESS_W -1:0] rd_adr ;
reg tmp_init1 ;
reg tmp_init2 ;
reg flag_init_wadr ;
reg tmp_wr1 ;
reg tmp_wr2 ;
reg wr_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 @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
tmp_init1<=1'b0;
end
else begin
tmp_init1<=time_ram_init;
end
end
6.訊號的書寫規範
/*引數、巨集定義字母必須用大寫*/
//引數的定義:
parameter ADRESS_W = 11;
parameter ONEDATA_W = 32;
parameter NUM_W = 8;
parameter CNTOF_W = 4;
parameter CNTVLD_W = 4;
parameter CNT_W = 20;
parameter DATARAM_W = 2048;
//巨集定義
`define OC8051_ALU_NOP 4'b0000
`define OC8051_ALU_ADD 4'b0001
`define OC8051_ALU_SUB 4'b0010
`define OC8051_ALU_MUL 4'b0011
`define OC8051_ALU_DIV 4'b0100
`define OC8051_ALU_DA 4'b0101
`define OC8051_ALU_NOT 4'b0110
7.時鐘復位訊號使用示例
//時鐘只能用在敏感列表,一個模組只能用一個時鐘
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
tmp_init1<=1'b0;
end
else begin
tmp_init1<=time_ram_init;
end
end
//禁止訊號做時鐘,而要用改成時鐘使能的方式;
//正確的做法:
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
counter<=1'b0;
end
else if(counter==7)begin
counter<=0;
end
else begin
counter<=counter+1;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
en<=0;
end
else if(counter==7)begin
en<=1;
end
else begin
en<=0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
tmp_init1<=1'b0;
end
else if(en==1)begin
tmp_init1<=time_ram_init;
end
else begin
tmp_init1<=tmp_init1;
end
end
8.reg和wire的使用
/*reg型別的使用*/
reg tmp_init1 ;
reg tmp_init2 ;
/*時序邏輯*/
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
tmp_init1<=1'b0;
end
else begin
tmp_init1<=time_ram_init;
end
end
/*組合邏輯*/
always @(*)begin
tmp_init2 = tmp_init1;
end
/*wire型別的使用*/
wire sys_rst_n;
wire clk_25m;
system_ctrl u_system_ctrl(
.clk (clk_50m),//input
.sys_rst_n (sys_rst_n),//output
.clk_c0 (clk_25m) //output
);
9.輸入輸出的規範
/*不能用組合輸出*/
//正確的做法
module key(clk,rst_n,key,key_out);
input clk ;
input rst_n ;
input key ;
output key_out;
reg key_out;
******
******
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_out<=1'b0;
end
else if(count==COUNT_TIME-1)begin
key_out<=1'b1;
end
else begin
key_out<=1'b0;
end
end
endmodule
//錯誤的做法
module key(clk,rst_n,key,key_out);
input clk ;
input rst_n ;
input key ;
output key_out;
reg key_out;
******
******
always @(*)begin
key_out=sw_5&(~sw_4);
end
endmodule