2013-12-20 5 views
0

В следующем коде: Во-первых, я загружаю ПЗУ с данными и весом по указанному адресу. В те же часы я делаю умножение данных и веса. Наконец, я увеличиваю количество бит с 16 до 23 бит. Код компилируется без ошибок, но имеет предупреждения. Я не могу решить эти предупреждения.предупреждения при запуске кода в xilinx

module main_module(extended_out,mux_out,data,weight,clk,en,addr); 
input clk,en; 
input [2:0] addr; 
output [7:0] data,weight; 
output [15:0] mux_out; 
output [22:0] extended_out; 

ram_input a1 (clk, en, addr, data); 
ram_weight a2 (clk, en, addr, weight); 
top_module a3 (mux_out,data,weight); 
SignExtender a4 (clk,mux_out,extended_out); 

endmodule 

################### МОДУЛЬ 1 ##################### ###################

module ram_input (clk, en, addr, data); 
input clk; 
input en; 
input [2:0] addr; 
output reg [7:0] data; 

reg [2:0] raddr; 
always @(posedge clk) 
begin 
    if (en) 
     raddr <= addr; 
end 

always @(raddr,en) 
begin 
    if (en) 
    begin 
     case(raddr) 
     3'b000: data = 8'b0000_0010; 
     3'b001: data = 8'b0000_0110; 
     3'b010: data = 8'b0000_1110; 
     3'b011: data = 8'b0000_0010; 
     3'b100: data = 8'b0000_0100; 
     3'b101: data = 8'b0000_1010; 
     3'b110: data = 8'b0000_1100; 
     3'b111: data = 8'b0000_0000; 
     default: data = 8'b0000_XXXX; 
     endcase 
    end 
    else 
     data = 8'b0000_0000; 
end 

endmodule 

###################### ################# МОДУЛЬ 2 ########################

module ram_weight (clk, en, addr, weight); 
input clk; 
input en; 
input [2:0] addr; 
output reg [7:0] weight; 

reg [2:0] raddr; 
always @(posedge clk) 
begin 
    if (en) 
     raddr <= addr; 
end 

always @(raddr,en) 
begin 
    if (en) 
    begin 
     case(raddr) 
      3'b000: weight = 8'b0000_1000; 
      3'b001: weight = 8'b0000_1010; 
      3'b010: weight = 8'b0001_1101; 
      3'b011: weight = 8'b0001_0100; 
      3'b100: weight = 8'b0000_0111; 
      3'b101: weight = 8'b0001_0010; 
      3'b110: weight = 8'b0010_1000; 
      3'b111: weight = 8'b0011_1111; 
      default: weight = 8'b0000_XXXX; 
     endcase 
    end 
    else 
     weight = 8'b0000_0000; 
end 

endmodule 

############################ 33 МОДУЛЬ - 3 ############ #########

module top_module(p,x,y); 
output [15:0]p; 
input [7:0]x,y; 
reg [15:0]p; 

reg [15:0]a; 
integer i; 

always @(x , y) 
begin 
    a=x; 
    p=0; 
    for(i=0;i<8;i=i+1) 
    begin 
     if(y[i]) 
      p=p+a; 
     a=a<<1; 
    end 
end 

endmodule 

############################## МОДУЛЬ - --- 4 #############################

module SignExtender(clk, extend, extended); 
input[15:0] extend; 
input clk; 
output[22:0] extended; 
reg[22:0] extended; 
wire [15:0] extend; 

always @(posedge clk) 
begin 
    extended[22:0] <= { {7{extend[15]}}, extend[15:0] }; 
end 

endmodule 

######## ################ ERROR ####################

ВНИМАНИЕ! 646 - Сигнал «a» назначается, но никогда не используется. Этот несвязанный сигнал будет обрезан во время процесса оптимизации.

ПРЕДУПРЕЖДЕНИЕ 1710 - «FF/Latch a4/extended_15» (без значения инициализации) имеет постоянное значение 0 в блоке main_module. Этот FF/Latch будет обрезан во время процесса оптимизации.

ПРЕДУПРЕЖДЕНИЕ: Xst: 1895 - Из-за другого "" FF/Latch trim "", FF/Latch "" a4/extended_14 "" (без значения init) имеет постоянное значение 0 в блоке «main_module». Этот FF/Latch будет обрезан во время процесса оптимизации.

ВНИМАНИЕ: Xst: 1895 - Из-за другого FF/Latch trim, FF/Latch "" a4/extended_13 "" (без значения init) имеет постоянное значение 0 в блоке "" main_module "". Этот FF/Latch будет обрезан во время процесса оптимизации.

ВНИМАНИЕ: Xst: 1895 - Из-за другого FF/Latch trim, FF/Latch "" a4/extended_12 "" (без значения init) имеет постоянное значение 0 в блоке "" main_module "". Этот FF/Latch будет обрезан во время процесса оптимизации.

ВНИМАНИЕ: Xst: 1895 - Из-за другой FF/Latch trim, FF/Latch "" a4/extended_11 "" (без значения init) имеет постоянное значение 0 в блоке "" main_module "". Этот FF/Latch будет обрезан во время процесса оптимизации.

ВНИМАНИЕ: Xst: 1895 - Из-за другой FF/Latch trimming, FF/Latch "" a4/extended_10 "" (без значения init) имеет постоянное значение 0 в блоке "" main_module "". Этот FF/Latch будет обрезан во время процесса оптимизации.

ВНИМАНИЕ: Xst: 1895 - Из-за другой FF/Latch trim, FF/Latch "" a4/extended_0 "" (без значения init) имеет постоянное значение 0 в блоке "" main_module "". Этот FF/Latch будет обрезан во время процесса оптимизации.

предупреждение - 1 говорит, что вы не использовали константу «а» переменной, но при этом умножение я взял в качестве временного регистра, но остальные ошибки я не понимаю, что они действительно собираются сказать ...

Пожалуйста, помогите объяснить эти предупреждения.

+0

Все ли работает правильно, когда вы имитируете этот дизайн? Если вы не запускаете симуляцию, тогда вы должны это сделать, а затем вернуться и сообщить нам результаты. –

+0

Я рекомендую использовать pastebin или github для длинного кода фрагмента. Трудно видеть без цветов. – Khanh

+0

да, сэр, я уже смоделирован, и выход тоже идет, но проблема с предупреждением, потому что при реализации этого кода на плате fpga я не знаю, погода моя придет или нет ....... –

ответ

2

Ваша основная проблема, вероятно, в p=p+a в top_module. Это не имеет смысла; попытайтесь нарисовать схему. Это комбинаторный путь с выходом сумматора, поданного обратно на его вход. Избавьтесь от него и просто добавьте вместе enter image description here, в зависимости от соответствующего бита y. Этого может быть достаточно, чтобы заставить вас идти.

EDIT

Ваш код вряд ли будет (правильно) синтезируемый (любой здравомыслящий синтезаторе, во всяком случае). Рассмотрим это:

always @(x , y) 
begin 
    a=x; 
    p=0; 
    for(i=0;i<8;i=i+1) 
    begin 
     if(y[i]) 
      p=p+a; 
     a=a<<1; 
    end 
end 

Это комбинационный код. Вы просите синтезатор развернуть ваш цикл i. Каждый раз, когда x или y изменений, вы хотите, чтобы синтезатор оценил все 8 итераций цикла, смещая a и накапливая до p. Синтезаторы обычно довольно хороши при разворачивании петли, но это толкает его. Избавьтесь от цикла, понимаете ли вы, что XST это понимает; это просто плохая практика и, вероятно, запутывает XST. Нарисуйте схему на бумаге. Все, что вы делаете, это смещение a: у вас есть один немодифицированный a и 7 экземпляров, где a сдвинут на 1 до 7 бит. Вам нужен сумматор, который объединяет все 8 автобусов, , но вы добавляете только на автобус i, если установлен соответствующий бит y. Другими словами, каждый вход в сумматор имеет на нем мультиплексор; один вход удерживается до нуля, другой - ваш сдвиг a. Вам нужно будет написать код самостоятельно. Вот как вы делаете аппаратный дизайн: разбивайте все на базовые единицы - мультиплексоры, переключатели, сумматоры и т. Д. Не записывайте поведенческий код, который ваш синтезатор должен попытаться выработать для вас; это программное обеспечение, а не аппаратное обеспечение.

Грег может быть прав в том, что ваша фактическая схема может быть упрощена в соответствии с вашими фактическими условиями ввода и что эта схема в конечном итоге не используется; это не 5-минутная работа, чтобы подтвердить это, и это бессмысленно. Вы пытаетесь написать множитель, и ваши условия ввода будут меняться, и вам нужно правильно ввести код. XST может или не может быть в состоянии решить, что в любой конкретной ситуации он может упростить логику, но сначала вы должны исправить свой входной код.

У вас есть другие проблемы. Не назначайте X своим переменным как «Не заботьтесь». Это очень плохая практика, и она пойдет не так. Читайте Mike Turpin's paper, среди прочих. Короче говоря, никогда не используйте X, если вы точно не знаете, что делаете. Используйте неблокирующие назначения в блоке x/y. Могут быть и другие проблемы, которые не очевидны при очень быстром прочтении.

+0

«" "" "Избавиться из этого, и просто добавьте вместе описание ввода изображения здесь, в зависимости от соответствующего бита y "" "" "" "" Я не получаю немного путаю, изображение очищает вес и ввод, хранящийся в rom, является входом для multipier ..... и вывод его будет подписывать расширение ,,,,,, ', и я получил комбинационный путь, но любое решение для удаления этого пути в этом коде –

1

Предупреждения вызваны тем, что сгенерированный список соединений не соответствует вашему RTL, но функционально эквивалентен. Для начинающих разработчиков ПЛИС предупреждение можно несколько игнорировать, но они должны научиться разрешать предупреждения. Дизайнеры IC почти всегда разрешают предупреждение, потому что это может сделать еще более сложным, а также другие проблемы.Оптимизатор в вашем инструменте синтезатора распознает, что биты extended[0] и extended[15:10] имеют нулевое изменение процента, имеющее значение, отличное от 0. Он также решил, что a не требуется.

extended[0] может быть только 0, потому что data[0] присваивается четному номеру. Любое целое число, умноженное на четное число, всегда четное, поэтому LSB всегда будет равным нулю. Логику и флоп/защелку, используемые для расчета этого бита, можно смело заменить на драйвер 0.

Аналогичная оптимизация выполняется для бит extended[15:10]. Наибольшее значение extended может иметь 16'b0000_0001_1110_0000; 8'b0000_1100 (данные) время 8'b0010_1000 (масса) когда clocked addr==3'b110. В пределах доступных значений data и weight нет никакой возможной комбинации, что любой бит более 9 может быть чем угодно, кроме 0. Как и бит 0, синтезатор решил сэкономить место и улучшить производительность, а не следовать вашему коду дословно. Скорее всего, где-то в журнале синтеза есть предупреждения о том, что биты extended[22:16] также обрезаются во время процесса оптимизации.

Предупреждение для a не потому, что это временная переменная. Оптимизатор распознает extended может быть только одним из восьми возможных значений. Значения значений data и weight получены из справочных таблиц, которые используют один и тот же указатель указателя (addr). Еще раз, требуется меньше логики и более высокой производительности, чтобы жестко закодировать 8 значений в другую таблицу поиска, а затем фактическую логику умножения. Если логика умножителя больше не нужна, a становится бесполезным и удаляется.

Попробуйте refactoring ваш RTL. Также убедитесь, что имена модулей и сетей имеют смысл; ex top_module до multiplier_8bit и ram_* до rom_*. Консолидация избыточной логики и более четкой функциональной логики. Вы можете игнорировать предупреждения, если хотите, чтобы это в основном работало. Если вы хотите стать хорошим дизайнером логики, вам следует попытаться разрешить предупреждения.

+0

, но при генерации netlist он показывает ошибку, код не является Синтезируемый –

+0

В приведенном ниже примере отображаются предупреждения. Он синтезируется с ошибками здесь. http://www.edaplayground.com/s/6/683 Убедитесь, что он правильно имитирует, прежде чем пытаться синтезировать. – Greg

Смежные вопросы