1、利用Quartus II自帶的計(jì)數(shù)器IP核來熟悉怎么使用Quartus II的IP核。
2、使用計(jì)數(shù)器IP核的步驟(具體過程參考視頻,這里貼出幾張比較重要的步驟以及解釋)


這一步不能勾選,否則會(huì)出現(xiàn)其他問題(暫時(shí)還不明白是咋回事)

3、生成的原理圖(看不懂、略)
4、仿真程序
/* 實(shí)驗(yàn)名稱:計(jì)數(shù)器IP核驗(yàn)證 * 程序功能:每5個(gè)時(shí)鐘周期計(jì)數(shù)一次,當(dāng)計(jì)數(shù)10次后輸出一個(gè)高電平 */
`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 給一次高電平,計(jì)數(shù)一次并通過 q 輸出 .clock(clk), // 時(shí)鐘頻率 .cout(cout), // 當(dāng)計(jì)數(shù)器溢出或者計(jì)數(shù)到指定的數(shù)值會(huì)輸出一個(gè)時(shí)鐘周期的高電平 .q(q) // cin 為高電平是,更新計(jì)數(shù)器的值并通過 q 輸出 );
initial clk = 1; always #(`clock_period/2) clk = ~clk; // 產(chǎn)生時(shí)鐘
initial begin repeat(20)begin // 循環(huán) 20 次 // 為了方便理解,這部分是我改寫的代碼 cin = 0; #(`clock_period * 5); //cin 維持5個(gè)時(shí)鐘的低電平 cin = 1; #(`clock_period); //cin 維持1個(gè)時(shí)鐘的高電平
end
cin = 0; // 為避免計(jì)數(shù)器繼續(xù)計(jì)數(shù)輸出,需要將 cin 設(shè)置為低電平
#(`clock_period * 200); // 延時(shí)200個(gè)時(shí)鐘周期 $stop; // 停止執(zhí)行
end
endmodule |
5、輸出的波形

6、兩個(gè)4位計(jì)數(shù)器IP核級(jí)聯(lián)為8位計(jì)數(shù)器

7、源程序(注意,這里需要將計(jì)數(shù)器IP核設(shè)置為 Plain binary 即計(jì)數(shù)到最大值 )
/* 實(shí)驗(yàn)名稱:級(jí)聯(lián)計(jì)數(shù)器IP核 * 程序功能:將兩個(gè)4位計(jì)數(shù)器IP核級(jí)聯(lián)實(shí)現(xiàn)8位計(jì)數(shù)器 */ module mytest(cin, clk, cout, q); input cin; input clk; output cout; output[7:0] q;
wire cout0; // 線網(wǎng)類型,暫時(shí)理解為導(dǎo)線 // 計(jì)數(shù)器0 count_ip count_ip0( .cin(cin), // cin 觸發(fā)計(jì)數(shù) .clock(clk), // 時(shí)鐘 // 計(jì)數(shù)器0的 count 通過 cout0 與計(jì)數(shù)器1的 cin 鏈接 .cout(cout0), // 當(dāng)計(jì)數(shù)器溢出了,cout就會(huì)觸發(fā)一個(gè)時(shí)鐘的高電平 .q(q[3:0]) // 輸出計(jì)數(shù)器的值為低4位,即表示計(jì)數(shù)了多少次 ); // 計(jì)數(shù)器1 count_ip count_ip1( // cin 的觸發(fā)由計(jì)數(shù)器0的cout輸出觸發(fā) .cin(cout0), // 當(dāng)計(jì)數(shù)器0溢出1次這里才計(jì)數(shù)1次 .clock(clk), // 時(shí)鐘 .cout(cout), // 當(dāng)計(jì)數(shù)器1溢出了,就會(huì)輸出一個(gè)時(shí)鐘的高電平 .q(q[7:4]) // 輸出計(jì)數(shù)器的值為高4位,即表示多少個(gè)計(jì)數(shù)器0溢出 ); endmodule
|
8、仿真源程序
/* 實(shí)驗(yàn)名稱:級(jí)聯(lián)計(jì)數(shù)器IP核驗(yàn)證 * 程序功能:測試級(jí)聯(lián)過后的計(jì)數(shù)器是否為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 給一次高電平,計(jì)數(shù)一次并通過 q 輸出 .clk(clk), // 時(shí)鐘頻率 .cout(cout), // 當(dāng)計(jì)數(shù)器溢出或者計(jì)數(shù)到指定的數(shù)值會(huì)輸出一個(gè)時(shí)鐘周期的高電平 .q(q) // cin 為高電平是,更新計(jì)數(shù)器的值并通過 q 輸出 );
initial clk = 1; always #(`clock_period/2) clk = ~clk; // 產(chǎn)生時(shí)鐘
initial begin repeat(300)begin // 循環(huán) 20 次 // 為了方便理解,這部分是我改寫的代碼 cin = 0; #(`clock_period * 5); //cin 維持5個(gè)時(shí)鐘的低電平 cin = 1; #(`clock_period); //cin 維持1個(gè)時(shí)鐘的高電平
end
cin = 0; // 為避免計(jì)數(shù)器繼續(xù)計(jì)數(shù)輸出,需要將 cin 設(shè)置為低電平
#(`clock_period * 200); // 延時(shí)200個(gè)時(shí)鐘周期 $stop; // 停止執(zhí)行
end
endmodule |
9、波形圖(圖中 q 顯示的值是無符號(hào)十進(jìn)制)
10、電路圖
11、級(jí)聯(lián)8位的好處是可以將兩個(gè)計(jì)數(shù)器的值進(jìn)行分離。舉個(gè)例子,我們要將兩位計(jì)數(shù)的數(shù)字顯示在兩個(gè)數(shù)碼管中,那么就可以將計(jì)數(shù)器0的輸出端q直接輸出給表示個(gè)位的數(shù)碼管,而計(jì)數(shù)器1的輸出端q直接輸出給表示十位的數(shù)碼管即可。

12、波形圖(設(shè)置計(jì)數(shù)器計(jì)數(shù)到9,十六進(jìn)制)

| 歡迎光臨 (http://www.denmoz.com/bbs/) | Powered by Discuz! X3.1 |