igormihmih 0 4 января, 2011 Опубликовано 4 января, 2011 · Жалоба Здравствуйте! В качестве хелловорлда написал проектик-сумматор. Суть его в том, что на: 1) сигнал reset - зануляются счетчики. 2) сигнал clc - происходит заполнение 10-елементного массива интов извне. По окончанию заполнения считается ксор всех бит и выводится. Вот код: `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 15:02:32 01/04/2011 // Design Name: // Module Name: mod // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module mod( input [0:0] reset, input [0:0] clc, input [0:31] in, output reg [0:0] out ); reg[0:31] array[0:9]; reg[0:31] counter; reg[0:31] i; task summator; // процедура суммирования begin for(i=1;i<10;i=i+1)array[0]=array[0]^array[i]; array[0][0:15]=array[0][0:15]^array[0][16:31]; array[0][0:7]=array[0][0:7]^array[0][8:15]; array[0][0:3]=array[0][0:3]^array[0][4:7]; array[0][0:1]=array[0][0:1]^array[0][2:3]; array[0][0:0]=array[0][0:0]^array[0][1:1]; end endtask always @(posedge reset) counter=0; //зануление счетчика массива always @(posedge clc) begin if(counter>=10) begin // суммирование, если елементы массива закончились summator(); out=array[0][0:0]; end else begin // заполнение массива в противном случае array[counter]=in; counter=counter+1; end end endmodule Ах да, среда разаработки ISE WebPack 12. Ошибка выдается: ERROR:Map:116 - The design is empty. No processing will be done. ERROR:Map:52 - Problem encountered processing RPMs. Посдкажите, пожалуйста, что я делал неправильно и что нужно переделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 5 января, 2011 Опубликовано 5 января, 2011 · Жалоба Ваш дезайн вообще не должен был синтезироваться - у вас присваивания в counter в 2х разных always блоках PS. Ваш xor - это жесть ;) xor всех битов array[0] записывается как ^array[0] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igormihmih 0 5 января, 2011 Опубликовано 5 января, 2011 · Жалоба Ваш дезайн вообще не должен был синтезироваться - у вас присваивания в counter в 2х разных always блоках PS. Ваш xor - это жесть ;) xor всех битов array[0] записывается как ^array[0] Привычка, взятая из С :laughing: Методом втыка понял, что ошибка в такокого рода конструкциях: array[0][0:0]=array[0][0:0]^array[0][1:1]; //типа x[n:m] = F( x[n:m] ) Странно, ведь "i = i + 1" - работает :cranky: Ваш дезайн вообще не должен был синтезироваться - у вас присваивания в counter в 2х разных always блоках Кстати, а где сказано, что нельзя? Вот, например, iverilog все съедает. Да и в Полякове такого не встречал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 6 января, 2011 Опубликовано 6 января, 2011 · Жалоба А почему Вы не хотите просто написать простой сумматор: Following is the VHDL code for an unsigned 8-bit adder. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity adder is port(A,B : in std_logic_vector(7 downto 0); SUM : out std_logic_vector(7 downto 0)); end adder; architecture archi of adder is begin SUM <= A + B; end archi; Following is the Verilog code for an unsigned 8-bit adder. module adder(A, B, SUM); input [7:0] A; input [7:0] B; output [7:0] SUM; assign SUM = A + B; Я бы для первого проекта взял бы счетчик и старшие разряды вывел бы на светодиоды - результат мигание светодиодов. Разрядность счетчика рассчитывал исходя из тактовой частоты. Following is VHDL code for a 4-bit unsigned Up counter with asynchronous clear. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity counter is port(C, CLR : in std_logic; Q : out std_logic_vector(3 downto 0)); end counter; architecture archi of counter is signal tmp: std_logic_vector(3 downto 0); begin process (C, CLR) begin if (CLR='1') then tmp = "0000"; elsif (C'event and C='1') then tmp <= tmp + 1; end if; end process; Q <= tmp; end archi; Verilog Code Following is the Verilog code for a 4-bit unsigned Up counter with asynchronous clear. module counter (C, CLR, Q); input C, CLR; output [3:0] Q; reg [3:0] tmp; always @(posedge C or posedge CLR) begin if (CLR) tmp = 4'b0000; else tmp = tmp + 1'b1; end assign Q = tmp; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 6 января, 2011 Опубликовано 6 января, 2011 · Жалоба Привычка, взятая из С :laughing: Отвыкайте - Verillog - это не С! Кстати, а где сказано, что нельзя?Везде. Вот, например, iverilog все съедает.Симулировать можно, синтезировать нельзя. Кстати, ваш дезайн синтезатор полностью выбрасывает, получается константа на выходе out ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igormihmih 0 6 января, 2011 Опубликовано 6 января, 2011 · Жалоба А почему Вы не хотите просто написать простой сумматор: такой уже писал, он работал. Теперь хочу усложнить до более сложной функции (нпр, реализовать какой-нить помехоустойчивое кодирование) Я бы для первого проекта взял бы счетчик и старшие разряды вывел бы на светодиоды - результат мигание светодиодов. Разрядность счетчика рассчитывал исходя из тактовой частоты. Так такой я тоже делал и он тоже работал. Отвыкайте - Verillog - это не С! ...чем сейчас и занимаюсь :) Кстати, ваш дезайн синтезатор полностью выбрасывает, получается константа на выходе out ;) Пересмотрел замечания по поводу дизайна. Переделал таким образом (не обращайте внимание, что сумматор в процедуре сделан - это для возможности дальнейшего расширения): `timescale 1ns / 1ps module mod( input [0:0] reset, input [0:0] clc, input [0:31] in, output reg[0:0] out ); reg[0:31] array[0:9]; reg[0:31] counter; reg[0:31] i; task summator; begin for(i=0;i<9;i=i+1)array[9]=array[9]^array[i]; array[0][0:0]=(^array[9]); end endtask always @(posedge clc or posedge reset) begin if(clc==1) begin if(counter>=10) begin summator(); out=(array[0][0:0]); end else begin array[counter]=in; counter=counter+1; end end if(reset==1)counter=0; end endmodule В результате, бихевирал симуляция прошла на ура, но вот Post-Map и Post-Route - на выходе, в переменной out заначение долгое время прыгало с 0 на 1 и обратно, а потом, после нескольких десятков наносекунд, устаканилось в правильный ответ (при чем не факт, что он попросту не угаданый системой моделирования). С чем это может выть связанно (там же, вроде, уже все синтезируется)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 6 января, 2011 Опубликовано 6 января, 2011 · Жалоба У вас получилась логика, а не тригера, из за неправильно записанного условия в блоке aways. Должно быть так: always @(posedge clc or posedge reset) begin if(reset) counter=0; else begin if(counter>=10) begin summator(); out=(array[0][0:0]); end else begin array[counter]=in; counter=counter+1; end end Кстати, присваивания в блоках always нужно делать асинхронными (<=) (А в вашем task'е - синхронными, т.е. там правильно) И еще - массивы вида [0:0] - это оксюморон, используйте обычные провода (без массивов) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igormihmih 0 8 января, 2011 Опубликовано 8 января, 2011 · Жалоба У вас получилась логика, а не тригера, из за неправильно записанного условия в блоке aways. Ого, надо же, заработало, спасибо. Вот только моя встроенная логика сопротивляется осознавать такие шаманские ритуалы :) Заменил сумматор более навороченной функцией. Случайно поставил вместо "always(posedge clc or posedge reset)" - "always(posedge clc, posedge reset)" (думал, что одно и тоже). Опять в бихевереле норм, в построуте - бред. Вернул на место "always(posedge clc or posedge reset)". Поставил симулировать - винда зависла. Перегрузился, опять запустил симуляцию, опять зависла... :angry2: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igormihmih 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба У вас получилась логика, а не тригера, из за неправильно записанного условия в блоке aways. Вообщем в построуте таки и повесилось, но в постмапе начало выдавать правильные результаты. Большое спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shtirlits 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба У меня возникли две ассоциации: memtest86 термопаста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igormihmih 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба У меня возникли две ассоциации: memtest86 термопаста ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shtirlits 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Грешу на память вашего компьютера и на плохой теплоотвод от процессора, просто так кратко выразил мысль. У меня от симулятора система не виснет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igormihmih 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Грешу на память вашего компьютера и на плохой теплоотвод от процессора, просто так кратко выразил мысль. У меня от симулятора система не виснет. У меня тоже, КАК ПРАВИЛО, не виснет :) Память? Выдавало аксес виолатион на какой-то экзешник, может заводская бага? Раньше такого не было, но и правильных проектов я раньше не запускал :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться