题解 | #信号发生器#

信号发生器

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

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
20
4
分享

创作者周榜

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