/*带复位的二分频器RTL结构为一个二选一多路选择器和一个D触发器,D触发器输出端接到选择器一端形成反馈*/
module halfclk(rst,clkin,clkout);
input clkin,rst;
output clkout;
reg clkout;
always@(posedge clkin)
begin
if(!rst) clkout=0;
else clkout=~clkout;
end
endmodule
/*不带复位的二分频,以D触发器的时钟端为输入,将D触发器的输入和输出连接形成反馈,在D触发器输出端可形成clkin的二分频时钟
module halfclk(clkin,clkout);
input clkin;
output clkout;
reg clkout;
always@(posedge clkin)
clkout=~clkout;
endmodule
*/
//Testbench
`timescale 1 ns/ 100 ps
`define clkcycle 50
module halfclk_vlg_tst();
reg clkin;
reg rst;
wire clkout;
always #`clkcycle clkin=~clkin;
initial
begin
clkin=0;
rst=1;
#10 rst=0;
#110 rst=1;
#100000 $stop;
end
halfclk i1 (
.clkin(clkin),
.clkout(clkout),
.rst(rst)
);
endmodule
时序电路少不了时钟,always语句很常见,例如always@(posedge clkin)和always@(negedge clkin),always块中的被赋值的信号必须是reg型,reg型数据在未赋值时是不确定的有必要用利用reset信号进行寄存器复位从而赋初值。
左侧是不带复位的二分频器,右侧是带复位的二分频器,带复位的电路比原先多了一个二选一选择器MUX