赞
踩
请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。
输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
wave_choise:2比特位宽的信号,根据该信号的取值不同,输出不同的波形信号
输出描述:
wave:5比特位宽的信号,根据wave_choise的值,输出不同波形的信号
首先 题目不太清晰没有给出三种波形的周期,从其他答主处看到的:
方波周期20
锯齿波周期21
三角波40
其次,记录一下过程遇到的两个注意事项;
进入三角波模式一定要先判断是否为零,不为零需要想降下来
时序逻辑 flag赋值慢一拍,需要再给flag赋值的时候同时增加或者减少wave,否则容易出现负值
`timescale 1ns/1ns module signal_generator( input clk, input rst_n, input [1:0] wave_choise, output reg [4:0]wave ); //计数器1:方波周期20 reg [4:0]cnt_rect=0; always@(posedge clk or negedge rst_n)begin if(!rst_n) cnt_rect <=0; else if(wave_choise==2'd0 && cnt_rect <5'd19) cnt_rect <= cnt_rect +1; else cnt_rect <= 0; end //锯齿波周期21 //三角波周期40 进入阶段要先判断是不是零 不是要先降下来 reg flag=0; always@(posedge clk or negedge rst_n)begin if(!rst_n)begin wave <= 0; flag <=0; end else case(wave_choise) 2'd0:begin if(cnt_rect == 5'd9) wave <= 5'd20; else if(cnt_rect==5'd19) wave <= 0; else wave <= wave; end 2'd1:begin wave <= (wave == 5'd20)? 5'd0 : (wave+1); end 2'd2:begin if(flag) begin //判断上升状态内的逻辑,这样写不容易遗漏 if(wave<'d20) begin //在上升状态,只需要考虑wave什么时候下降,并给出flag=0即可 flag<=flag; wave<=wave+1; end else if(wave=='d20) begin //wave在其为20时就需要给出flag=0 flag<=~flag; wave<=wave-1; //时序逻辑要提前给出下一状态,wave为20时下一个状态就是19 end end else begin //同理,下降状态,只需要考虑wave为什么值时需要给出flag=1即可 if(wave>'d0) begin flag<=flag; wave<=wave-1; end else if(wave=='d0) begin //wave此时没有退步空间了(*__*),给出flag=1,上升 flag<=~flag; wave<=wave+1; //wave为0时,下一状态就是1 end end end default: wave <= 0; endcase end endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。