中级会员
- 积分
- 374
- 金钱
- 374
- 注册时间
- 2012-6-20
- 在线时间
- 100 小时
|
发表于 2019-3-20 14:04:25
|
显示全部楼层
// ********************************************************************
// CS47202
// ********************************************************************
// 文件名称 : abcont.v
// 模块名称 : abcont
// 功能 :
// 版本号 :V1.0
// 日期 :
// ********************************************************************
//
// ********************************************************************
module abcont(
input clk22m, //边沿采集时钟
input rst_n,
input A_in, //编码器输入A信号
input B_in, //编码器输入B信号
output reg signed[15:0] AB_count
);
//输入输出端口-----------------------------------------------------------
input clk22m; //边沿采集时钟
input rst_n;
input A_in; //编码器输入A信号
input B_in; //编码器输入B信号
output[15:0] AB_count;
//端口类型---------------------------------------------------------------
reg signed[15:0] AB_count;
//中间常量,变量----------------------------------------------------------
reg[1:0]A_sync,B_sync;
//-----------------------------------------------------------------------
always@(posedge clk22m)A_sync<={A_sync[0],A_in};
always@(posedge clk22m)B_sync<={B_sync[0],B_in};
//-----------------------------------------------------------------------
reg[1:0]A_cnt,B_cnt;
always@(posedge clk22m)
begin
if(A_sync[1]&& A_cnt!=2'b11)
A_cnt<=A_cnt+2'd1;
else
if(~A_sync[1]&& A_cnt!=2'b00)
A_cnt<=A_cnt-2'd1;
end
//--------------------------------------------------------------------
always@(posedge clk22m)
begin
if(B_sync[1]&& B_cnt!=2'b11) `
B_cnt<=B_cnt+2'd1;
else
if(~B_sync[1]&& B_cnt!=2'b00)
B_cnt<=B_cnt-2'd1;
end
//--------------------------------------------------------------------
reg A,B;
always@(posedge clk22m)
begin
if(A_cnt==2'b11)
A<=1'b1;
else
if(A_cnt==2'b00)
A<=1'b0;
end
//--------------------------------------------------------------------
always@(posedge clk22m)
begin
if(B_cnt==2'b11)
B<=1'b1;
else
if(B_cnt==2'b00)
B<=1'b0;
end
//四倍频--------------------------------------------------------------------
reg A_d,B_d;
always@(posedge clk22m)A_d<=A;
always@(posedge clk22m)B_d<=B;
wire Encode_count_enable=A^A_d^B^B_d;
wire dir=A^B_d;
always@(posedge clk22m )
begin
if (!rst_n)
begin
AB_count <= 16'd0;
end
else
begin
if (Encode_count_enable)begin
if(dir)
AB_count<=AB_count-16'd1;
else
AB_count<=AB_count+16'd1;
end
end
end
endmodule
// ****************************END*************************************
|
|