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