1、源程序(源碼注釋與源碼對應是最好的解釋)【時序邏輯】
/* 實驗名稱:計數器驗證 * 程序功能:每 500ms ,LED 狀態亮或滅一次 * 時鐘計算:50MHz 的時鐘頻率,那么時鐘周期就是 1/50Mhz = 0.02us == 20ns * 500ms = 500_000_000ns = 500_000_000ns/20ns = 25_000_000次 * 也就是說在 50MHz 的時鐘頻率下,累加 25000000 次就等于 500ms 的時間 */ module mytest(clk_50M, rst_n, led); input clk_50M; // 系統時鐘 50MHz input rst_n; // 全局復位,低電平復位 output reg led; // led 指示燈輸出
// 25000_000 => 0x17D7840 => 4*6+1 = 25位 reg[24:0] cnt; // 定義計數器寄存器
// 計數器程序塊 // always :對某些信號變化感興趣 // posedge: 表示 clk_50m 上升沿時會進入該程序塊 // negedge: 表示 rst_n 下降沿時會進入該程序塊 always@(posedge clk_50M or negedge rst_n)
if(1'b0 == rst_n) // 當 rst_n 引腳為低電平時表示復位 cnt <= 25'd0; // 復位計數器的值 else if(25'd24_999_999 == cnt) // 由于 cnt 是從 0 開始計數,所以需要-1 cnt <= 25'd0; // 避免溢出 else cnt <= cnt + 1'b1; // 計數器計數(累加)
// led 輸出程序塊 always@(posedge clk_50M or negedge rst_n)
if(1'b0 == rst_n) // rst_n 復位時,點亮 led 不做其他事情 led <= 1'b1; else if(25'd24_999_999 == cnt) // 當計數器達到 500ms 時則翻轉一次 led 狀態 led <= ~led; else ; // rst_n 不是復位,同時計數器未滿,空語句,不做其他事情 endmodule |
2、仿真程序
/* 實驗名稱:計數器驗證 */ `timescale 1ns/1ns `define clock_period 20 // 時鐘周期 系統時鐘是50M/s 時鐘周期是1/50Mhz = 0.02us == 20ns
module mytest_tb; // 由于是簡單的仿真測試,所以可以不跟端口列表
reg clk, rst_n; // 激勵信號源 wire led;
mytest counter0(.clk_50M(clk), .rst_n(rst_n), .led(led));
initial clk = 1;// 激勵輸出 小梅哥說這里 clk = 1 仿真時有一定的好處,建議保持這個習慣 // "`" 表示調用宏定義參數 10ns 高電平 10ns 低電平形成一個時鐘周期 always #(`clock_period/2) clk = ~clk; // 產生時鐘信號 20ns一個周期 initial begin rst_n = 1'b0; // 復位 #(`clock_period * 200); // 延時200個時鐘周期 rst_n = 1'b1; #2000000000; // 延時 2秒鐘 $stop; end
endmodule
|
3、程序生成的波形
由于時間太長,所以將比較值25'd24_999_999 修改為25'd24_999 時間原先為500ms變為0.5ms
4、程序生成的電路圖
電路圖理解:
這個原理圖我一開始也看不太懂,后來經過視頻的講解以及結合代碼來看,總算是看明白了。
首先,從25為寄存器(cnt[24..0])開始看:
情況1:寄存器為0~0x17D783E時,Q會輸出該值,傳給加法器進行累加,同時傳給25位比較器(Equal0)
的A端口,比較器會將該值(A端口)與B端口值(0x17D783F)比較,A與B不等則輸出0到翻轉器的ENA.同時也輸入到25位二路選擇器的 SEL 端,翻轉器那邊不會觸發,而二路選擇器的SEL等于0,所以會選擇DATAA的數據輸出給寄存器。而DATAA的數據是由加法器累加(0x17D783E+1),由再傳給寄存器,進入情況2。
情況2:寄存器為0x17D783F時,Q會輸出該值,傳給加法器進行累加,同時傳給比較器的A端口,比較器判斷A與B端口相等,則輸出1到翻轉器的ENA端口,同時輸出1給選擇器的 SEL端口。翻轉器會翻轉電平輸出,而選擇器則會選擇 DATAB 端口的數據(0)傳給寄存器,此時寄存器的值為0.
本來想畫流程圖的,由于項目比較緊,既然已經理解了,就不畫了,抓緊時間學下一個知識點。
KUNH3266 發表于 2018-4-10 11:10
您好 ,想請教您一些問題 ,我現在想做100mhz的計數器 周期是10ns應該怎么去做呢?
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |