题解 | #信号发生器#

信号发生器

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

题意整理

       实现不同波形的输出可以使用case语句,以wave_choise作为case语句的cans.根据wave_choise的值输出不同的波形。以0为最低值,20为最高值为例(可以根据需要具体修改)。根据不同波形的需要,产生相应的数据:

       方波:产生占空比50%的方波,输出0保持20个时钟,输出20保持20个时钟。

       锯齿波:输出数据从0按照步长1递增至20,再从20跳变到0,再依次递增,以此循环。

       三角波:输出数据从0按照步长1递增至20,再从20递减到0,以此循环。

题解主体

       首先是方波的实现,较为简单,只需要设置一个计数器,使输出保持20个时钟为0,跳变为20,再保持20个时钟。依次循环。可以按照如下的过程实现:cnt每个时钟加一,当cnt=19时,将wave的值置为0,同时cnt置为0;当cnt=9时,将wave的值置为20。

                     reg [4:0]cnt;

                            if (cnt == 5'd19)

                                   begin    

                                          wave <= 5'd0;

                                          cnt <= 5'd0;

                                   end

                            else if(cnt == 5'd9)

                                   begin    

                                          wave <= 5'd20;

                                          cnt <= cnt + 1'd1;

                                   end

                            else

                                   begin

                                          wave <= wava;

                                          cnt <= cnt + 1'd1;

                                   end

       锯齿波的实现,即输出信号由0每次加一递增到20,然后从20跳变到0。可以按照如下的过程实现:当wave=20,将wave的值置为0,其余时刻,wave加一。

                            if (wave == 5'd20)

                                   begin

                                          wave <= 5'd0;

                                   end

                            else

                                   begin

                                          wave <= wava + 1'd1;

                                   end

       三角波的实现,类似于锯齿波,但当wave达到20时,不是跳变到0,而是以一为步长递减到0。可以设置一个指示信号up,当up的值是1时,wave每个时钟加一。当up的值为0时,则减一。

                            if (wave == 5'd20)

                                   begin

                                          wave <= wave - 1'd1;

                                          up = 1'd0;

                                   end

                            else if (wave = 5'd0)

                                   begin

                                          wave <= wava - 1'd1;

                                          up = 1'd1;

                                   end

                            else if (up)

                                   begin

                                          wave <= wava + 1'd1;

                                   end

                            else

                                   begin

                                          wave <= wava - 1'd1;

                                   end

参考答案

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);

	reg [4:0]cnt;
	reg up;
	always @(posedge clk or negedge rst_n)
		if (!rst_n)
			begin 
				wave <= 5'd0;
				cnt <= 5'd0;
			end
		else case (wave_choise)
		2'b00:				//产生方波,保持0十个时钟,保持20十个时钟
			begin
				if (cnt == 5'd19)
					begin	
						wave <= 5'd0;
						cnt <= 5'd0;
					end
				else if(cnt == 5'd9)
					begin	
						wave <= 5'd20;
						cnt <= cnt + 1'd1;
					end
				else
					begin
						wave <= wave;
						cnt <= cnt + 1'd1;
					end
			end
		2'b01:				//产生锯齿,0递增到20
			begin
				if (wave == 5'd20)
					begin
						wave <= 5'd0;
					end
				else 
					begin
						wave <= wave + 1'd1;
					end
			end
		2'b10:
			begin
				if (wave == 5'd20)
					begin
						wave <= wave - 1'd1;
						up <= 1'd0;
					end
				else if (wave == 5'd0)
					begin
						wave <= wave - 1'd1;
						up <= 1'd1;
					end
				if (up)
					begin
						wave <= wave + 1'd1;
					end
				else 
					begin
						wave <= wave - 1'd1;
					end
			end
		default:
			begin
				wave <= 1'b0;
			end
	endcase
endmodule


全部评论
在同一个过程块既使用阻塞赋值又使用非阻塞赋值是不是不太好..
1 回复 分享
发布于 2022-03-08 10:02
不是大哥你这都通过不了你放出来干啥
5 回复 分享
发布于 2023-03-09 10:46 北京
有两个错误:1.if(up)这里显然语法错误,应该是else if 2.在产生三角波时,wave==0这里,如果继续wave<=wave-1会产生错误,应该是wave<=wave+1
2 回复 分享
发布于 2023-06-12 15:50 江苏
输出三角波的时候,当wave==0的时候,仍然执行的是wave = wave -1。这样不会有问题吗?
2 回复 分享
发布于 2022-04-01 18:25
这个题,如果wave从三角波1~19之间的某个数切回锯齿波,锯齿波波形就不是从零开始了。 方波的cnt计数器也没有清零,切换回方波的第一个波形,占空比会异常
2 回复 分享
发布于 2022-03-27 23:11
输出三角波的时候,题主写的是if(up) 我认为这里应该是else if(up)
1 回复 分享
发布于 2023-02-20 10:05 江苏
为什么方波是cnt==19而锯齿波和三角波是wave==20呀,wave和cnt不是同步的吗
点赞 回复 分享
发布于 2022-11-12 11:11 江苏
题目不清晰,方波的占空比多少?
点赞 回复 分享
发布于 2022-03-23 22:11

相关推荐

评论
20
4
分享

创作者周榜

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