Vivado 軟件提供了HDL編寫中常用的示例,旨在幫助初學(xué)者更好地理解和掌握HDL編程,這里分享一下verilog代碼示例。
一、觸發(fā)器、寄存器與鎖存器
Vivado綜合工具根據(jù)HDL代碼會(huì)選擇4種寄存器原語:
- FDCE:帶有時(shí)鐘使能和異步清0的D觸發(fā)器;
- FDPE:帶有時(shí)鐘使能和異步預(yù)置(Preset)的D觸發(fā)器;
- FDSE:帶有時(shí)鐘使能和同步置位的D觸發(fā)器;
- FDRE:帶有時(shí)鐘使能和同步復(fù)位的D觸發(fā)器;
觸發(fā)器是一種存儲(chǔ)器件,可以用來存儲(chǔ)一個(gè)二進(jìn)制位。 常見的觸發(fā)器有D觸發(fā)器、JK觸發(fā)器、T觸發(fā)器等。
module dff(
input clk,
input reset,
input d,
output reg q
);
always @(posedge clk or posedge reset) begin
if (reset) begin
q <= 0;
end else begin
q <= d;
end
end
endmodule
寄存器是一種廣泛使用的存儲(chǔ)器件,可以在時(shí)序邏輯中存儲(chǔ)多個(gè)比特位,通常由觸發(fā)器或D觸發(fā)器等邏輯單元實(shí)現(xiàn)。 一個(gè)寄存器需要同時(shí)包含時(shí)鐘、使能和數(shù)據(jù)輸入端口。
module register(
input clk,
input enable,
input [7:0] d,
output reg [7:0] q
);
always @(posedge clk) begin
if (enable) begin
q <= d;
end
end
endmodule
Vivado綜合會(huì)報(bào)告檢測出的鎖存器(Latches),這些鎖存器是由組合邏輯HDL代碼設(shè)計(jì)錯(cuò)誤引起的,比如if或case狀態(tài)不完整。 綜合會(huì)為檢測出的鎖存器報(bào)告一個(gè)WARNING(Synth 8-327)。
module latches (
input a,
input b,
input clr,
output reg q
);
always @ *
if(CLR) q = a;
else if(G) q = b;
endmodule
二、三態(tài)緩沖器
三態(tài)緩沖器是一種帶有使能控制的存儲(chǔ)器件,允許多個(gè)設(shè)備共享同一個(gè)總線信號(hào)。 當(dāng)三態(tài)緩沖器的使能信號(hào)為高時(shí),它就會(huì)輸出輸入信號(hào); 當(dāng)使能信號(hào)為低時(shí),它就會(huì)將輸出信號(hào)設(shè)置為高阻(高阻狀態(tài))。
module tristate_buffer(
input enable,
input [7:0] data_in,
output reg [7:0] data_out,
inout [7:0] bus
);
assign bus = enable ? data_out : 8'bZ;
always @(bus, enable) begin
if (enable) begin
data_out <= data_in;
end
end
endmodule
三、移位寄存器
移位寄存器是一種可以將數(shù)據(jù)向左或向右移位的存儲(chǔ)器件。 它可以在時(shí)序邏輯中被用來實(shí)現(xiàn)FIR濾波器、數(shù)字信號(hào)處理等應(yīng)用。
Vivado 綜合中使用 SRL 類型的資源(SRL16E 和 SRLC32E)來實(shí)現(xiàn)移位寄存器。 根據(jù)移位寄存器的長度不同,在綜合時(shí)會(huì)選擇采用一個(gè) SRL 類型原語,或采用級(jí)聯(lián)的 SRLC 類型原語進(jìn)行實(shí)現(xiàn)。
module shift_register(
input clk,
input [7:0] data_in,
output reg [7:0] data_out
);
reg [7:0] reg_data [0:7];
always @(posedge clk) begin
for (int i = 7; i > 0; i--) begin
reg_data[i] <= reg_data[i-1];
end
reg_data[0] <= data_in;
end
assign data_out = reg_data[7];
endmodule
四、乘法器
乘法器是一種數(shù)學(xué)運(yùn)算器件,可以在FPGA設(shè)計(jì)中進(jìn)行數(shù)字乘法。 乘法器在數(shù)碼信號(hào)處理器中非常常見,在數(shù)字信號(hào)處理、濾波器和音頻編解碼器等領(lǐng)域有廣泛的應(yīng)用。
Vivado綜合時(shí)會(huì)根據(jù)實(shí)際情況,確定是用LUT實(shí)現(xiàn),還是用DSP實(shí)現(xiàn),建議使用乘法時(shí),計(jì)算結(jié)果輸出多打兩拍,有助于改善時(shí)序。
module multiplier_unsigned(
input clk,
input [7:0] a,
input [7:0] b,
output reg signed [15:0] c
);
always @(posedge clk) begin
c <= a * b;
end
endmodule
五、黑盒子
FPGA設(shè)計(jì)支持EDIF網(wǎng)表,可以在HDL源代碼中使用BLACK_BOX屬性完成實(shí)例化,該實(shí)例將被視作黑盒子。
//模塊定義
(* black_box *) module black_box
(
input in1, in2,
output dout
);
//此處省略代碼
endmodule
//模塊實(shí)例化
module black_box
(
input DI_1, DI_2,
output DOUT
);
//模塊調(diào)用
black_box u_black_box (
.in1(DI_1),
.in2(DI_2),
.dout(DOUT)
);
endmodule
六、FSM狀態(tài)機(jī)
Vivado綜合時(shí)可以從RTL源碼中提取出有限狀態(tài)機(jī)(FSM)邏輯,支持Moore和Mealy型狀態(tài)機(jī)。 一個(gè)狀態(tài)機(jī)由狀態(tài)寄存器、下一個(gè)狀態(tài)功能、輸出功能三部分組成。
module fsm(
input clk,
input reset,
input [1:0] state_in,
output reg [1:0] state_out
);
parameter STATE_A = 2'd0;
parameter STATE_B = 2'd1;
parameter STATE_C = 2'd2;
reg [1:0] state_reg;
always @(posedge clk) begin
if (reset) begin
state_reg <= STATE_A;
end else begin
case (state_reg)
STATE_A: state_reg <= STATE_B;
STATE_B: state_reg <= STATE_C;
STATE_C: state_reg <= STATE_A;
default: state_reg <= STATE_A;
endcase
end
end
assign state_out = state_reg;
endmodule
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120232 -
HDL
+關(guān)注
關(guān)注
8文章
327瀏覽量
47378 -
鎖存器
+關(guān)注
關(guān)注
8文章
906瀏覽量
41496 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2000瀏覽量
61132 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66472
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論