热身

在学习完下学期的一些简单课程之后,之后的时间就留给了fpga的学习方向,首先用一个小题目来练一练手,回顾一下以前学到的知识

 

看到这个题我第一个想法就是想直接用计数器来实现,在一个使能信号结束之后,输出dout的波形有些类似于奇分频和偶分频,在之前的学习中,我学到了一些奇分频的方法,如制作两个分频后与运算结合得到奇分频,这次我想试一试用一种我理解的比较简单的方法,就是再做一个clk的翻转,使得我可以得到任意位置的表达值,即unclk,同时对clk和unclk计数,就可以很轻松的得到各个位置的数据,考虑到题目中所给的输出并不是一直执行,所以计数器只需要记一次数就ok,所以再做一个使能型号,如题计数器记到9就可以通过使能信号来停止了,同时注意到了计数器带来的偏差,如果用上述方法(时序逻辑)来实现的话,那么得到的dout是会有一点小瑕疵,即会和上图之间隔了一个clk的周期,所以在利用计数的模块务必要用组合逻辑来实现。

代码:

module demmo(clk,clr,dout);

input clk,clr;

output dout;

reg [3:0]cnt_1;

reg [3:0]cnt_2;

reg en_1;

reg en_2;

reg dout;

assign unclk = ~clk;

assign en = ~clr;

always@(posedge clk or negedge clr)

begin

if(!clr) begin

cnt_1 <= 4'b1;

en_1 <= 1;

dout <= 1'b0;

end

else if(en_1) begin

if(cnt_1 == 4'd9)begin

cnt_1 <= 4'b10;

en_1 <= 1'b0;

end

else

cnt_1 <= cnt_1 + 1'b1;

end

else

cnt_1 <= cnt_1;

end 

always@(posedge unclk or negedge clr)

begin

if(!clr) begin

cnt_2 <= 4'b1;

en_2 <= 1;

end

else if(en_2) begin

if(cnt_2 == 4'd9)begin

cnt_2 <= 4'b10;

en_2 <= 1'b0;

end

else

cnt_2 <= cnt_2 + 1'b1;

end

else

cnt_2 <= cnt_2;

end

always@(*)

begin

if(cnt_1 == 4'd2|cnt_1 == 4'd5|cnt_1 == 4'd7|cnt_2 == 4'd4)

dout <= 1'b1;

else if(cnt_1 == 4'd3|cnt_2 == 4'd9|cnt_2 == 4'd5|cnt_2 == 4'd7)

dout <= 1'b0;

else

dout <= dout;

end

endmodule

表现如下:

题目虽然简单,但是也帮助我熟悉了代码编辑的过程以及奇分频的利用方法。

猜你喜欢

转载自www.cnblogs.com/fpgamzy/p/10331674.html