初識Verilog描述-1
“Verilog不同于C,Python,JAVA等軟件語言,Verilog是以數(shù)字電路知識為背景支撐,以對數(shù)字電路系統(tǒng)進(jìn)行描述的一門語言。因此用Verilog描述數(shù)字電路,必須要有數(shù)字電路知識為背景支撐。否則描述出來的電路性能將會(huì)很差。本篇我們先了解一下最基本的Verilog對數(shù)字電路描述的方法與代碼風(fēng)格,具體語法細(xì)節(jié)在這不做過多解釋?!?/p>
在了解Verilog基本構(gòu)成之前,先要了解數(shù)字電路里面有什么元素需要被描述。
如下圖所示,為一個(gè)實(shí)例電路外部原理圖:
從外部看一個(gè)電路需要描述的元素如下:
電路名字
輸入端口以及位寬
輸出端口以及位寬
端口描述有兩種方式。
以上圖為例:
(1)
module share_1(
clk,
rst_n,
a,
b,
data_out
);
input clk;
input rst_n;
input[7:0] a;
input[7:0] b;
output[8:0] data_out;
(2)
module share_1(
input clk,
input rst_n,
input [7:0] a,
input [7:0] b,
output [8:0] data_out
);
下圖為其內(nèi)部電路結(jié)構(gòu):
電路內(nèi)部需要描述元素有:
信號的類型:reg型(所有在always電路里面將要做改變的信號),wire型(電路信號連線)
如上例電路:輸入信號本來就為電路信號連線,且在端口聲明中已經(jīng)聲明,無需再做wire 聲明。
輸出信號data_out是寄存器的輸出,因此聲明為: reg[8:0] data_out;
節(jié)點(diǎn)信號add_out(對應(yīng)電路上的OUT),為加法器的輸出。如果加法器是用always塊實(shí)現(xiàn)的,如下:
always @( * ) begin
add_out = a+b;
end
則聲明為reg型: reg[8:0] add_out;
如果加法器是用assign語句實(shí)現(xiàn)的,如下:
assign add_out = a+b;
則聲明為wire型: wire[8:0] add_out;
注意:所有聲明必須帶上位寬,否則系統(tǒng)工具將其默認(rèn)為單位寬,如上信號add_out為9位寬,因此聲明為 reg [8:0] add_out;
組合邏輯電路: 可以利用 assign 或者 always @(*) 語句描述。一般復(fù)雜的組合邏輯電路利用 always @(*)語句塊描述。如上加法器的實(shí)現(xiàn)既可以用always語句實(shí)現(xiàn),也可以利用assign語句實(shí)現(xiàn)。
寄存器(有如下幾種常用的不同的寄存器模型):
(1) 時(shí)鐘信號上升沿驅(qū)動(dòng),復(fù)位信號低電平有效,與時(shí)鐘異步復(fù)位:
always @( posedge clk or negedge rst_n ) begin
if( !rst_n )
data_out <= 8h00;
else
data_out <= data_in;
end
(2)時(shí)鐘信號上升沿驅(qū)動(dòng),復(fù)位信號高電平有效,與時(shí)鐘異步復(fù)位:
always @( posedge clk or posedge rst ) begin
if( rst )
data_out <= 8h00;
else
data_out <= data_in;
end
(3) 時(shí)鐘信號下降沿驅(qū)動(dòng),復(fù)位信號高電平有效,與時(shí)鐘同步復(fù)位:
always @( negedge clk ) begin
if( rst_n )
data_out <= 8h00;
else
data_out <= data_in;
end
(4)時(shí)鐘信號上升沿驅(qū)動(dòng),復(fù)位信號低電平有效,與時(shí)鐘同步復(fù)位,并且?guī)в懈唠娖绞鼓苄盘枺?/p>
always @( posedge clk ) begin
if( !rst_n )
data_out <= 8h00;
else if( enable )
data_out <= data_in;
else
data_out <= data_out;
end
給出兩種完整的描述方式,大家自行體會(huì),電路功能為帶寄存器輸出的8位無符號數(shù)加法器:
(1)
module share_1(
clk,
rst_n,
a,
b,
data_out
);
input clk;
input rst_n;
input[7:0] a;
input[7:0] b;
output[8:0] data_out;
reg[8:0] data_out;
wire[8:0] add_out;
assign add_out = a+b;
always @( posedge clk or negedge rst_n ) begin
if( !rst_n )
data_out <= 9h00;? ? ? ? ? ? ? ? ? ? ? ? ??
else
data_out <= add_out;? ? ? ? ? ? ? ? ? ? ? ??
end
endmodule
(2)
module share_1(
input clk,
input rst_n,
input [7:0] a,
input [7:0] b,
output [8:0] data_out
);
reg[8:0] data_out ;
reg[8:0] add_out;
always @( * ) begin
add_out = a+b;
end
always @( posedge clk or negedge rst_n ) begin
if( !rst_n )
data_out <= 9h00;? ? ? ? ? ? ? ? ? ? ? ??
else
data_out <= add_out;? ? ? ? ? ? ? ? ? ? ??
end
endmodule
注:這里只是帶著大家從電路入手,宏觀的了解一下Verilog描述數(shù)字電路的結(jié)構(gòu)與注意事項(xiàng),具體語法可自行學(xué)習(xí)。
-
邏輯電路
+關(guān)注
關(guān)注
13文章
492瀏覽量
42535 -
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109925 -
數(shù)字電路
+關(guān)注
關(guān)注
193文章
1595瀏覽量
80379
原文標(biāo)題:初識Verilog描述-1
文章出處:【微信號:LF-FPGA,微信公眾號:小魚FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論