这段程序是我用来完成编码器解码输出的程序。编码器的输入是由双路相位相差90度的方波组成,左旋还是右旋就是依靠谁的相位超前判断。用pld完成去抖动并且按照一定的周期整形输出,效果完美,单是程序上可能还需要有改进,主要是否还能简化!请了解的朋友指出,大家一同探讨!
module freek5 (fly,u3bq,u3aq,outled,leftin,rightin,rst,gobleclk,pulse,direct);
input [1:0] fly;
input leftin,rightin,rst;
input gobleclk;
output u3bq,u3aq,pulse,direct;
output [3:0] outled;
wire a,b,c,d;
wire u5a,u5b;
wire inrst;
reg u1aq,u1aqb;
reg u1bq,u1bqb;
reg u2aq;
reg u2bq;
reg u3bq;
reg u3aq;
reg [9:0] leftin_counter ;
reg [9:0] rightin_counter;
reg [15:0] pulsecounter;
reg [9:0] leftin_stack;
reg [9:0] rightin_stack;
reg pulse;
reg direct;
assign outled = 4'b0101;
assign inrst = ~rst;
assign u5a = a&u1bqb;
assign u5b = c&u1aqb;
always @(u5a or d )
begin
case ({u5a,d})
2'b00 : begin
u1aq = u1aq;
u1aqb = u1aqb;
end
2'b10: begin
u1aq = 1'b1;
u1aqb = 1'b0;
end
2'b01: begin
u1aq = 1'b0;
u1aqb = 1'b1;
end
endcase
end
always @(u5b or d )
begin
case ({u5b,d})
2'b00: begin
u1bq = u1bq;
u1bqb = u1bqb;
end
2'b10 : begin
u1bq =1'b1;
u1bqb = 1'b0;
end
2'b01 : begin
u1bq = 1'b0;
u1bqb = 1'b1;
end
endcase
end
always @(posedge a or posedge c or posedge inrst )
begin
if ( inrst == 1'b1)
begin
u2aq = 1'b0;
//u2aqb = 1'b1;
end
else
begin
if ( a==1'b1)
begin
u2aq =1'b0;
//u2aqb =1'b1;
end
else
begin
if (c == 1'b1)
begin
u2aq = u1aq;
//u2aqb = ~u2aq;
end
else
begin
u2aq =u2aq;
//u2aqb =~u2aqb;
end
end
end
end
always @(posedge a or posedge c or posedge inrst)
begin
if (inrst ==1'b1)
begin
u2bq = 1'b0;
//u2bqb = 1'b1;
end
else
begin
if (c==1'b1)
begin
u2bq =1'b0;
//u2bqb =~u2bqb;
end
else
begin
if (a == 1'b1)
begin
u2bq = u1bq;
end
else
u2bq = u2bq;
end
end
end
always @(posedge d or posedge a or posedge inrst)
begin
if (inrst == 1'b1)
begin
u3aq = 1'b0;
end
else
begin
if (a==1'b1)
begin
u3aq = 1'b0;
end
else
begin
if (d==1'b1)
u3aq = u2aq;
else
u3aq = u3aq;
end
end
end
always @(posedge d or posedge c or posedge inrst)
begin
if (inrst== 1'b1)
begin
u3bq = 1'b0;
end
begin
if ( c == 1'b1)
begin
u3bq = 1'b0;
end
else
begin
if (d==1'b1)
u3bq = u2bq;
else
u3bq =u3bq;
end
end
end
assign {d,a,b,c} = decode (fly);
function [3:0] decode;
input [1:0] fly;
case (fly)
2'b11 : decode = 4'b1000;
2'b01 : decode = 4'b0100;
2'b00 : decode = 4'b0010;
2'b10 : decode = 4'b0001;
endcase
endfunction
always @(posedge rightin or negedge rst)
begin
if (rst == 1'b0)
begin
rightin_counter = 10'b0000_0000_00;
end
else
if (leftin ==1'b0)
begin
rightin_counter = rightin_counter+1;
end
end
always @(posedge leftin or negedge rst)
begin
if (rst == 1'b0)
begin
leftin_counter = 10'b0000_0000_00;
end
else
if (rightin == 1'b0)
begin
leftin_counter = leftin_counter +1;
end
end
always @(posedge gobleclk or negedge rst)
begin
if (rst == 1'b0)
begin
pulsecounter = 16'b0000_0000_0000_0000;
rightin_stack = 10'b0000_0000_00;
leftin_stack = 10'b0000_0000_00;
end
else
begin
pulsecounter = pulsecounter +1;
if (pulsecounter == 16'b1111_1111_1111_1111)
begin
if (pulse == 1'b1)
begin
if ( rightin_counter>rightin_stack)
begin
pulse = 1'b0;
direct = 1'b1;
rightin_stack = rightin_stack +1;
pulsecounter = 20'b0000_0000_0000_0000_0000;
end
else
begin
if (leftin_counter >leftin_stack)
begin
pulse = 1'b0;
direct =1'b0;
leftin_stack = leftin_stack+1;
pulsecounter = 20'b0000_0000_0000_0000_0000;
end
else
begin
leftin_stack = leftin_stack;
rightin_stack =rightin_stack;
end
end
end
else
begin
pulse =1'b1;
end
end // end
else
begin
pulse = pulse;
end
end
end
endmodule
我要赚赏金
