1、利用Quartus II自帶的計數器IP核來熟悉怎么使用Quartus II的IP核。
2、使用計數器IP核的步驟(具體過程參考視頻,這里貼出幾張比較重要的步驟以及解釋)
這一步不能勾選,否則會出現其他問題(暫時還不明白是咋回事)
3、生成的原理圖(看不懂、略)
4、仿真程序
/* 實驗名稱:計數器IP核驗證 * 程序功能:每5個時鐘周期計數一次,當計數10次后輸出一個高電平 */
`timescale 1ns/1ns `define clock_period 20
module count_ip_tb;
reg cin; reg clk; wire cout; wire[3:0] q;
count_ip count_ip0( .cin(cin), // cin 給一次高電平,計數一次并通過 q 輸出 .clock(clk), // 時鐘頻率 .cout(cout), // 當計數器溢出或者計數到指定的數值會輸出一個時鐘周期的高電平 .q(q) // cin 為高電平是,更新計數器的值并通過 q 輸出 );
initial clk = 1; always #(`clock_period/2) clk = ~clk; // 產生時鐘
initial begin repeat(20)begin // 循環 20 次 // 為了方便理解,這部分是我改寫的代碼 cin = 0; #(`clock_period * 5); //cin 維持5個時鐘的低電平 cin = 1; #(`clock_period); //cin 維持1個時鐘的高電平
end
cin = 0; // 為避免計數器繼續計數輸出,需要將 cin 設置為低電平
#(`clock_period * 200); // 延時200個時鐘周期 $stop; // 停止執行
end
endmodule |
5、輸出的波形
6、兩個4位計數器IP核級聯為8位計數器
7、源程序(注意,這里需要將計數器IP核設置為 Plain binary 即計數到最大值 )
/* 實驗名稱:級聯計數器IP核 * 程序功能:將兩個4位計數器IP核級聯實現8位計數器 */ module mytest(cin, clk, cout, q); input cin; input clk; output cout; output[7:0] q;
wire cout0; // 線網類型,暫時理解為導線 // 計數器0 count_ip count_ip0( .cin(cin), // cin 觸發計數 .clock(clk), // 時鐘 // 計數器0的 count 通過 cout0 與計數器1的 cin 鏈接 .cout(cout0), // 當計數器溢出了,cout就會觸發一個時鐘的高電平 .q(q[3:0]) // 輸出計數器的值為低4位,即表示計數了多少次 ); // 計數器1 count_ip count_ip1( // cin 的觸發由計數器0的cout輸出觸發 .cin(cout0), // 當計數器0溢出1次這里才計數1次 .clock(clk), // 時鐘 .cout(cout), // 當計數器1溢出了,就會輸出一個時鐘的高電平 .q(q[7:4]) // 輸出計數器的值為高4位,即表示多少個計數器0溢出 ); endmodule
|
8、仿真源程序
/* 實驗名稱:級聯計數器IP核驗證 * 程序功能:測試級聯過后的計數器是否為8位 */ `timescale 1ns/1ns `define clock_period 20
module mytest_tb; reg cin; reg clk; wire cout; wire[7:0] q;
mytest count_ip( .cin(cin), // cin 給一次高電平,計數一次并通過 q 輸出 .clk(clk), // 時鐘頻率 .cout(cout), // 當計數器溢出或者計數到指定的數值會輸出一個時鐘周期的高電平 .q(q) // cin 為高電平是,更新計數器的值并通過 q 輸出 );
initial clk = 1; always #(`clock_period/2) clk = ~clk; // 產生時鐘
initial begin repeat(300)begin // 循環 20 次 // 為了方便理解,這部分是我改寫的代碼 cin = 0; #(`clock_period * 5); //cin 維持5個時鐘的低電平 cin = 1; #(`clock_period); //cin 維持1個時鐘的高電平
end
cin = 0; // 為避免計數器繼續計數輸出,需要將 cin 設置為低電平
#(`clock_period * 200); // 延時200個時鐘周期 $stop; // 停止執行
end
endmodule |
9、波形圖(圖中 q 顯示的值是無符號十進制)
10、電路圖
11、級聯8位的好處是可以將兩個計數器的值進行分離。舉個例子,我們要將兩位計數的數字顯示在兩個數碼管中,那么就可以將計數器0的輸出端q直接輸出給表示個位的數碼管,而計數器1的輸出端q直接輸出給表示十位的數碼管即可。
12、波形圖(設置計數器計數到9,十六進制)
歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |