题解 | #信号发生器#

信号发生器

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

参考题解可知题目未给出的信息,其中的cnt只用于产生方波,注意三角波的flag转换时刻,编写代码如下(附上仿真):

// 方波的周期是20,锯齿波的周期是21,三角波的周期是40,且wave的最大值是20
`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			flag;

always@(posedge clk,negedge rst_n)begin
	if(!rst_n)begin
		wave <= 0;
	end
	else begin
		case(wave_choise)
			0:wave <= ((cnt>=9)&&cnt!=19)?20:0;
			1:wave <= wave<=19?wave+1:0;
			2:wave <= flag?wave+1:wave-1;
			default:wave <= 0;
		endcase
	end
end

always@(posedge clk,negedge rst_n)begin
	if(!rst_n)begin
		cnt <= 0;
		flag<= 0;
	end
	else begin
		cnt <= (wave_choise==0)?(cnt==19?0:cnt+1):0;
		// flag<= (wave_choise==2) ? (((wave==1)&&(!flag)) ? 1 : (((wave==19)&&(flag))?0:flag)) : 0;
        //三目运算太长就不如ifelse语句简洁明了
        if (wave_choise==2) begin
            if ((wave==1)&&(!flag)) begin
                flag <= 1;
            end
            if ((wave==19)&&(flag)) begin
                flag <= 0;
            end
        end
        else begin
            flag <= 0;
        end
	end
end

endmodule

`timescale  1ns / 1ps

module tb_signal_generator;

// signal_generator Parameters
parameter PERIOD  = 10;


// signal_generator Inputs
reg   clk                                  = 0 ;
reg   rst_n                                = 0 ;
reg   [1:0]  wave_choise                   = 0 ;

// signal_generator Outputs
wire  [4:0]  wave                          ;


initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

initial
begin
    $dumpfile ("HDL_bit_wave.vcd");
    $dumpvars;
    #(PERIOD*2) rst_n  =  1;
end

signal_generator  u_signal_generator (
    .clk                     ( clk                ),
    .rst_n                   ( rst_n              ),
    .wave_choise             ( wave_choise  [1:0] ),

    .wave                    ( wave         [4:0] )
);

initial
begin
    #(PERIOD*2);
    #(PERIOD*52) wave_choise = 2'b00;
    #(PERIOD*52) wave_choise = 2'b01;
    #(PERIOD*52) wave_choise = 2'b10;
    #(PERIOD*52) wave_choise = 2'b00;
    #(PERIOD*52) wave_choise = 2'b11;
    #(PERIOD*52);
    $finish;
end

endmodule

全部评论

相关推荐

某物流公司 软件开发岗 总包26-30
点赞 评论 收藏
转发
#简历#先说一说我自己的想法,很多人都很排斥苍穹外卖,认为没什么技术点和含金量,但实际上我觉得恰恰相反,苍穹外卖虽然代码本身并不是你自身能力的证明,但是是作为一个新人学习时很好的跳板和原始框架,在这个框架上进行的改进可以很好的辐射到你自己的个人成果上,并作为你和面试官聊天的筹码大多数人的苍穹外卖只写增删改查,千篇一律,吸引不了面试官,所以这才让大家误以为只要是苍穹外卖就不要写进简历里这种误区,但实际上如果你在原有的层面上进行改进,并作为你的项目亮点和面试官介绍,告诉他你的苍穹外卖和别人的有什么不同,增加了哪些技术难点,这才显得你是完全自己理解了这个项目,并且有自己动手实践项目的能力,而不是就看了个课程就以为自己会了,就当成自己的了,如此一来,这反而成为你的加分项苍穹外卖为什么看的人最多,说明它好啊,如果它不好,为什么看的人还这么多,想清楚这个逻辑,我觉得要做的最重要的事,就是如何在原有框架上进行改进提效,比起听其他人的话重新搞一个项目性价比高得多,而且我亲测项目并没有成为我找到工作的阻碍,我投的大厂一大半都给我面试了,而且很多不止一个部门,退一万步说,当你手头没有其他项目的时候,有苍穹外卖总比什么都没有的好很多,不需要因为苍穹外卖有任何心理负担关于简历的任何部分都欢迎大家提意见,十分感谢大家,祝大家找实习+秋招顺利上岸,offer拿到手软#简历中的项目经历要怎么写##我的上岸简历长这样##最后再改一次简历##简历##简历被挂麻了,求建议#
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务