前言:
偶數(shù)分頻容易得到:N倍偶數(shù)分頻,可以通過由待分頻的時(shí)鐘觸發(fā)計(jì)數(shù)器計(jì)數(shù),當(dāng)計(jì)數(shù)器從0計(jì)數(shù)到N/2-1時(shí),輸出時(shí)鐘進(jìn)行翻轉(zhuǎn),并給計(jì)數(shù)器一個(gè)復(fù)位信號,使得下一個(gè)時(shí)鐘從零開始計(jì)數(shù)。以此循環(huán)下去。
奇數(shù)分頻如何得到呢?
第一部分 奇數(shù)分頻
奇數(shù)分頻方法:
N倍奇數(shù)分頻,首先進(jìn)行上升沿觸發(fā)進(jìn)行模N計(jì)數(shù),計(jì)數(shù)到(N-1)/2時(shí)輸出時(shí)鐘翻轉(zhuǎn),同時(shí)進(jìn)行下降沿觸發(fā)的模N計(jì)數(shù),計(jì)數(shù)到(N-1)/2時(shí)輸出時(shí)鐘翻轉(zhuǎn)時(shí),進(jìn)行輸出時(shí)鐘時(shí)鐘翻轉(zhuǎn)。兩個(gè)占空比非50%的n分頻時(shí)鐘相或運(yùn)算,得到占空比為50%的奇數(shù)N分頻時(shí)鐘。
或者使用“相與”,方法與上相同,只是翻轉(zhuǎn)的數(shù)值變?yōu)椋∟-2)/2。
三分頻的Verilog實(shí)現(xiàn):
module Divider_Multiple(
input clk_i,
input rst_n_i,
output div2_o,
output div3_o
);
reg div2_o_r;
always@(posedge clk_i or negedge rst_n_i) //二分頻
begin
if(!rst_n_i)
div2_o_r else
div2_o_r end
reg [1:0] pos_cnt;
reg [1:0] neg_cnt;
always@(posedge div2_o_r or negedge rst_n_i) //上升沿計(jì)數(shù)
begin
if(!rst_n_i)
pos_cnt else if(pos_cnt==2'd2)
pos_cnt else
pos_cnt end
always@(negedge div2_o_r or negedge rst_n_i) //下降沿計(jì)數(shù)
begin
if(!rst_n_i)
neg_cnt else if(neg_cnt==2'd2)
neg_cnt else
neg_cnt end
reg div3_o_r0;
reg div3_o_r1;
always@(posedge div2_o_r or negedge rst_n_i)
begin
if(!rst_n_i)
div3_o_r0 else if(pos_cnt div3_o_r0 else
div3_o_r0 end
always@(negedge div2_o_r or negedge rst_n_i)
begin
if(!rst_n_i)
div3_o_r1 else if(neg_cnt div3_o_r1 else
div3_o_r1 end
assign div2_o=div2_o_r;
assign div3_o=div3_o_r0 | div3_o_r1; //相或
endmodule
仿真:
仿真文件:
module Divider_Multiple_tb;
// Inputs
reg clk_i;
reg rst_n_i;
// Outputs
wire div2_o;
wire div3_o;
// Instantiate the Unit Under Test (UUT)
Divider_Multiple uut (
.clk_i(clk_i),
.rst_n_i(rst_n_i),
.div2_o(div2_o),
.div3_o(div3_o)
);
initial
begin
// Initialize Inputs4
clk_i = 0;
rst_n_i = 0;
// Wait 100 ns for global reset to finish
#96;
rst_n_i=1;
end
always
begin
#5 clk_i=~clk_i;
end
endmodule
vivado仿真結(jié)果:
至此,第一部分結(jié)束。
第二部分 邏輯分析儀
增加邏輯分析儀:
首先為了配合手里的zc702板子,修改了一下輸入時(shí)鐘;為了觀察分頻信號,增加了一個(gè)2Hz的信號,將其連接在led上,可以看見led閃爍。
邏輯分析儀的使用分三步走:
1. 在設(shè)計(jì)文件中,在要抓取的信號定義前添加:
(*make_debug="true"*)
2. 導(dǎo)入ILA的IP核:
雙擊添加的IP,在General Options里設(shè)置探針數(shù)(信號組數(shù))和采樣深度(利用BRAM存儲(chǔ)的),在Probe Ports里設(shè)置信號位寬:
OK之后,點(diǎn)擊Generate。
在IP Source里雙擊模板,將例化模板復(fù)制到設(shè)計(jì)文件中,填好對應(yīng)的待測信號:
3. 添加約束-->生成比特文件-->下載-->添加觸發(fā)信號-->抓取。
為了閱讀的連貫性,貼出修改后的代碼:
module Divider_Multiple(
input clk_p,
input clk_n,
input rst_n_i,
output div2_o,
output div3_o,
output div2hz_o
);
IBUFGDS IBUFGDS_inst (
.O(clk_i), // Clock buffer output
.I(clk_p), // Diff_p clock buffer input (connect directly to top-level port)
.IB(clk_n) // Diff_n clock buffer input (connect directly to top-level port)
);
(*make_debug="true"*)wire div2_o;
(*make_debug="true"*)wire div3_o;
(*make_debug="true"*)wire div2hz_o;
reg div2_o_r;
always@(posedge clk_i or negedge rst_n_i) //二分頻
begin
if(rst_n_i)
div2_o_r else
div2_o_r end
reg [1:0] pos_cnt;
reg [1:0] neg_cnt;
always@(posedge div2_o_r or negedge rst_n_i) //上升沿計(jì)數(shù)
begin
if(rst_n_i)
pos_cnt else if(pos_cnt==2'd2)
pos_cnt else
pos_cnt end
always@(negedge div2_o_r or negedge rst_n_i) //下降沿計(jì)數(shù)
begin
if(rst_n_i)
neg_cnt else if(neg_cnt==2'd2)
neg_cnt else
neg_cnt end
reg div3_o_r0;
reg div3_o_r1;
always@(posedge div2_o_r or negedge rst_n_i)
begin
if(rst_n_i)
div3_o_r0 else if(pos_cnt div3_o_r0 else
div3_o_r0 end
always@(negedge div2_o_r or negedge rst_n_i)
begin
if(rst_n_i)
div3_o_r1 else if(neg_cnt div3_o_r1 else
div3_o_r1 end
reg div2hz_o_r;
reg [25:0] div2hz_cnt;
always@(posedge clk_i or negedge rst_n_i)
begin
if(rst_n_i)
div2hz_cnt else if(div2hz_cnt div2hz_cnt else
div2hz_cnt end
always@(posedge clk_i or negedge rst_n_i)
begin
if(rst_n_i)
div2hz_o_r else if(div2hz_cnt==26'd24_999999 || div2hz_cnt==26'd49_999999)
div2hz_o_r else
div2hz_o_r end
assign div2_o=div2_o_r;
assign div3_o=div3_o_r0 | div3_o_r1; //相或
assign div2hz_o=div2hz_o_r;
ila_0 ila_0_0 ( //邏輯分析儀的例化
.clk(clk_i), // input wire clk
.probe0(div2hz_o), // input wire [0:0] probe0
.probe1({div2_o,div3_o}) // input wire [3:0] probe1
);
endmodule
約束文件如下:
set_property PACKAGE_PIN D18 [get_ports {clk_p}]
set_property IOSTANDARD LVDS_25 [get_ports {clk_p}]
set_property PACKAGE_PIN C19 [get_ports {clk_n}]
set_property IOSTANDARD LVDS_25 [get_ports {clk_n}]
set_property PACKAGE_PIN G19 [get_ports {rst_n_i}]
set_property IOSTANDARD LVCMOS18 [get_ports {rst_n_i}]
#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {div2_o}]
set_property IOSTANDARD LVCMOS18 [get_ports {div2_o}]
set_property PACKAGE_PIN D15 [get_ports {div3_o}]
set_property IOSTANDARD LVCMOS18 [get_ports {div3_o}]
set_property PACKAGE_PIN W17 [get_ports {div2hz_o}]
set_property IOSTANDARD LVCMOS18 [get_ports {div2hz_o}]
下載到fpga之后,邏輯分析儀的界面會(huì)自動(dòng)打開,各個(gè)區(qū)域的功能如下,先添加觸發(fā)信號,可以右鍵點(diǎn)擊添加,也可以點(diǎn)擊window-->debug probe將信號拖拽至“觸發(fā)信號”區(qū)域:
總結(jié):
信號運(yùn)算得到新的信號。沒有仿真就沒有發(fā)言權(quán)。
編輯:hfy
-
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94703 -
邏輯分析儀
+關(guān)注
關(guān)注
3文章
214瀏覽量
23202 -
BRAM
+關(guān)注
關(guān)注
0文章
41瀏覽量
10991 -
復(fù)位信號
+關(guān)注
關(guān)注
0文章
54瀏覽量
6344
發(fā)布評論請先 登錄
相關(guān)推薦
評論