题解 | #信号发生器#

信号发生器

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
	);

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

	reg triangle_flag;
	always @(posedge clk or negedge rst_n) begin
		if (~rst_n) begin
			wave <= 0;
			triangle_flag <= 0;
		end else begin
			case (wave_choise) 
				2'b00: begin
					if (square_cnt == 9) begin
						wave <= 20;
					end else if (square_cnt == 19) begin
						wave <= 0;
					end else begin
						wave <= wave;
					end
				end
				2'b01: begin
					if (wave == 20) begin
						wave <= 0;
					end else begin
						wave <= wave + 1;
					end
				end
				2'b10: begin
					if (triangle_flag == 0) begin
						if (wave == 0) begin
							triangle_flag <= 1;
							wave <= wave + 1;
						end else begin
							wave <= wave - 1;
						end 
					end else begin
						if (wave == 20) begin
							triangle_flag <= 0;
							wave <= wave - 1;
						end else begin
							wave <= wave + 1;
						end
					end
				end
				default: begin
					wave <= wave;
				end
			endcase
		end
	end
  
endmodule

按题目所给的时序图,wave的值要保持连续,这会导致波形切换时相位也会发生变化。故要将三种不同的波形生成语句写入同一块中控制wave的连续变化,而不能写成三个独立的波形生成块再按输入进行选取。

全部评论

相关推荐

07-23 14:04
东北大学 C++
既然这样,为什么不点击就送呢
牛马88号:因为你合适。但有很多笔试就挂了、通过了再排序的
点赞 评论 收藏
分享
Gaynes:查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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