Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ср дек 19, 2012 09:27:49
Вы по-ходу даже сами не представляете, что просите...
Ср дек 19, 2012 10:08:57
Ну смотрите.Ситуация такая. Стоит шкаф и работает.Выходит модуль из строя и его надо заменить "на горячую". как это сделать так,чтобы при смене модуля ложная информация с него не считывалась,а считывалась только достоверная?
Ср дек 19, 2012 10:18:17
Это Вы меня спрашиваете?) Откуда я знаю какой это модуль????:))
И вообще, если модуль вышел из строя, то из него заведомо не могут идти не ложные данные. Зачем тогда его заменять, если из него идут верные данные?)))
Ср дек 19, 2012 10:23:43
ложные данные в любом случае будут,если модуль неисправен, надо как-то дать понять микропроцессорному модулю,что подчиненный модуль неисправен. вот и спрашиваю,Как это можно сделать на программном уровне.
модули стоят в крейте обмениваются по шине SPI.
Ср дек 19, 2012 10:45:54
во-первых, тема про Verilog, а Вы уже что-то другое обсуждать начали
во-вторых, телепаты в отпуске, Вашу проблему надо решать в комплексе.
Ср дек 19, 2012 10:47:35
ну я думаю сделать регистр, в который записать идентификатор модуля. Периодически его читать. Если считанное не совпадает с тем что предполагает считать шкаф,то косяк, но некоторые биты будут теряться все равно.
Чт дек 27, 2012 08:18:03
Помогите пожалуйста переписать код с AHDL на Verilog
CASE RES_SV IS
WHEN B"1" => RES_CASE = VCC;
WHEN B"x" => RES_CASE = VCC;
WHEN B"0" => RES_CASE = GND;
END CASE;
RESET=RES AND RES_CASE;
Пт фев 01, 2013 08:20:11
Надеюсь,что кто-то поможет.
Вот что было на AHDL.
- Код:
SUBDESIGN 16OUTS
(
WR : INPUT;
RESET : INPUT;
RD : INPUT;
CS : INPUT;
DAT[7..0]: BIDIR;
A[3..0] : INPUT;
OUT[15..0]: OUTPUT;
)
VARIABLE
IN_REG[15..0]: LATCH;
D[7..0] : NODE;
BEGIN
D[7..0] = (32&(A[3..0]==0))#
(21&(A[3..0]==1))#
(16&(A[3..0]==2))#
(8&(A[3..0]==3))#
(0&(A[3..0]==4))#
(0&(A[3..0]==5))#
(0&(A[3..0]==6))#
(0&(A[3..0]==7))#
(IN_REG[7..0]&(A[3..0]==8))#
(IN_REG[15..8]&(A[3..0]==9));
DAT0 = TRI(D0,!CS&!RD);
DAT1 = TRI(D1,!CS&!RD);
DAT2 = TRI(D2,!CS&!RD);
DAT3 = TRI(D3,!CS&!RD);
DAT4 = TRI(D4,!CS&!RD);
DAT5 = TRI(D5,!CS&!RD);
DAT6 = TRI(D6,!CS&!RD);
DAT7 = TRI(D7,!CS&!RD);
IN_REG[15..8].D = DAT[7..0]&RESET;
IN_REG[7..0].D = DAT[7..0]&RESET;
IN_REG[7..0].ENA = (!CS&!WR&(A[]==8))#!RESET;
IN_REG[15..8].ENA = (!CS&!WR&(A[]==9))#!RESET;
OUT[] = !IN_REG[];
END;
вот как я написал :
- Код:
module SN_DV_16_OC_24V(WR,RES,RD,CS,DAT,A,OUT);
input RES;
input wire [3:0] A;
input wire WR, RD, CS;
inout wire [7:0] DAT;
output wire [15:0] OUT;
reg [7:0] D;
reg [15:0] INREG;
always @(negedge RD or negedge WR)
case (A)
4'b0000: D <= 8'b00100000;
4'b0001: D <= 8'b00010101;
4'b0010: D <= 8'b00010000;
4'b0011: D <= 8'b00001000;
4'b1000: D <= INREG[7:0];
4'b1001: D <= INREG[15:8];
default: D = 8'b00000000;
endcase
always @(negedge WR or negedge RES)
begin
if (RES == 0)
INREG <= 0;
else if ((!CS && !WR && A == 4'b1000)||!RES)
INREG[7:0] <= DAT;
else if ((!CS && !WR && A == 4'b1001)||!RES)
INREG[15:8] <= DAT;
end
assign DAT[7:0]=(!CS&!RD)?D[7:0]:8'bz;
assign OUT[15:0]=!INREG[15:0];
endmodule
и все равно не хочет работать. Может дело в этом триггере-защелке LATCH? но я не нашел как описать этот LATCH на верилоге.
Пт фев 01, 2013 09:56:57
Похоже, что речь идёт о том, что называется transparent latch. Их надо отдельно делать.
- Код:
always @(d, g)
begin: latch
if (g == 1)
begin
q <= d;
end
end
Или так
reg out;
always @(gate or din)
if(gate)
out = din;
Как-то так. С синтаксисом мог ошибиться, но идея такая.
Вот ещё, может кому пригодиться:
http://eesun.free.fr/DOC/VERILOG/synvlg.html
Пт фев 01, 2013 10:08:45
у меня это будет как-то так?
- Код:
always @(A==8 or A==9)
begin
if (A==8)
INREG[7:0] <= DAT;
else if ((!CS && !WR && A == 4'b1001)||!RES)
INREG[15:8] <= DAT;
тогда не будет условия при RES==0
или это будет так?
- Код:
always @(A==8 or INREG)
begin
if (A==8)
INREG[7:0] <= DAT;
else if
INREG<=0;
always @(A==9 or INREG)
begin
if (A==9)
INREG[15:8] <= DAT;
else if
INREG<=0;
или чего я не понимаю?
Пт фев 01, 2013 10:27:20
Просто по ссылке,которую вы скинули,я нашел раздел Latches.
Там описан триггер, с разрешающим входом ,обычным входом и выходом.
У меня та же ситуация, только у меня 2 разрешающих входа получается, при А=8 и А=9.Я не понимаю как это описать.Что при 8 он пропускает одну часть сигналов,а при 9 другую.
Пт фев 01, 2013 10:31:17
AHDL не знаю. Посему не понимаю, что вам надо получить.
Посмотрите как сделан latch по ссылке что я дал.
Вам надо сделать присвоение значения, когда выполняется заданное условие. Когда условие не выполняется, то делать ничего не надо.
Добавил:
Т.е. вы сами не понимаете, что делает первый кусок кода!?
Так вы разберитесь, что исходный код делает! Выпишете "пути данных", условия. Схему на обычной логике нарисуйте, в крайнем случае. Чтобы вы сами поняли. А потом уже переписывайте на другом языке.
Пт фев 01, 2013 10:48:17
да,я понимаю впринципе,что он делает. раньше писал на AHDL(не до конца изучив язык). Щас уже перехожу на Verilog(от меня это потребовали).И вот прочитал про этот триггер-защелку.
думаю будет так,пока другого ничего в голову не приходит почему-то.
- Код:
reg INREG;
always @(!CS&&!WR&& A==8 or INREG[7:0])
if (!CS&&!WR&& A==8)
INREG[7:0]=DAT[7:0];
always @(!CS&&!WR&& A==9 or INREG[15:8])
if (!CS&&!WR&& A==9)
INREG[15:8]=DAT[7:0];
такой код имеет смысл?)
Пт фев 01, 2013 11:09:34
Nevox писал(а):такой код имеет смысл?)
Ну, в общем, наверно - да.
Пт фев 01, 2013 12:25:09
Error: Can't route source node "INREG[9]~98" of type max_mcell to destination node "Mux6~6" of type max_mcell
Error: Can't route source node "INREG[9]~98" of type max_mcell to destination node "INREG[9]~98" of type max_mcell
Error: Can't route source node "INREG[9]~98" of type max_mcell to destination node "INREG[9]~145" of type max_mcell
Error: Can't route source node "INREG[9]~98" of type max_mcell to destination node "WideNor0~0" of type max_mcell
Error: Can't place node "INREG[9]~145" of type max_mcell
Error: Can't find fit
Error: Quartus II Fitter was unsuccessful. 6 errors, 7 warnings
Error: Peak virtual memory: 400 megabytes
Error: Processing ended: Fri Feb 01 13:28:41 2013
Error: Elapsed time: 00:00:01
Error: Total CPU time (on all processors): 00:00:01
Error: Quartus II Full Compilation was unsuccessful. 8 errors, 38 warnings
при таком коде выдает вот такие ошибки...
это означает,что не хватает макроячеек и надо писать как-то еще хитрее и проще?
Пт фев 01, 2013 13:32:01
Чёт намудрил. Зачем INREG в always?
- Код:
reg INREG;
always @(CS or WR or A or DAT)
begin
if (!CS&&!WR&& A==8)
INREG[7:0]=DAT[7:0];
end
always @(CS or WR or A or DAT)
begin
if (!CS&&!WR&& A==9)
INREG[15:8]=DAT[7:0];
end
ЗЫ: Чёт давненько я на верилоге ничего не делал. Подзабыл уже.
Пт фев 01, 2013 13:35:18
а я по примеру делал)
- Код:
reg q;
always @ (q or enable)
if (enable)
q = d;
как здесь,по аналогии и сделал...
щас попробую этот код
upd. А тоже самое пишет,та же ошибка.
Пт фев 01, 2013 13:38:52
Для какой ПЛИС?
Пт фев 01, 2013 13:43:26
ALTERA EMP 3064 ATC 100-10
триггеров должно хватить поидее.
Пт фев 01, 2013 17:38:30
Nevox писал(а):триггеров должно хватить поидее.
Макроячейки задействуются не только на регистры из "схемы", но и на выводы (pin-ы) работающие на выход. А может просто не хватить ресурсов внутренней шины на разводку между макроячейками.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.