首页 > 编程知识 正文

verilog八分频,分频器verilog

时间:2023-05-04 00:22:48 阅读:153108 作者:1961

1 .一个计数器即可:如果在一个大模块中同时实现四分频、八分频,书写形式有两种:

//第一类四分频、八分频表示法reg [1:0] div_cnt1; always @ (posedge clk _ iornegedgerst _ n _ I ) beginif (! rst_n_i ) div_cnt1=2'b00; elsediv_cnt1=div_cnt1 1'b1; end always @ (posedge clk _ iornegedgerst _ n _ I ) /四分频begin //计数器外出计数div_cnt1if (! RST_n_I(/00011011捕获00和10四分频div4_o_r=1'b0; else if (div _ cn t1==2' b00|| div _ cn t1==2' b10 ) div4_o_r=~div4_o_r; elsediv4_o_r=div4_o_r; end always @ (posedge clk _ iornegedgerst _ n _ I ) /八分频begin //根据同一计数器进行计数注意比较方式if (! RST_n_I(/00011011捕获118分频div8_o_r=1'b0; elseif((div_cnT1[0] ) )~div_cnt1[1] ) /两个是逻辑运算div8_o_r=~div8_o_r; elsediv8_o_r=div8_o_r; end的第一个分频表示法是将计数器计数和分频器输出写入两个always语句块。

//第二四分频八分频的写法reg counter_4; reg [1:0] counter_8; always @ (posedge clk _ iornegedgengrst _ I ) beginif(ngrst_I ) begincounter_4=0; div4_o=0; endelseif(counter_4==1) begincounter_4=0; div4_o=~div4_o; endelseif(counter_4==0) begincounter_4=counter_4 1; endend always @ (posedge clk _ iornegedgengrst _ I ) beginif(~ngrst_I ) begincounter_8=0; div8_o=0; endelseif(counter_8==3) begincounter_8=0; div8_o=~div8_o; endelsebegincounter _8=counter _ 81; endend很明显,第二种写法是将计数器计数和分频输出写入同一个语句块。

分析以上两种写法,显然第一种写法更推荐。 关于四分频和八分频电路,第一种写法是共用一个计数器,节约资源。

二分频的实现比较简单

reg div2_o_r; //2分频电路实际上不需要太复杂,不需要用计数器计数,可以选择always @ (posedge clk _ iornegedgerst _ n _ I ) beginif (! rst_n_i ) div2_o_r=1'b0; else div2_o_r=~div2_o_r; end 2.需要多个计数器。 奇数次的分频这里以3分频为例。 一般来说,3分频电路需要记录上升沿的计数器和记录下降沿的计数器2个。 分频器的输出也是两个分支输出相或的结果。

//三分频电路的实现reg [1:0] pos_cnt; //上升沿计数reg [1:0] neg_cnt; //下降沿计数always @ (posedgeclkornegedgerst _ n )//上升沿; 复位清除; 2通关为止beginif (! rst_n ) pos_cnt=2'b00; elseif(pos_CNT==2'D2 ) pos_cnt=2'b00; elsepos_cnt=pos_cnt 1'b1; end always @ (negedgeclkornegedgerst _ n ) /下降沿; 复位清除; 2通关为止beginif (! rst_n ) neg_cnt=2'b00; elseif(neg_CNT==2'D2 ) neg_cnt=2'b00; elseneg_cnt=neg_cnt 1'b1; end reg div3_o_r0; reg div3_o_r1; always @ (posedgeclkornegedgerst _ n ) beginif (! rst_n ) div3_o_r0=1'b0; elseif(pos_CNT2'D1 ) div3_o_r0=1'b1; elsediv3_o_r0=1'b0; end always @ (negedgeclkornegedgerst _ n ) beginif (! rst_n ) div3_o_r1=1'b0; elseif(neg_CNT2'D1 ) div3_o_r1=1'b1; elsediv3_o_r1=1'b0; endassigndiv3_ o=div3_ o _ r0|div3_ o _ R1;

通过上图的div3_0_r0和r1相或可获得目标波形。

以下代码也可以实现3分频输出,但实际上这样的写法是错误的。 模拟可以通过,但不能合并。

reg [2:0] counter_3; always @ (posedge clk _ iornegedgengrst _ iornegedgeclk _ I ) beginif(ngrst_I ) begincounter_3=0; div3_o=0; endelseif(counter_3==2) begincounter_3=0; div3_o=~div3_o; endelsebegincounter _3=counter _ 31; 结束注意:不能在同一个always语句块内同时监视时钟的上升沿和下降沿。 因为不能合并。

3.FPGA的时钟频率是50MHz,产生频率为2hz的时钟的频率是1/50m=0.02*10^(-6 ) s=20ns

1/2=0.5s=0.5 * 10^9 ns=5 * 10^8 ns

(5 * 10^8 ns )/20=2500_0000

在占空比为50%情况下,计数器每次计数到12_499999和24_999999时,时钟输出反转。

reg [25:0] div2hz_cnt; always @ (posedge clk _ iornegedgerst _ n _ I ) beginif (! rst_n_i ) div2hz_o_r=0; else if (div 2hz _ CNT==26 (d12 _ 499999|| div 2hz _ CNT==26 ) D24_999999 ) div 2hz _ o _ r=~div 2hz _ o _ r 结束

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。