题意整理
对于偶数分频电路,在不考虑时钟同步时钟延迟的问题时,直接使用D触发器级联来实现
题解主体
级联D触发器,可以得到状态转换:
关键在于,上升沿才能触发翻转,但是一个周期只有一个上升沿,因此周期翻倍
clkin |
clkout2 |
clkout4 |
clkout8 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
根据激励方程和输出方程以及思路整理,关键电路如下:
将电路转换成Verilog代码描述如下
//2 分频
reg clk_div2 ;
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
clk_div2 <= 'b0 ;
end
else begin
clk_div2 <= ~clk_div2 ;
end
end
assign clk_out2 = clk_div2 ;
//4 分频
reg clk_div4 ;
always @(posedge clk_out2 or negedge rst) begin
if (!rst) begin
clk_div4 <= 'b0 ;
end
else begin
clk_div4 <= ~clk_div4 ;
end
end
assign clk_out4 = clk_div4 ;
//8 分频
reg clk_div8 ;
always @(posedge clk_out4 or negedge rst) begin
if (!rst) begin
clk_div8 <= 'b0 ;
end
else begin
clk_div8 <= ~clk_div8 ;
end
end
assign clk_out8 = clk_div8 ;
因此实现方式为如下的电路,综合得到:
参考答案
`timescale 1ns/1ns module even_div ( input wire rst , input wire clk_in, output wire clk_out2, output wire clk_out4, output wire clk_out8 ); //2 分频 reg clk_div2 ; always @(posedge clk_in or negedge rst) begin if (!rst) begin clk_div2 <= 'b0 ; end else begin clk_div2 <= ~clk_div2 ; end end assign clk_out2 = clk_div2 ; //4 分频 reg clk_div4 ; always @(posedge clk_out2 or negedge rst) begin if (!rst) begin clk_div4 <= 'b0 ; end else begin clk_div4 <= ~clk_div4 ; end end assign clk_out4 = clk_div4 ; //8 分频 reg clk_div8 ; always @(posedge clk_out4 or negedge rst) begin if (!rst) begin clk_div8 <= 'b0 ; end else begin clk_div8 <= ~clk_div8 ; end end assign clk_out8 = clk_div8 ; endmodule