0.模塊級的注釋
每個模塊開始要注明文件名、功能描述、引用模塊、設計者、設計時間及版權信息等。
/* ========================
Filename ﹕
Author ﹕
Description ﹕
Called by ﹕Top module
Revision History ﹕
Revision 1.0
Email ﹕
Company ﹕ Robsense Technology .Inc
Copyright(c) 2015, xxxxx Technology Inc, All right reserved
========================= */
1.宏(Macros)
1、可以把所有的`define放在一個文件中,在編譯原代碼時首先把這個文件讀入
2、如果希望宏的作用域僅在一個模塊中有效,就用parameter,==可以用來傳遞參數==。
3、作用域僅在一個模塊中有效,localparam,==不可用來傳遞參數==。
4、parameter在本module內有效的定義,可用于參數傳遞;
從上層傳值進下一層常數時,需要在上層用#定義傳的值
在下層需要定義對應的參數名字parameter parameter_name;
module_name
#(
.parameter_name(para_value),
.parameter_name(para_value)
)
inst_name
(
port map
);
2.FSM
1、verilog描述狀態機時必須由parameter分配,而VHDL狀態機狀態可以在綜合時分配產生。
2、組合邏輯和時序邏輯分開用不同的進程
3、狀態機主要分為==Mealy==機和==Moore==機,Mealy機的狀態和輸入有關,而Moore機的狀態轉換和輸入無關。
3.輸入不確定的組合邏輯電路
在設計組合邏輯時,需要將不確定的輸入轉化成確定的輸入,然后再完成組合邏輯。
module x2one(in, out);
input in;
output out;
assign out = (in == 1)? 1:0;
endmodule
4.Verilog 中文件輸出輸出函數的使用方法
1、系統函數$fopen用于打開一個文件,并返回一個整數的文件指針
2、系統函數$fdisplay就可以用這個文件指針在文件中實現寫入信息。
3、寫完后用$fclose函數關閉文件
==以下語句將”a”和”b”分別顯示在”@%h %h”中的兩個%h,并寫入指針所指的文件W_file.txt==
integer W_file; //定義文件指針
W_file = $fopen(“W_file.txt”);
$fdisplay(W_file, “@%h %h”,a,b);
$fclose(W_file);
4、讀文件操作通過readmemh和readmemb函數來完成,分別對應的數據文件為十六進制和二進制
reg[15:0]c[0:15];
$readmemh(“R_file.txt”, c);
5.Verilog 中預處理
verilog預處理與C很類似,預處理符號`開頭。
==注:在引用已定義的宏名時,必須在宏名前加`。==
`include file.v //包含文件file.v
`define X 1 //定義宏x 值為1
`ifdef X
z = 1;
`else
z = 0;
`endif
6. tri和wire的用法區別
連線與三態線(tri)網語法和語義一致。
tri是用來強調三態門的使用,三態門值 0 1 X Z。
三態線可以用于描述多個驅動源驅動同一根線的線網類型;并且沒有其他特殊的意義。
7. pullup和 pulldown的用法
如果兩個INOUT都處于高阻態,那么接收到的信號到底是什么狀態呢?這實際上等效為兩個INPUT端口連接,也就等效為INPUT端口懸空。
這應該是取決于外圍的驅動,添加的上拉或者下拉電阻,一般而言,FPGA添加的是上拉電阻,也就意味著此時chipscope采集的數據是高電平。
FPGA管腳內部可以配置弱上拉或下拉電阻來實現Z狀態下的控制。
在verilog代碼中直接可以定義信號線的==上拉==或者==下拉==模式
或者在約束文件中也可以也可以通過約束文件中配置信號線的上拉或者下拉模式
具體用法:
pullup p1 ( );
8. 下面代碼中的wire和assign用法有什么區別
paramenter addr =4‘h0;
input [13:0] aaa;
wire ccc=aaa[13:10]==addr;
------------------------------------------
assign bbb=(aaa==16’d0);
從用法來說是一樣的,assign是一種線的賦值語句,普通的io口也可以直接賦值,其實io口在電路上就是一種wire。
reg 與 寄存器實際上應該反過來講:
- 如果要綜合寄存器,需要同時滿足倆個條件:
定義為reg,
在always @posedge(negedge) block中賦值
- 如果要綜合組合邏輯,可以(任意):
定義為wire, 用assign賦值
定義為reg, 只在always @(a b c d) block中賦值
在verilog語言中的reg類型只是語法意義上。reg類型的變量不能通過assign賦值,而wire類型的變量不能在always block中賦值。
9. verilog中generater語句的使用,以及genvar用法
在Verilog-2001里,新增加的generate語句拓展了這種用法(其思想來源于VHDL
語言)。除了允許復制產生primitive和module的多個實例化,同時也可以復制產生多個net、reg、parameter、assign、always、initial、task、function。
generate語句有generate-for、genreate-if和generate-case三種語句
generate-for語句必須用genvar關鍵字定義for的索引變量。
module gray2bin2 (bin, gray);
prameter SIZE = 8;
ouput [SIZE-1:0] bin;
input [SIZE-1:0] gray;
reg [SIZE-1:0] bin;
genvar i;
generate
for(i=0; i 《 SIZE; i=i+1)
begin: bit
assign bin[i] = ^gray[SIZE-1:i]
end
endgenerate
endmodule
9. verilog中 {}和{{}}的區別。
{}表示拼接,{第一位,第二位,…}
{{}}表示復制,{4{a}}等同于{a,a,a,a}
10. IBUFDS、IBUFGDS和OBUFDS差分信號緩沖
IBUFDS、IBUFGDS和OBUFDS都是差分信號緩沖器,用于不同電平接口之間的緩沖和轉換。
IBUFDS是差分輸入的時候用;
OBUFDS是差分輸出的時候用;
IBUFGDS則是時鐘信號專用的輸入緩沖器。
具體見筆記中《==FPGA差分信號緩沖的轉換(IBUFDS、IBUFGDS和OBUFDS)==》
11. 時鐘配置中MMCM 與PLL的不同點
MMCM 混合時鐘管理單元也是由pll構成,只是增加了一些額外性能, 比如給定輸入時鐘中的頻率約束輸出時鐘頻率相位的關系,生成不同的時鐘,其實內部也是pll去經過VCO環路鎖定輸出的。可以理解為MMCM比PLL更高級復雜一些的時鐘管理單元。
評論