Vivado 軟件提供了HDL編寫中常用的示例,旨在幫助初學者更好地理解和掌握HDL編程,這里分享一下verilog代碼示例。
一、觸發器、寄存器與鎖存器
Vivado綜合工具根據HDL代碼會選擇4種寄存器原語:
觸發器是一種存儲器件,可以用來存儲一個二進制位。 常見的觸發器有D觸發器、JK觸發器、T觸發器等。
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
寄存器是一種廣泛使用的存儲器件,可以在時序邏輯中存儲多個比特位,通常由觸發器或D觸發器等邏輯單元實現。 一個寄存器需要同時包含時鐘、使能和數據輸入端口。
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綜合會報告檢測出的鎖存器(Latches),這些鎖存器是由組合邏輯HDL代碼設計錯誤引起的,比如if或case狀態不完整。 綜合會為檢測出的鎖存器報告一個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
二、三態緩沖器
三態緩沖器是一種帶有使能控制的存儲器件,允許多個設備共享同一個總線信號。 當三態緩沖器的使能信號為高時,它就會輸出輸入信號; 當使能信號為低時,它就會將輸出信號設置為高阻(高阻狀態)。
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
三、移位寄存器
移位寄存器是一種可以將數據向左或向右移位的存儲器件。 它可以在時序邏輯中被用來實現FIR濾波器、數字信號處理等應用。
Vivado 綜合中使用 SRL 類型的資源(SRL16E 和 SRLC32E)來實現移位寄存器。 根據移位寄存器的長度不同,在綜合時會選擇采用一個 SRL 類型原語,或采用級聯的 SRLC 類型原語進行實現。
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
四、乘法器
乘法器是一種數學運算器件,可以在FPGA設計中進行數字乘法。 乘法器在數碼信號處理器中非常常見,在數字信號處理、濾波器和音頻編解碼器等領域有廣泛的應用。
Vivado綜合時會根據實際情況,確定是用LUT實現,還是用DSP實現,建議使用乘法時,計算結果輸出多打兩拍,有助于改善時序。
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設計支持EDIF網表,可以在HDL源代碼中使用BLACK_BOX屬性完成實例化,該實例將被視作黑盒子。
//模塊定義
(* black_box *) module black_box
(
input in1, in2,
output dout
);
//此處省略代碼
endmodule
//模塊實例化
module black_box
(
input DI_1, DI_2,
output DOUT
);
//模塊調用
black_box u_black_box (
.in1(DI_1),
.in2(DI_2),
.dout(DOUT)
);
endmodule
六、FSM狀態機
Vivado綜合時可以從RTL源碼中提取出有限狀態機(FSM)邏輯,支持Moore和Mealy型狀態機。 一個狀態機由狀態寄存器、下一個狀態功能、輸出功能三部分組成。
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
-
寄存器
+關注
關注
31文章
5359瀏覽量
120790 -
HDL
+關注
關注
8文章
327瀏覽量
47416 -
鎖存器
+關注
關注
8文章
906瀏覽量
41563 -
觸發器
+關注
關注
14文章
2000瀏覽量
61255 -
Vivado
+關注
關注
19文章
815瀏覽量
66704
發布評論請先 登錄
相關推薦
使用Vivado實現硬宏的示例?
Vivado生成的HDL代碼是否在Vivado自帶的許可證之上有任何特殊的許可
怎么將Vivado項目轉換為ISE項目
vivado_tutorial示例項目文檔內容
請問如何在Vivado項目中實例化hdl系統生成器輸出的多個實例》
Vivado的多種RAM編寫方式
Vivado中進行HDL代碼設計
Vivado中用HDL定義BRAM存儲器并用updatemem合成bit文件
![<b class='flag-5'>Vivado</b>中用<b class='flag-5'>HDL</b>定義BRAM存儲器并用updatemem合成bit文件](https://file1.elecfans.com//web2/M00/A6/A6/wKgZomUMP2SADwktAAAuKTqnSm0445.png)
Verilog HDL語言及VIVADO的應用
![Verilog <b class='flag-5'>HDL</b>語言及<b class='flag-5'>VIVADO</b>的應用](https://file.elecfans.com/web1/M00/93/B0/o4YBAFztHbSAF-isAAAmlUTHB8I083.jpg)
Vivado中電路結構的網表描述
![<b class='flag-5'>Vivado</b>中電路結構的網表描述](https://file.elecfans.com/web1/M00/EE/F6/o4YBAGCd5diAT806AAAUYANxOzc031.jpg)
Vivado使用技巧-HDL編寫
自己編寫函數示例代碼很難嗎?分享幾個示例!
![自己<b class='flag-5'>編寫</b>函數<b class='flag-5'>示例</b>代碼很難嗎?分享幾個<b class='flag-5'>示例</b>!](https://file1.elecfans.com//web2/M00/AE/9E/wKgaomVVzmuAepXUAAGhHEQTe5I163.png)
編寫高效Testbench的指南和示例
![<b class='flag-5'>編寫</b>高效Testbench的指南和<b class='flag-5'>示例</b>](https://file1.elecfans.com/web2/M00/0A/72/wKgZomcgmb-AdWI4AAA2OcTRjRg055.png)
評論