📄 vhdl.txt
字号:
/*端口信号说明:
clk 输入时钟信号
reset 复位信号,低电平有效
din 按键输入信号
d 波形的离散值输出*/
module wave(clk,reset,din,d);
input clk,reset,din;
output [7:0] d;
reg [7:0] d;
//中间变量寄存器
reg [7:0] c,sel;
reg [2:0] tmp;
reg a,up;
reg[1:0] state,next_s;
/*****按键消除抖动部分**********************************/
parameter s0=2'b00,s1=2'b01,s2=2'b11,s3=2'b10;
always@(posedge clk) //定义起始状态进程
begin
if(reset==0)
state=s0;
else
state=next_s;
end
always@(state or next_s or din) //状态转换进程
begin
case(state)
s0: begin
up=1'b0;
if(din==0) next_s=s0;
else next_s=s1;
end
s1: begin
up=1'b0;
if(din==0) next_s=s0;
else next_s=s2;
end
s2: begin
up=1'b0;
if(din==0) next_s=s0;
else next_s=s3;
end
s3: begin
up=1'b1;
if(din==1) next_s=s3;
else next_s=s0;
end
default: next_s=s0;
endcase
end
/*****波形发生部分****************************************/
always @(posedge up) //波形选择计数器(一位独热码计数)
begin
if(reset==0)
tmp<=3'd0;
else
begin //模5循环相加
if(tmp==3'd5) tmp<=3'd1;
else tmp<=tmp+3'd1;
end
end
always @(posedge clk) //波形选择进程
begin
case(tmp)
3'd1: begin //正斜率波
if(d==8'b11111111) d<=8'b00000000;
else d<=d+1'd1;
end
3'd2: begin //负斜率波
if(d==8'b00000000) d<=8'b11111111;
else d<=d-1'd1;
end
3'd3: begin //三角波
if(a==0)
begin
if(d==8'b11111110)
begin
d<=8'b11111111;
a<=1'd1;
end
else d<=d+1'd1;
end
else
begin
if(d==8'b00000001)
begin
d<=8'b00000000;
a<=1'd0;
end
else
d<=d-1'd1;
end
end
3'd4: begin //矩形波
if(c==8'b11111111) c<=8'b00000000;
else if(c>8'b01111111)
begin
c<=c+1'd1;
d<=8'b11111111;
end
else
begin
c<=c+1'd1;
d<=8'b00000000;
end
end
3'd5: begin //正弦波
if(sel==99) sel<=8'd0;
else sel<=sel+1'd1;
case(sel)
8'd0: d<=8'b10000000;
8'd1: d<=8'b10001000;
8'd2: d<=8'b10001000;
8'd3: d<=8'b10100000;
8'd4: d<=8'b10101000;
8'd5: d<=8'b10101111;
8'd6: d<=8'b10110110;
8'd7: d<=8'b10111110;
8'd8: d<=8'b11000100;
8'd9: d<=8'b11001011;
8'd10: d<=8'b11010001;
8'd11: d<=8'b11010111;
8'd12: d<=8'b11100001;
8'd13: d<=8'b11100111;
8'd14: d<=8'b11101011;
8'd15: d<=8'b11101111;
8'd16: d<=8'b11110011;
8'd17: d<=8'b11110110;
8'd18: d<=8'b11111000;
8'd19: d<=8'b11111010;
8'd20: d<=8'b11111011;
8'd21: d<=8'b11111101;
8'd22: d<=8'b11111110;
8'd23: d<=8'b11111111;
8'd24: d<=8'b11111111;
8'd25: d<=8'b11111110;
8'd26: d<=8'b11111101;
8'd27: d<=8'b11111011;
8'd28: d<=8'b11111010;
8'd29: d<=8'b11111000;
8'd30: d<=8'b11110110;
8'd31: d<=8'b11110011;
8'd32: d<=8'b11101111;
8'd33: d<=8'b11101011;
8'd34: d<=8'b11100111;
8'd35: d<=8'b11100001;
8'd36: d<=8'b11010111;
8'd37: d<=8'b11010001;
8'd38: d<=8'b11001011;
8'd39: d<=8'b11000100;
8'd40: d<=8'b10111110;
8'd41: d<=8'b10110110;
8'd42: d<=8'b10101111;
8'd43: d<=8'b10101000;
8'd44: d<=8'b10100000;
8'd45: d<=8'b10100000;
8'd46: d<=8'b10011000;
8'd47: d<=8'b10010000;
8'd48: d<=8'b10001000;
8'd49: d<=8'b10000000;
8'd50: d<=8'b10000000;
8'd51: d<=8'b10000000;
8'd52: d<=8'b01111000;
8'd53: d<=8'b01110000;
8'd54: d<=8'b01101000;
8'd55: d<=8'b01100000;
8'd56: d<=8'b01011000;
8'd57: d<=8'b01010001;
8'd58: d<=8'b01001010;
8'd59: d<=8'b01000100;
8'd60: d<=8'b00111000;
8'd61: d<=8'b00110101;
8'd62: d<=8'b00101111;
8'd63: d<=8'b00101001;
8'd64: d<=8'b00011111;
8'd65: d<=8'b00011001;
8'd66: d<=8'b00010101;
8'd67: d<=8'b00010001;
8'd68: d<=8'b00001101;
8'd69: d<=8'b00001010;
8'd70: d<=8'b00000110;
8'd71: d<=8'b00000101;
8'd72: d<=8'b00000010;
8'd73: d<=8'b00000001;
8'd74: d<=8'b00000000;
8'd75: d<=8'b00000000;
8'd76: d<=8'b00000001;
8'd77: d<=8'b00000010;
8'd78: d<=8'b00000101;
8'd79: d<=8'b00000110;
8'd80: d<=8'b00001000;
8'd81: d<=8'b00001010;
8'd82: d<=8'b00001101;
8'd83: d<=8'b00010001;
8'd84: d<=8'b00010101;
8'd85: d<=8'b00011001;
8'd86: d<=8'b00011111;
8'd87: d<=8'b00101001;
8'd88: d<=8'b00101111;
8'd89: d<=8'b00110101;
8'd90: d<=8'b00111000;
8'd91: d<=8'b01000100;
8'd92: d<=8'b01001010;
8'd93: d<=8'b01010001;
8'd94: d<=8'b01011000;
8'd95: d<=8'b01100000;
8'd96: d<=8'b01101000;
8'd97: d<=8'b01110000;
8'd98: d<=8'b01111000;
8'd99: d<=8'b10000000;
default:d<=8'b00000000;
endcase
end
default:d<=8'b00000000;
endcase
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -