Jump to content
    

Реализация конечного автомата генератора последовательностей

Muscat, мануальчики мануальчики))))

 

- Вопрос по регистрам снимаю, убрал я FDP чтобы не усложнять себе жизнь, все строю на FDC.

 

- По поводу ADSU4. Первый ADSU4 у меня реализует функцию DEC (CL-1), т.е. вычитание. Согласно таблице логики на входы А мы подаем наше текущее состояние Q, например 0000. Вход ADD мы должны поставить в состояние 0, чтобы происходил вычет, также CI, CO тоже должны быть равны 0 и тогда мы из А будем вычитать В. На этом мое понимание заканчивается о том что такое В и откуда мы его берем.

Второй ADSU4 реализует функцию INC (CL+1), т.е. сложение. Далее все аналогично, только на ADD, CI и CO мы теперь подаем 1 и в итоге получим А+В.

Или получается что мы на В постоянно 0001 подаем, чтобы ее плюсовать или вычитать?

А вот что с OFL делать я не понял...

Edited by Михей91

Share this post


Link to post
Share on other sites

Собственно симулятор не заработал...

ERROR:DesignEntry:239 - Incorrect bus tap at (640 160, 544 160); destination
  branch "DATA_O0" is not part of the source branch "DATA_O(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (640 352, 544 352); destination
  branch "DATA_O1" is not part of the source branch "DATA_O(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (640 544, 544 544); destination
  branch "DATA_O2" is not part of the source branch "DATA_O(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (640 752, 544 752); destination
  branch "DATA_O3" is not part of the source branch "DATA_O(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (1248 240, 1152 240); destination
  branch "SEQ0" is not part of the source branch "SEQ(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (1248 656, 1152 656); destination
  branch "SEQ1" is not part of the source branch "SEQ(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (1248 1056, 1152 1056); destination
  branch "SEQ2" is not part of the source branch "SEQ(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (1248 1488, 1152 1488); destination
  branch "SEQ3" is not part of the source branch "SEQ(3:0)".
ERROR:ProjectMgmt:387 - TOE: ITclInterp::ExecuteCmd gave Tcl result 'can't read "iFileType": no such variable'.
Tcl_ErrnoId: unknown error
Tcl_ErrnoMsg: No error
_cmd: ::xilinx::Dpm::dpm_chTransformExecuteNoClean dpm_ecsConvertSchematics $piThisInterface
errorInfo: can't read "iFileType": no such variable
   while executing
"if { $iFileType eq "UNKNOWN" } {
               continue ; # unknown is just ignored, its probably .txt
             }"
   ("foreach" body line 3)
   invoked from within
"foreach sItem $lOutputFileList {
           if { ![dpm_parseOutputFile $sItem $iDesign sFile iFileType fileOrigination] } {
             if { $iFile..."
   (procedure "dpm_chTransformOutput" line 15)
   invoked from within
"dpm_chTransformOutput $piTranInst $lOutputFileList"
   (procedure "dpm_ecsConvertSchematics" line 128)
   invoked from within
"$sCmd $iTransformInstance $sCmdArgs"
   (procedure "dpm_chTransformExecuteEngine" line 100)
   invoked from within
"dpm_chTransformExecuteEngine $sFlowProc $iInterface $bRunTransformWithEmptyInputSet false "
   (procedure "::xilinx::Dpm::dpm_chTransformExecuteNoClean" line 3)
   invoked from within
"::xilinx::Dpm::dpm_chTransformExecuteNoClean dpm_ecsConvertSchematics $piThisInterface"

 

Код главного файла:

`timescale 1ns / 1ps

module revers(
	input wire           b0,
	input wire           b1,
	input wire           b2,
	input wire           b3,
	input wire           ci_dec,
	input wire           add_dec,
	input wire           ci_inc,
	input wire           add_inc,
	output wire   	 co_dec,
	output wire   	 ofl_dec,
	output wire   	 co_inc,
	output wire   	 ofl_inc,

     input wire              clk,
     input wire              rst,
     input wire              load,
     input wire              up,
     input wire              oe, 		
     input wire  [3:0]     data_i,
     output wire [3:0]    data_o,
     output wire [3:0]    seq
   );

// Sch.* Module Connection:
revers_sch                SCH_EXAMPLE(
.B0(b0),
.B1(b1),
.B2(b2),
.B3(b3),
.CI_DEC(ci_dec),
.ADD_DEC(add_dec),
.CI_INC(ci_inc),
.ADD_INC(add_inc),
.CO_DEC(co_dec),
.OFL_DEC(ofl_dec),
.CO_INC(co_inc),
.OFL_INC(ofl_inc),

.CLK(clk),
.RST(rst),
.LOAD(load),
.UP(up),
.OE(oe), 		
.DATA_I(data_i),
.DATA_O(data_o),
.SEQ(seq)
);
//------------------------------------------

endmodule

 

Код файла тест бенч:

`timescale 1ns / 1ps

module revers_tb;

// Inputs
reg b0;
reg b1;
reg b2;
reg b3;
reg ci_dec;
reg add_dec;
reg ci_inc;
reg add_inc;
reg clk;
reg rst;
reg load;
reg up;
reg oe;
reg [3:0] data_i;

// Outputs
wire co_dec;
wire ofl_dec;
wire co_inc;
wire ofl_inc;
wire [3:0] data_o;
wire [3:0] seq;

// Instantiate the Unit Under Test (UUT)
revers uut (
   .B0(b0),
	.B1(b1),
	.B2(b2),
	.B3(b3),
	.CI_DEC(ci_dec),
	.ADD_DEC(add_dec),
	.CI_INC(ci_inc),
	.ADD_INC(add_inc),
	.CO_DEC(co_dec),
	.OFL_DEC(ofl_dec),
	.CO_INC(co_inc),
	.OFL_INC(ofl_inc),

	.CLK(clk),
	.RST(rst),
	.LOAD(load),
	.UP(up),
	.OE(oe), 		
	.DATA_I(data_i),
	.DATA_O(data_o),
	.SEQ(seq)
);

initial begin
	// Initialize Inputs
	b0 = 1;
	b1 = 0;
	b2 = 0;
	b3 = 0;
	ci_dec = 0;
	add_dec = 0;
	ci_inc = 1;
	add_inc = 1;
	clk = 0;
	rst = 0;
	load = 0;
	up = 0;
	oe = 0;
	data_i = 0;

	// Wait 100 ns for global reset to finish
	#20;

end

// Объявление CLK 
always 
	#5  clk =  ! clk; 

// Объявление RST 
  initial
	begin
		#20 rst = 1;
		#10 rst = 0;
	end	

// Объявление OE
initial 
	begin
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#10 oe = 1;
			@ (negedge clk);
			#490 oe = 0;
	end

// Объявление UP
initial 
	begin
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#190 up = 1;
			@ (negedge clk);
			#210 up = 0;
	end	

// Объявление LOAD
initial 
	begin
		data_i = 4'h5;
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#450 load = 1;
			@ (negedge clk);
			#10 load = 0;
	end		


endmodule

 

revers_sch.sch

screenshots.rar

Edited by Михей91

Share this post


Link to post
Share on other sites

Итак, у тебя есть сигнал A. На выходе ты должен получить в первом случае сигнал (A-1), во втором (A+1).

У тебя есть блок ADSU4. Выбирая его, нажми кнопку Symbol Info, там исчерпывающая информация

 

When the ADD input is High, this element adds two 4-bit words (A3:A0 and B3:B0) and a carry-in (CI), producing a 4-bit sum output (S3:S0) and a carry-out (CO) or an overflow (OFL).

When the ADD input is Low, this element subtracts B3:B0 from A3:A0, producing a 4-bit difference output (S3:S0) and a carry-out (CO) or an overflow (OFL).

 

Чтобы получить element subtracts надо ADD input is Low. Для обратного - обратное значение ADD. Ок.

 

Не знаю, проходили ли вы это или нет, но в тензорной алгебре это уравнение записывается вот так

а) A - (X) =A - 1

б) A + (X) = A+ 1

У меня под рукой нет матлаба, так что решить пока не могу. Но думаю, ты и сам справишься.

 

С переносом я точно не помню, посмотри во всяких учебниках по схемоте типа Титце и Шенка, что делать с битом переноса CO для кольцеового счетчика. Можешь спросить препода. Думаю, что его надо замкнуть на вход переноса CI. Или забить.

 

>>А вот что с OFL делать я не понял...

Unsigned Binary Versus Two's Complement -This design element can operate on either 4-bit unsigned binary numbers or 4-bit two's-complement numbers. If the inputs are interpreted as unsigned binary, the result can be interpreted as unsigned binary. If the inputs are interpreted as two's complement, the output can be interpreted as two's complement. The only functional difference between an unsigned binary operation and a two's-complement operation is the way they determine when ”overflow” occurs. Unsigned binary uses CO, while two's complement uses OFL to determine when ”overflow” occurs.

Краткое содержание - ничего не делать, если ты используешь беззнаковый тип. (Подсказка - да, это так). Для тебя этот сигнал не нужен, используй выход переноса.

Share this post


Link to post
Share on other sites

Ошибки с шиной устранил, теперь вылезли новые...

 

Ошибки устранил, симулятор заработал, но непонятно как... SEQ от DATA_O строится верно, но сама DATA_O перепрыгивает, а не четко идет +1 или -1, на UP неправильно реагирует... вообщем работает непонятно как...

И можно ли в симуляторе скрыть ненужные мне линии, а оставить только те, которые меня реально интересуют?

_ _ _

 

Код главного файла:

`timescale 1ns / 1ps

module revers(
	input wire           b0,
	input wire           b1,
	input wire           b2,
	input wire           b3,
	input wire           ci_dec,
	input wire           add_dec,
	input wire           ci_inc,
	input wire           add_inc,
	output wire   			co_dec,
	output wire   			ofl_dec,
	output wire   			co_inc,
	output wire   			ofl_inc,

     input wire           clk,
     input wire           rst,
     input wire           load,
     input wire           up,
     input wire           oe, 		
     input wire  [3:0]    data_i,
     output wire [3:0]    data_o,
     output wire [3:0]    seq
   );

// Sch.* Module Connection:
revers_sch                SCH_EXAMPLE(
.B0(b0),
.B1(b1),
.B2(b2),
.B3(b3),
.CI_DEC(ci_dec),
.ADD_DEC(add_dec),
.CI_INC(ci_inc),
.ADD_INC(add_inc),
.CO_DEC(co_dec),
.OFL_DEC(ofl_dec),
.CO_INC(co_inc),
.OFL_INC(ofl_inc),

.CLK(clk),
.RST(rst),
.LOAD(load),
.UP(up),
.OE(oe), 		
.DATA_I(data_i),
.DATA_O(data_o),
.SEQ(seq)
);
//------------------------------------------

endmodule

 

Код файла тест бенч:

`timescale 1ns / 1ps

module revers_tb;

// Inputs
reg clk;
reg rst;
reg load;
reg up;
reg oe;
reg [3:0] data_i;
reg b0;
reg b1;
reg b2;
reg b3;
reg ci_dec;
reg add_dec;
reg ci_inc;
reg add_inc;


// Outputs
wire co_dec;
wire ofl_dec;
wire co_inc;
wire ofl_inc;
wire [3:0] data_o;
wire [3:0] seq;

// Instantiate the Unit Under Test (UUT)
revers uut (
   .b0(b0),
	.b1(b1),
	.b2(b2),
	.b3(b3),
	.ci_dec(ci_dec),
	.add_dec(add_dec),
	.ci_inc(ci_inc),
	.add_inc(add_inc),
	.co_dec(co_dec),
	.ofl_dec(ofl_dec),
	.co_inc(co_inc),
	.ofl_inc(ofl_inc),

	.clk(clk),
	.rst(rst),
	.load(load),
	.up(up),
	.oe(oe), 		
	.data_i(data_i),
	.data_o(data_o),
	.seq(seq)
);

initial begin
	// Initialize Inputs
	b0 = 1;
	b1 = 0;
	b2 = 0;
	b3 = 0;
	ci_dec = 0;
	add_dec = 0;
	ci_inc = 1;
	add_inc = 1;
	clk = 0;
	rst = 0;
	load = 0;
	up = 0;
	oe = 0;
	data_i = 0;

	// Wait 20 ns for global reset to finish
	#20;

end

// Объявление CLK 
always 
	#5  clk =  ! clk; 

// Объявление RST 
  initial
	begin
		#20 rst = 1;
		#10 rst = 0;
	end	

// Объявление OE
initial 
	begin
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#10 oe = 1;
			@ (negedge clk);
			#490 oe = 0;
	end

// Объявление UP
initial 
	begin
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#190 up = 1;
			@ (negedge clk);
			#210 up = 0;
	end	

// Объявление LOAD
initial 
	begin
		data_i = 4'h5;
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#450 load = 1;
			@ (negedge clk);
			#10 load = 0;
	end		


endmodule

 

revers_sch.sch

screenshots.rar

Share this post


Link to post
Share on other sites

Выкладывай проект в ISE целиком.

 

Входной бит переноса 0, на выходной забиваешь, тогда счет бует -E-F-0-1..

Share this post


Link to post
Share on other sites

Выкладывай проект в ISE целиком.

 

Входной бит переноса 0, на выходной забиваешь, тогда счет бует -E-F-0-1..

 

lab_3.rar

 

соединить CI и СО убрав маркеры?

 

Share this post


Link to post
Share on other sites

Собственно выявил некую закономерность: у меня UP работает как LOAD, а LOAD как UP... Изменил схему мультиплексоров, поменял местами входы UP и LOAD, теперь вроде бы работать стало верно, но не совсем... Когда подаем UP счет действительно начинает идти в другую сторону, но не последовательно, а через 1, т.е. 0011, 0101, 0111 и т.д., DATA_I делаю равным 0110, подгружаю LOAD и в DATA_O должна была загрузить 0110 соотвественно, но загружается 1111, а также временная диаграмма сама обрезается на 285 нс, хотя должна идти до 1000 нс.

И еще симулятор выводит данное предупреждение: WARNING: File "D:/Xilinx/project/my/lab_3/revers.v" Line 31. For instance uut/SCH_EXAMPLE/, width 1 of formal port DATA_I is not equal to width 4 of actual signal data_i.

 

Помогите разобраться, совсем немножко то остается... :(

 

Предупреждение убрал, добавил DATA_I как шину в схему мультиплексоров, LOAD заработал как надо, а вот UP все равно продолжает прыгать через один, и диаграмма снова обрезается самовольно...

 

И с UP справился...

ci_inc = 0; - до этого была единица, теперь считает обратно последовательно.

 

Остался последний вопрос, почему он режет диаграмму?

 

Ну и с этим справился... Убрал замыкание между CI_DEC и CO_DEC на ADSU4, и изменил ci_dec = 1; (до этого был ноль).

 

Остался последний вопрос, почему когда мы уже подали сигнал OE = 1 у нас все равно идут 0000, чего он ждет то?

post-74572-1354802929_thumb.png

Edited by Михей91

Share this post


Link to post
Share on other sites

Твиттер в соседней вкладке.

 

>>For instance uut/SCH_EXAMPLE/, width 1 of formal port DATA_I is not equal to width 4 of actual signal data_i.

Для модуля uut/SCH_EXAMPLE/ ширина порта DATA_I не соответствует ширине 4 сигнала signal data_i.

 

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

 

Share this post


Link to post
Share on other sites

Muscat, ну что поделать если я сам нахожу решение, которое как мне казалось не найду... На все вопросы я нашел ответы, остался только один:

 

Остался последний вопрос, почему когда мы уже подали сигнал OE = 1 у нас все равно идут 0000, чего он ждет то?

post-74572-1354802929_thumb.png

 

verilog module

`timescale 1ns / 1ps

module revers(
	input wire           b0,
	input wire           b1,
	input wire           b2,
	input wire           b3,
	input wire           ci_dec,
	input wire           add_dec,
	input wire           ci_inc,
	input wire           add_inc,
	output wire   			co_dec,
	output wire   			ofl_dec,
	output wire   			co_inc,
	output wire   			ofl_inc,

     input wire           clk,
     input wire           rst,
     input wire           load,
     input wire           up,
     input wire           oe, 		
     input wire  [3:0]    data_i,
     output wire [3:0]    data_o,
     output wire [3:0]    seq
   );

// Sch.* Module Connection:
revers_sch                SCH_EXAMPLE(
.B0(b0),
.B1(b1),
.B2(b2),
.B3(b3),
.CI_DEC(ci_dec),
.ADD_DEC(add_dec),
.CI_INC(ci_inc),
.ADD_INC(add_inc),
.CO_DEC(co_dec),
.OFL_DEC(ofl_dec),
.CO_INC(co_inc),
.OFL_INC(ofl_inc),

.CLK(clk),
.RST(rst),
.LOAD(load),
.UP(up),
.OE(oe), 		
.DATA_I(data_i),
.DATA_O(data_o),
.SEQ(seq)
);
//------------------------------------------

endmodule

 

verilog test fixture

`timescale 1ns / 1ps

module revers_tb;

// Inputs
reg clk;
reg rst;
reg load;
reg up;
reg oe;
reg [3:0] data_i;
reg b0;
reg b1;
reg b2;
reg b3;
reg ci_dec;
reg add_dec;
reg ci_inc;
reg add_inc;


// Outputs
wire co_dec;
wire ofl_dec;
wire co_inc;
wire ofl_inc;
wire [3:0] data_o;
wire [3:0] seq;

// Instantiate the Unit Under Test (UUT)
revers uut (
   .b0(b0),
	.b1(b1),
	.b2(b2),
	.b3(b3),
	.ci_dec(ci_dec),
	.add_dec(add_dec),
	.ci_inc(ci_inc),
	.add_inc(add_inc),
	.co_dec(co_dec),
	.ofl_dec(ofl_dec),
	.co_inc(co_inc),
	.ofl_inc(ofl_inc),

	.clk(clk),
	.rst(rst),
	.load(load),
	.up(up),
	.oe(oe), 		
	.data_i(data_i),
	.data_o(data_o),
	.seq(seq)
);

initial begin
	// Initialize Inputs
	b0 = 1;
	b1 = 0;
	b2 = 0;
	b3 = 0;
	ci_dec = 1;
	add_dec = 0;
	ci_inc = 0;
	add_inc = 1;
	clk = 0;
	rst = 0;
	load = 0;
	up = 0;
	oe = 0;
	data_i = 0;

	// Wait 20 ns for global reset to finish
	#20;

end

// Объявление CLK 
always 
	#5  clk =  ! clk; 

// Объявление RST 
  initial
	begin
		#20 rst = 1;
		#10 rst = 0;
	end	

// Объявление OE
initial 
	begin
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#10 oe = 1;
			@ (negedge clk);
			#490 oe = 0;
	end

// Объявление UP
initial 
	begin
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#190 up = 1;
			@ (negedge clk);
			#210 up = 0;
	end	

// Объявление LOAD
initial 
	begin
		data_i = 4'h5;
		@ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
		@ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
			#450 load = 1;
			@ (negedge clk);
			#10 load = 0;
	end			


endmodule

Share this post


Link to post
Share on other sites

1) for instance uut/SCH_EXAMPLE/, width 1 of formal port DATA_I. is not equal to width 4 of actual signal data_i

2) Ты выложил вериложную обертку и тест бенч, не выложив схемы и задаешь вопрос почему у тебя не работает схема.

 

 

 

Share this post


Link to post
Share on other sites

Muscat, 1) я же уже написал, что данный вопрос решился добавлением шины у мультиплексоров....

2) Вот проект: lab_3.rar

Edited by Михей91

Share this post


Link to post
Share on other sites

1) Твиттер... в соседней ... вкладке.... Вылавливать из потока сознания публикуемого в реал-тайм, где у тебя вопрос, а где радость решения не самое интересное занятие...

 

почему когда мы уже подали сигнал OE = 1 у нас все равно идут 0000, чего он ждет то?

Потому что сигнал ОЕ у тебя идет только в одно место

   BUFGCE  XLXI_245 (.CE(OE), 
                    .I(Q3), 
                    .O(DATA_O[3]));

Больше никуда.. Его никто нигде больше не ждет.

На выходе буфера 0, потому что на входе буфера тоже 0. Выключи сигнал ОЕ и счет (см сигнал SEQ) все равно начнется в тот же момент. Счет у тебя начинается в момент 100 нас. У тебя есть какое то событие, которое происходит в момент 100нс, какое я если честно не понял.

 

Запусти симуляцию фалйа SCH_EXAMPLE, то есть голой схемы без событий и увидишь некое переключение из 0 в 0 в момент 100нс. Забавная штука.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...