5-Microstep Drive. Xilinx CPLD

Golum
mura:

***** Project compilation was successful

Project Information c:\maxplus2\maxwork\g900m\ustep.rpt

а сам проект глянуть можно ? 😃

mura

>> а сам проект глянуть можно ? 😃 Если Автор не против, то можно.

boldive

А прочитать первое сообщение в этой теме слабо? Там кстати и код выложен один к одному как я Юрию переслал.

Для самых ленивых код ниже.
Юрий, обратите внимание на STBY. Тут он несколько по другому сформирован. Вы не пробовали смотреть на STBY and DUMP в симуляции. Каждые 400us что-то выдается на STBY или код еще сыроват, хоть и работает?

Вместо смайликов надо подставить B )
Пробела между ними не должно быть.

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: Oleg
//
// Create Date: 09:45:02 11/04/2009
// Design Name:
// Module Name: uStep
// Project Name:
// Target Devices: XC2C64A-7VQ44C
// Tool versions:
// Description: 80V 8A Stepper Motor Drive
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module uStep(
input CLK, AIN, BIN, DIR, STP, OSCA, RES,
inout STBY,
output ASIN, BSIN, DUMP, A0, A1, B0, B1, OSCB-);
wire [2:0] QA;
wire [7:0] QB;
wire [1:0] QC;
wire [2:0] QD;
//T_BASE--------------------------------------------------------------------------
CB8R C03 (.C(CLK), .R(G14), .Q(QB-));
DF F12 (.C(CLK), .D(G24), .R(0), .CE(1), .S(~STBY), .Q(Q12));
assign DUMP = ~Q12 ? 1’bz : 1’b0;
assign G24 = QB[7] & QB[6] & QB[5] & QB[4];
assign OSCB = ~OSCA;
//PH_GEN--------------------------------------------------------------------------
DF F02 (.C(CLK), .D(~DIR), .R(0), .S(0), .CE(G16), .Q(Q02));
DF F03 (.C(CLK), .D(~STP), .R(0), .S(0), .CE(1), .Q(Q03));
DF F04 (.C(CLK), .D(Q03), .R(0), .S(0), .CE(1), .Q(Q04));
DF F05 (.C(CLK), .D(G16), .R(0), .S(0), .CE(1), .Q(Q05));
CB2BRE C00 (.C(CLK), .UD(Q02), .R(~RES), .CE(G14), .Q(QC));
CB3BRE C01 (.C(CLK), .UD(G13), .R(~RES), .CE(G15), .Q(QA));
CB3RE C02 (.C(CLK), .R(Q05), .CE(G18), .Q(QD));
assign G12 = QC[1] ^ QC[0];
assign G13 = QC[0] ^ Q02;
assign G11 = ( G13 & QA[2]) | (~G13 & ~QA[2] & ~QA[1] & ~QA[0]);
assign G14 = G11 & Q05;
assign G15 = ~G11 & Q05;
assign G16 = Q03 & ~Q04;
assign G17 = QD[2] & QD[1] & QD[0];
assign STBY = G17 ? 1’bz : 1’b0; //assign STBY = ~G17 ? 1’bz : 1’b0;
assign G18 = ~G17 & QB[7] & QB[6] & QB[5] & QB[4] & QB[3] &QB[2] & QB[1] & QB[0];
//SIN_COS-------------------------------------------------------------------------
DF F00 (.C(CLK), .D(G00), .R(G05), .S(0), .CE(1), .Q(Q00));
DF F01 (.C(CLK), .D(G10), .R(G05), .S(0), .CE(1), .Q(Q01));
assign G01 = QA[2] & ~QA[1] & ~QA[0] & QB[2] & QB[0];
assign G02 = ~QA[2] & QA[1] & QA[0] & QB[3] & QB[2] & QB[1] & QB[0];
assign G03 = ~QA[2] & QA[1] & ~QA[0] & QB[4] & QB[2] & QB[1] & QB[0];
assign G04 = ~QA[2] & ~QA[1] & QA[0] & QB[4] & QB[3] & QB[2] & QB[0];
assign G06 = ~QA[2] & ~QA[1] & ~QA[0] & QB[2] & QB[0];
assign G07 = ~QA[2] & ~QA[1] & QA[0] & QB[3] & QB[2] & QB[1] & QB[0];
assign G08 = ~QA[2] & QA[1] & ~QA[0] & QB[4] & QB[2] & QB[1] & QB[0];
assign G09 = ~QA[2] & QA[1] & QA[0] & QB[4] & QB[3] & QB[2] & QB[0];
assign G00 = Q00 | G01 | G02 | G03 | G04;
assign G10 = Q01 | G06 | G07 | G08 | G09;
assign G05 = ~QB[4] & ~QB[3] & ~QB[2] & ~QB[1] & ~QB[0];
assign BSIN = ~Q01 ? 1’bz : 1’b0;
assign ASIN = ~Q00 ? 1’bz : 1’b0;
//PH_DRV----------------------------------------
DF F06 (.C(CLK), .D(G20), .R(G19), .S(0), .CE(1), .Q(A0));
DF F07 (.C(CLK), .D(~G20), .R(G19), .S(0), .CE(1), .Q(A1));
DF F08 (.C(CLK), .D(G22), .R(G19), .S(0), .CE(1), .Q(B0));
DF F09 (.C(CLK), .D(~G22), .R(G19), .S(0), .CE(1), .Q(B1));
DF F10 (.C(CLK), .D(G21), .R(G24), .S(0), .CE(1), .Q(Q10));
DF F11 (.C(CLK), .D(G23), .R(G24), .S(0), .CE(1), .Q(Q11));
assign G19 = ~RES | (STBY & (QB[7] | QB[6]));
assign G22 = Q11 ^ QC[1]; //assign G22 = Q11 ^ QD[1];
assign G23 = Q11 | ~BIN;
assign G20 = Q10 ^ G12;
assign G21 = Q10 | ~AIN;
//the rest of the main module code here:
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module DF (input D, C, CE, R, S, output Q);
reg df = 0;
always @(posedge C)
if ®
df <= 1’h0;
else if (S)
df <= 1’b1;
else if (CE)
df <= D;
assign Q = df;
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module CB8R (input C, R, output [7:0] Q);
reg [7:0] count = 0;
always @(posedge C)
if ®
count <= 0;
else
count <= count + 1;
assign Q = count;
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module CB2BRE (input UD, R, CE, C, output [1:0] Q);
reg [1:0] u_d = 0;
always @(posedge C)
if ®
u_d <= 0;
else if (CE)
if (UD) begin
u_d <= u_d + 1;
end
else begin
u_d <= u_d - 1;
end
assign Q = u_d;
endmodule
//////////////////////////////////////////////my add///////////////////////////////////-
module CB3BRE (input UD, R, CE, C, output [2:0] Q);
reg [2:0] u_d = 0;
always @(posedge C)
if ®
u_d <= 0;
else if (CE)
if (UD) begin
u_d <= u_d + 1;
end
else begin
u_d <= u_d - 1;
end
assign Q = u_d;
endmodule
////////////////////////////////////////corrected output [7:0]/////////////////////////////////////////-
module CB3RE (input C, R, CE, output [2:0] Q);
reg [2:0] count = 0;
always @(posedge C)
if ®
count <= 0;
else if (CE)
count <= count + 1;
assign Q = count;
endmodule
/////////////////////////////////////////////////////////////////////////////////-

Golum
boldive:

А прочитать первое сообщение в этой теме слабо? Там кстати и код выложен один к одному как я Юрию переслал.

Я вообще то про проект на Алтере а не на Ксилинке. Товарищ писал что это ему удалось.
>>Марисс не возражает
😎

mura

Вот это компилится Максом.
//`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: Oleg
//
// Create Date: 09:45:02 11/04/2009
// Design Name:
// Module Name: uStep
// Project Name:
// Target Devices: XC2C64A-7VQ44C
// Tool versions:
// Description: 80V 8A Stepper Motor Driver
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module uStep(CLK, AIN, BIN, DIR, STP, OSCA, RES,
STBY,
ASIN, BSIN, DUMP, A0, A1, B0, B1, OSCB-);

input CLK, AIN, BIN, DIR, STP, OSCA, RES;
inout STBY;
output ASIN, BSIN, DUMP, A0, A1, B0, B1, OSCB;
wire [2:0] QA;
wire [7:0] QB;
wire [1:0] QC;
wire [2:0] QD;
wire G01,G02,G03,G04,G05,G06,G07,G08,G09;
wire G11,G12;
wire G17;
//T_BASE--------------------------------------------------------------------------
CB8R C03 (.C(CLK), .R(G14), .Q(QB-));
DF F12 (.C(CLK), .D(G24), .R(0), .CE(1), .S(~STBY), .Q(Q12));
assign DUMP = ~Q12 ? 1’bz : 1’b0;
assign G24 = QB[7] & QB[6] & QB[5] & QB[4];
assign OSCB = ~OSCA;
//PH_GEN--------------------------------------------------------------------------
DF F02 (.C(CLK), .D(DIR), .R(0), .S(0), .CE(G16), .Q(Q02));
DF F03 (.C(CLK), .D(STP), .R(0), .S(0), .CE(1), .Q(Q03));
DF F04 (.C(CLK), .D(Q03), .R(0), .S(0), .CE(1), .Q(Q04));
DF F05 (.C(CLK), .D(G16), .R(0), .S(0), .CE(1), .Q(Q05));
CB2BRE C00 (.C(CLK), .UD(Q02), .R(~RES), .CE(G14), .Q(QC));
CB3BRE C01 (.C(CLK), .UD(G13), .R(~RES), .CE(G15), .Q(QA));
CB3RE C02 (.C(CLK), .R(Q05), .CE(G18), .Q(QD));
assign G12 = QC[1] ^ QC[0];
assign G13 = QC[0] ^ Q02;
assign G11 = ( G13 & QA[2]) | (~G13 & ~QA[2] & ~QA[1] & ~QA[0]);
assign G14 = G11 & Q05;
assign G15 = ~G11 & Q05;
assign G16 = Q03 & ~Q04;
assign G17 = QD[2] & QD[1] & QD[0];
assign STBY = ~G17 ? 1’bz : 1’b0;
assign G18 = ~G17 & QB[7] & QB[6] & QB[5] & QB[4] & QB[3] &QB[2] & QB[1] & QB[0];
//SIN_COS-------------------------------------------------------------------------
DF F00 (.C(CLK), .D(G00), .R(G05), .S(0), .CE(1), .Q(Q00));
DF F01 (.C(CLK), .D(G10), .R(G05), .S(0), .CE(1), .Q(Q01));
assign G01 = QA[2] & ~QA[1] & ~QA[0] & QB[2] & QB[0];
assign G02 = ~QA[2] & QA[1] & QA[0] & QB[3] & QB[2] & QB[1] & QB[0];
assign G03 = ~QA[2] & QA[1] & ~QA[0] & QB[4] & QB[2] & QB[1] & QB[0];
assign G04 = ~QA[2] & ~QA[1] & QA[0] & QB[4] & QB[3] & QB[2] & QB[0];
assign G06 = ~QA[2] & ~QA[1] & ~QA[0] & QB[2] & QB[0];
assign G07 = ~QA[2] & ~QA[1] & QA[0] & QB[3] & QB[2] & QB[1] & QB[0];
assign G08 = ~QA[2] & QA[1] & ~QA[0] & QB[4] & QB[2] & QB[1] & QB[0];
assign G09 = ~QA[2] & QA[1] & QA[0] & QB[4] & QB[3] & QB[2] & QB[0];
assign G00 = Q00 | G01 | G02 | G03 | G04;
assign G10 = Q01 | G06 | G07 | G08 | G09;
assign G05 = ~QB[4] & ~QB[3] & ~QB[2] & ~QB[1] & ~QB[0];
assign BSIN = ~Q01 ? 1’bz : 1’b0;
assign ASIN = ~Q00 ? 1’bz : 1’b0;
//PH_DRV----------------------------------------
DF F06 (.C(CLK), .D(G20), .R(G19), .S(0), .CE(1), .Q(A0));
DF F07 (.C(CLK), .D(~G20), .R(G19), .S(0), .CE(1), .Q(A1));
DF F08 (.C(CLK), .D(G22), .R(G19), .S(0), .CE(1), .Q(B0));
DF F09 (.C(CLK), .D(~G22), .R(G19), .S(0), .CE(1), .Q(B1));
DF F10 (.C(CLK), .D(G21), .R(G24), .S(0), .CE(1), .Q(Q10));
DF F11 (.C(CLK), .D(G23), .R(G24), .S(0), .CE(1), .Q(Q11));
assign G19 = ~RES | (STBY & (QB[7] | QB[6]));
assign G22 = Q11 ^ QC[1]; //assign G22 = Q11 ^ QD[1];
assign G23 = Q11 | ~BIN;
assign G20 = Q10 ^ G12;
assign G21 = Q10 | ~AIN;
//the rest of the main module code here:
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module DF (D, C, CE, R, S, Q);
input D, C, CE, R, S;
output Q;
reg df;
always @(posedge C)
if ®
df <= 1’h0;
else if (S)
df <= 1’b1;
else if (CE)
df <= D;
assign Q = df;
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module CB8R (C, R, Q);
input C, R;
output [7:0] Q;
reg [7:0] count;
always @(posedge C)
if ®
count <= 0;
else
count <= count + 1;
assign Q = count;
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module CB2BRE (UD, R, CE, C, Q);
input UD, R, CE, C;
output [1:0] Q;
reg [1:0] u_d;
always @(posedge C)
if ®
u_d <= 0;
else if (CE)
if (UD) begin
u_d <= u_d + 1;
end
else begin
u_d <= u_d - 1;
end
assign Q = u_d;
endmodule
//////////////////////////////////////////////my add///////////////////////////////////-
module CB3BRE (UD, R, CE, C, Q);
input UD, R, CE, C;
output [2:0] Q;

reg [2:0] u_d;
always @(posedge C)
if ®
u_d <= 0;
else if (CE)
if (UD) begin
u_d <= u_d + 1;
end
else begin
u_d <= u_d - 1;
end
assign Q = u_d;
endmodule
////////////////////////////////////////corrected output [7:0]/////////////////////////////////////////-
module CB3RE (C, R, CE, Q);
input C, R, CE;
output [2:0] Q;
reg [2:0] count;
always @(posedge C)
if ®
count <= 0;
else if (CE)
count <= count + 1;
assign Q = count;
endmodule
/////////////////////////////////////////////////////////////////////////////////-

Golum
mura:

Вот это компилится Максом.

ага, пасиб, вижу что синтаксис чуть отличается, сейчас тоже в макс попробую засунуть

mura

Анатолий, даже в самые отдаленные хутора пришла программируемая логика.
Пора начинать 😉

Golum
mura:

Пора начинать 😉

ну, то быстрее паяльник разогреет ? В)

ATLab
mura:

Анатолий, даже в самые отдаленные хутора пришла программируемая логика.
Пора начинать 😉

Не, я сейчас все больше в Компасе - железяки пытаюсь изобретать, как ни противно это моей натуре.😁 Надеюсь, в январе что-нибудь начнут точить-фрезеровать, а я, тем временем, буду дальше грызть управляющую программу.
Так что до ПЛИС руки, боюсь, не скоро дойдут: нет у меня для них актуальной задачи, так чтобы без них - невмоготу.

26 days later
boldive

Юрий, есть прогресс в моделировании?

Вот тут еще немножко теории как это сделано у Марисса.

Можете поделится кодом testbench для этого дела?

tumbzik
boldive:

Что-то не могу разобраться как в ISE Project Navigator запускать симулятор (кажись wave называется).

Ткните пожалуйста пальцем куда смотреть надо и в какой последовательности.

луше сразу привыкайте к хорошему: Active HDL рулит.

boldive
tumbzik:

луше сразу привыкайте к хорошему: Active HDL рулит.

Так вроде как и ModelsimXE с ISE работает без вопросов.

mura
tumbzik:

луше сразу привыкайте к хорошему: Active HDL рулит.

Cразу видно, человек КИТа начитался.

boldive

to mura
Юрий, так как насчет содержания моего поста

Юрий, есть прогресс в моделировании?

Вот тут еще немножко теории как это сделано у Марисса.

Можете поделится кодом testbench для этого дела?

mura

Cкоро начну “боевые” испытания. А тесткод не писал, в МАКсе удобный симулятор, и там все задается графически.

20 days later
Oleg2

Интерестно,как обстоят дела с драйвером…и подскажите boldive ,по Вашему мнению какой драйвер будет лучше: 1)на LS8290 или 2)на Xilinx CPLD

boldive

Разумеется на CPLD, только там код надо слегка до ума довести.

Аэробус

Ээээ… Народ, подскажите, нашел тут Xilinx ISE Design Suite v11.1 весит 5,6Гб и пакет обновлений до 11.4 2,5Гб Это чо неполная? В первых постах речь шла о 47Гб?

boldive

Все правильно. Так и есть. Только ко всему этому надо еще впридачу с сайта Xilinx скачать Modelsim 6.4 с библиотеками под CPLD (хотя по умолчанию там эти библиотеки уже сидят). Регистрационный код получите там-же бесплатно.

Oleg2

Так тогда два вопроса :1)А что с кодом именно не так? 2)топологию платы брали с сайта или сами разводили?

boldive
  1. 1/5 шага заявленная в проекте работает. Но это хорошо для изучения процесса. Желательно сделать его меняющим шаг в зависимости от частоты оборотов двигателя и начинать вращение где-то с 1/16 шага.

  2. Топология платы своя. Долго пыхтел, но сделал.