什么是 Verilog 語(yǔ)言
Verilog一般指Verilog HDL。Verilog HDL是一種硬件描述語(yǔ)言(HDL:Hardware Description Language),以文本形式來(lái)描述數(shù)字系統(tǒng)硬件的結(jié)構(gòu)和行為的語(yǔ)言,用它可以表示邏輯電路圖、邏輯表達(dá)式,還可以表示數(shù)字邏輯系統(tǒng)所完成的邏輯功能。
Verilog 語(yǔ)言要素
? Verilog的設(shè)計(jì)初衷是成為一種基本語(yǔ)法與C語(yǔ)言相近的硬件描述語(yǔ)言。這是因?yàn)镃語(yǔ)言在Verilog設(shè)計(jì)之初,已經(jīng)在許多領(lǐng)域得到廣泛應(yīng)用,C語(yǔ)言的許多語(yǔ)言要素已經(jīng)被許多人習(xí)慣。一種與C語(yǔ)言相似的硬件描述語(yǔ)言,可以讓電路設(shè)計(jì)人員更容易學(xué)習(xí)和接受。不過(guò),Verilog與C語(yǔ)言還是存在許多差別。另外,作為一種與普通計(jì)算機(jī)編程語(yǔ)言不同的硬件描述語(yǔ)言,它還具有一些獨(dú)特的語(yǔ)言要素,例如向量形式的線網(wǎng)和寄存器、過(guò)程中的非阻塞賦值等??偟膩?lái)說(shuō),具備C語(yǔ)言的設(shè)計(jì)人員將能夠很快掌握Verilog硬件描述語(yǔ)言。
Verilog基本語(yǔ)法
Verilog基本結(jié)構(gòu)
/* 模塊聲明 */
module flowing_light(
/* 端口定義 */
input clk,
input rst,
output [15:0] led
);
/* 信號(hào)類(lèi)型聲明 */
reg [29:0] cnt_reg;
reg [15:0] light_reg;
always@ (posedge clk) begin
/* 功能描述 */
if(!rst)
cnt_reg <= 0;
else if (cnt_reg >= 100000000)
cnt_reg <= 0;
else
cnt_reg += 1;
end
always@ (posedge clk) begin
/* 功能描述 */
if(!rst)
light_reg <= 16'h0001;
else if(cnt_reg == 29'd100000000) begin
if(light_reg == 16'h8000)
light_reg <= 16'h0001;
else
light_reg <= light_reg << 1;
end
end
assign led = light_reg;
/* 模塊結(jié)束聲明 */
endmodule
Verilog 常用信號(hào)類(lèi)型
wire型
輸出始終隨輸入的變化而變化的變量,表示結(jié)構(gòu)實(shí)體,如門(mén)店了之間的物理連接。
reg型
對(duì)應(yīng)具有狀態(tài)保持作業(yè)的電路元件,如觸發(fā)器、寄存器等。
Always 塊
always塊的基本說(shuō)明
- 主要描述邏輯功能的塊
- 括號(hào)內(nèi)為敏感信號(hào)表
組合邏輯快塊
always (*) begin
/* 邏輯語(yǔ)句 */
end
時(shí)序邏輯塊
always (posedge clk) begin
/* 邏輯語(yǔ)句 */
end
帶異步下降沿復(fù)位的時(shí)序邏輯塊
always (posedge clk or negedge rst) begin
/* 邏輯語(yǔ)句 */
end
always@(*)和always不加@的區(qū)別
- 若沒(méi)有@,則是一般在teastbench 中產(chǎn)生時(shí)鐘信號(hào),指不會(huì)滿(mǎn)足特定的條件,執(zhí)行完一次后立馬繼續(xù)執(zhí)行下一次,一直重復(fù)執(zhí)行。
- 有@時(shí),是每次執(zhí)行語(yǔ)句時(shí),必須滿(mǎn)足括號(hào)內(nèi)的條件才能繼續(xù)執(zhí)行語(yǔ)句,否則不執(zhí)行。
所以說(shuō):當(dāng)使用always塊生成時(shí)鐘信號(hào)時(shí),不用加上@,加上之后編譯會(huì)發(fā)生錯(cuò)誤。
模塊例化
/* 模塊定義 */
module add(
input a,b;
output c;
assign c=a+b);
endmodule
/* 模塊定義 */
module double_add(
input d,e,f,
output g
);
/* 模塊例化1 */
/* add:模塊名;add_inst1:例化名稱(chēng) */
add add_inst1(
/* 端口映射 */
.a(d),
.b(e),
.c(temp)
);
/* 模塊例化2 */
add add_inst2(
/* 端口映射 */
.a(f),
.b(temo),
.c(g)
);
endmodule