题解 | #信号发生器#

信号发生器

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 S0=2'b00;
	parameter S1=2'b01;
	parameter S2=2'b10;

	reg [4:0]temp;//记录一锯齿波最后一个点是不是0
	reg [6:0]cnt2;
	always@(posedge clk or negedge rst_n)begin
		if(~rst_n)
		cnt2<=0;
		else if(wave_choise==2'd2)
		    if(cnt2==39)        
		   	cnt2<=0;
			else if(temp==0)
			cnt2<=cnt2+1;
		else
			cnt2<=0;
	end

     always@(posedge clk or negedge rst_n)begin
		if(~rst_n)
		temp<=0;
		else if(wave_choise==2'd1)
		    temp<=wave+1;//正常打拍,temp比wave少一个周期
		else if (wave_choise==2'd2)
		     if(temp==0)
			 temp<=0;
			 else
			 temp<=temp-1;
	 end

	reg [4:0] cnt;
	always@(posedge clk or negedge rst_n)begin
		if(~rst_n)
		cnt<=0;
		else if(wave_choise==2'd0)
		    if(cnt==19)        
		   	cnt<=0;
			else 
			cnt<=cnt+1;
		else
			cnt<=0;
	end
   
always@(posedge clk or negedge rst_n)begin
		if(~rst_n)
		wave<=0;
		else
	case(wave_choise)

	S0:begin
		if(cnt==9)
		wave<=20;
		else if(cnt==19)
		wave<=0;
	end

	S1:begin
		if(wave==20)
		wave<=0;
		else 
		wave<=wave+1;
	end

S2:begin
		if(temp!==0)
		wave<=wave-1;
		else 
		if(cnt2<=19)
		wave<=wave+1;
		else if(cnt2>=20)
		wave<=wave-1;
	end
	endcase
end

  
endmodule

这题比较有趣,需要注意的是从1进入2的状态时,要先看wave是否为0,为0则递增,不为0时要先减到0再递增,这里是用在1下寄存wave的值,由于会慢一拍,所以应该打拍的值加一才是wave的值,以temp的值做判断,temp减到0时,wave才可以自增,再一个需要注意wave在2下的周期为40,而不是41。从0到20上升部分21个时钟,从20下来19-1为19个时钟,一共40个时钟,之前以为是41个结果wave的值减到负数了。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务