module sd_interval (clk, load, sd, out_interval);
input clk; input load; // интервал строба load больше или равен периода clk input [3:0] sd; output out_interval;// длительностью в целое число sd (исключая 0)
reg [3:0] ct;// счетчик reg trigger_enable;// интервал, в котором разрешена работа счетчика reg [1:0] shift_left_rg;
wire enable_load;
assign out_interval = trigger_enable; /// схема формирования одиночного импульса enable_load длительностью в один такт clk /// по переднему фронту сигнала load always @ (posedge clk) begin shift_left_rg <= {shift_left_rg[0], load};// end
assign enable_load = shift_left_rg[0] & ~shift_left_rg[1]; ///////////////////////////////////////////////////////////////////////////// always @ (posedge clk) begin if (enable_load == 1'b1) ct <= sd; // по enable_load в счетчик загружаем число sd else if (trigger_enable == 1'b1) ct <= ct - 1'b1;// работаем на вычитание в интервале trigger_enable end always @ (posedge clk) begin if (enable_load == 1'b1) trigger_enable <= 1'b1;// по enable_load разрешаем интервал работы счетчика else if (ct == 4'd1)//когда счетчик досчитает до значения единица, запрещаем работу счетчика trigger_enable <= 1'b0; end endmodule
|