廣西十佳旅游景區(qū)網(wǎng)站人多怎么優(yōu)化
牛客網(wǎng)Verilog刷題——VL41
- 題目
- 答案
題目
??請(qǐng)?jiān)O(shè)計(jì)一個(gè)可以實(shí)現(xiàn)任意小數(shù)分頻的時(shí)鐘分頻器,比如說(shuō)8.7分頻的時(shí)鐘信號(hào),注意rst為低電平復(fù)位。提示:其實(shí)本質(zhì)上是一個(gè)簡(jiǎn)單的數(shù)學(xué)問(wèn)題,即如何使用最小公倍數(shù)得到時(shí)鐘周期的分別頻比。設(shè)小數(shù)為n,此處以8.7倍分頻的時(shí)鐘周期為例。首先,由于不能在硬件上進(jìn)行小數(shù)的運(yùn)算(比如2.1個(gè)時(shí)鐘這種是不現(xiàn)實(shí)的,也不存在3.3個(gè)寄存器),小數(shù)分頻不能做到分頻后每個(gè)時(shí)鐘周期都是源時(shí)鐘的n倍,也無(wú)法實(shí)現(xiàn)占空比為1/2,因此,考慮小數(shù)分頻,其實(shí)現(xiàn)方式應(yīng)當(dāng)為53個(gè)clk——out時(shí)鐘周期是10個(gè)clkin時(shí)鐘周期的8.7倍。
??信號(hào)示意圖如下。
??波形示意圖如下。
??輸入輸出描述:
信號(hào) | 類(lèi)型 | 輸入/輸出 | 位寬 | 描述 |
---|---|---|---|---|
clk_in | wire | Intput | 1 | 系統(tǒng)時(shí)鐘信號(hào) |
rst | wire | Intput | 1 | 異步復(fù)位信號(hào),低電平有效 |
clk_out | wire | Output | 1 | 分頻時(shí)鐘 |
答案
`timescale 1ns/1nsmodule div_M_N(input wire clk_in,input wire rst,output wire clk_out
);parameter M_N = 8'd87; parameter c89 = 8'd24; // 8/9時(shí)鐘切換點(diǎn)parameter div_e = 5'd8; //偶數(shù)周期parameter div_o = 5'd9; //奇數(shù)周期
//*************code***********//reg [3:0] clk_cnt; //時(shí)鐘計(jì)數(shù)器(用于計(jì)數(shù)8個(gè)時(shí)鐘和9個(gè)時(shí)鐘)reg [6:0] cyc_cnt; //時(shí)鐘計(jì)數(shù)器(用于計(jì)數(shù)87個(gè)時(shí)鐘周期)reg div_flag; //8/9時(shí)鐘控制信號(hào)(0:計(jì)數(shù)8個(gè)時(shí)鐘 1:計(jì)數(shù)9個(gè)時(shí)鐘)reg clk_out_r; //輸出小數(shù)分頻時(shí)鐘信號(hào)//時(shí)鐘計(jì)數(shù)器(用于計(jì)數(shù)8個(gè)時(shí)鐘和9個(gè)時(shí)鐘)always@(posedge clk_in or negedge rst) beginif(~rst)clk_cnt <= 0;else if(~div_flag) //計(jì)數(shù)8個(gè)時(shí)鐘clk_cnt <= clk_cnt==(div_e-1)? 0: clk_cnt+1;else //計(jì)數(shù)9個(gè)時(shí)鐘clk_cnt <= clk_cnt==(div_o-1)? 0: clk_cnt+1;end//時(shí)鐘計(jì)數(shù)器(用于計(jì)數(shù)87個(gè)時(shí)鐘周期)always@(posedge clk_in or negedge rst) beginif(~rst)cyc_cnt <= 0;elsecyc_cnt <= cyc_cnt==(M_N-1)? 0: cyc_cnt+1;end//8/9時(shí)鐘控制信號(hào)(0:計(jì)數(shù)8個(gè)時(shí)鐘 1:計(jì)數(shù)9個(gè)時(shí)鐘)always@(posedge clk_in or negedge rst) beginif(~rst)div_flag <= 0;elsediv_flag <= cyc_cnt==(M_N-1)||cyc_cnt==(c89-1)? ~div_flag: div_flag;end//輸出小數(shù)分頻時(shí)鐘always@(posedge clk_in or negedge rst) beginif(~rst)clk_out_r <= 0;else if(clk_cnt==0 || clk_cnt==4)clk_out_r <= ~clk_out_r; elseclk_out_r <= clk_out_r;endassign clk_out = clk_out_r;
//*************code***********//
endmodule