题解 | #信号发生器#

信号发生器

https://www.nowcoder.com/practice/39f6766689cc448e928a0921d1d1f858

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);
//方波 
parameter max =19, half=9;
reg [4:0] sw_cnt;
always@(posedge clk or negedge rst_n) begin
   if(!rst_n) 
      sw_cnt <= 0;
   else if(wave_choise == 0) begin
	    if(sw_cnt >= max)
		   sw_cnt <= 0;
		else
		   sw_cnt <= sw_cnt +1;
	 end
   else
     sw_cnt <= 0;   
end

//三角波
reg flag;//三角波标志信号
always@(posedge clk or negedge rst_n) begin
   if(!rst_n) 
      flag <= 1'b1;
	else if(wave_choise ==2'd2) begin
	  if(wave == 1'b1) //这里从wave =1 -> flag=0 (wave此时减为0) -> wave+1 有两个时钟周期
	    flag <= 1'b0;
	  else if(wave == max)
	    flag <= 1'b1;
	  else 
	     flag <=  flag;
	end
	else begin
	  if(wave == 0)
	     flag <= 1'b0;
	  else
	     flag <= 1'b1;//进入三角波模式的时候如果wave不是0,先进入递减模式减到0
    end
end
	   
	  
always@(posedge clk or negedge rst_n) begin
   if(!rst_n) 
	  wave <= 5'd0;
   else begin
	if(wave_choise ==2'd0) 
	   wave <= (sw_cnt < half) ? 5'd0:((sw_cnt >= max)?5'd0:max+1) ;//方波
    else if(wave_choise ==2'd1) 
	   wave <= (wave >= max+1) ? 5'd0 : (wave +1'b1); //锯齿波
	else if(wave_choise ==2'd2) 
	   wave <= (flag == 1) ? (wave-1'b1) : (wave+1'b1); //三角波
    else
       wave <= 5'd0; 
   end 

end

endmodule

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务