апкс 2011 04_verilog_продолж
Upcoming SlideShare
Loading in...5
×
 

апкс 2011 04_verilog_продолж

on

  • 533 views

 

Statistics

Views

Total Views
533
Views on SlideShare
533
Embed Views
0

Actions

Likes
0
Downloads
7
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

апкс 2011 04_verilog_продолж апкс 2011 04_verilog_продолж Presentation Transcript

  • VERILOG4.2 Генерирование операторов Автоматизация проектирования компьютерных систем д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ21.02.2011 e-mail: hahanova@mail.ru 1
  • Цель лекции и содержание Цель – План  а 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 2 hahanova@mail.ru
  • Оператор generate и переменные genvar Cинтаксис: genvar list_of_genvar_identifiers ; где list_of_genvar_identifiers – список переменных genvar Пример Генерирование копий операторов assign module xorGen #(parameter width = 4, delay =10) (output [1:width] xout, input [1:width] xin1, xin2); generate genvar i; for (i = 1; i <= width; i=i + 1) begin: xi assign #delay xout[i] = xin1[i] ^ xin2[i]; end endgenerate endmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 3 hahanova@mail.ru
  • Оператор generate с циклом for Синтаксис generate { for ( genvar_assignment ; constant_expression ; genvar_assignment ) begin: generate_block_identifier { generate_item } end } endgenerateгде genvar_assignment – начальное значение переменной genvar, constant_expression – условие завершения цикла, genvar_assignment – шаг цикла, generate_item – генерируемые операторы. 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 4 hahanova@mail.ru
  • Пример. 1 Генерирование вентилей generate genvar i; for (i = 1; i <= width; i=i+1) begin: xi xor #delay a (xout[i], xin1[i], xin2[i]); end endgenerate 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 5 hahanova@mail.ru
  • Пример. 2 Генерирование копий оператора always. generate genvar i; for (i = 1; i <= width; i=i+1) begin: xi always @(*) xout[i] = xin1[i] ^ xin2[i]; end endgenerate 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 6 hahanova@mail.ru
  • Условный оператор generate Синтаксис: generate if ( constant_expression ) generate_item_or_null [else generate_item_or_null ] endgenerate где constant_expression – условие генерирования операторов. 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 7 hahanova@mail.ru
  • Конфигурируемое устройство умноженияmodule multiplier #(parameter a_width = 8, b_width = 8) (input [a_width-1:0] a, [b_width-1:0] b, output [a_width+b_width-1:0] product); generate if((a_width < 8) || (b_width < 8)) CLA_multiplier #(a_width,b_width) u1(a, b, product); else WALLACE_multiplier #(a_width,b_width) u1(a, b, product); endgenerateendmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 8 hahanova@mail.ru
  • Generate с оператором case Синтаксис: generate case ( constant_expression ) genvar_case_item { genvar_case_item } endcase genvar_case_item ::= constant_expression { , constant_expression } : generate_item_or_null | default [ : ] generate_item_or_null endgenerate 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 9 hahanova@mail.ru
  • Пример 3generate case (WIDTH) // 1-битовый сумматор 1: adder_1bit x1(co, sum, a, b, ci); // 2-битовый сумматор 2: adder_2bit x1(co, sum, a, b, ci); // сумматор CLA default: adder_cla #(WIDTH) x1(co, sum, a, b, ci); endcaseendgenerate 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 10 hahanova@mail.ru
  • Использование вложенных generate parameter SIZE = 2; genvar i, j, k, m; Generate // Многоуровненый оператор generate for (i=0; i<SIZE+1; i=i+1) begin:B1 // область действия B1[i] M1 N1(); // копии B1[i].N1[i] компонента M1 for (j=0; j<SIZE; j=j+1) begin:B2 // область действия B1[i].B2[j] M2 N2(); // копии B1[i].B2[j].N2 компонента M2 for (k=0; k<SIZE; k=k+1) begin:B3 // область действия B1[i].B2[j].B3[k] // копии B1[i].B2[j].B3[k].N3 M3 N3(); end end if (i>0) for (m=0; m<SIZE; m=m+1) begin:B4 // область действия B1[i].B4[m] M4 N4(); // копии B1[i].B4[m].N4 end end endgenerate21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 11 hahanova@mail.ru
  • Контрольные вопросы и задания.11. Разработать структурную модель 32-битного двунаправленного трансивера, использующую в качестве компонента функциональную модель 1- битного трансивера, который имеет два двунаправленных входа данных – a и b. Асинхронный, активный по низкому уровню порт разрешения выходов oe_n. Порт направления dir. Когда oe_n = 0 и dir = 0, данные передаются из b в a; если oe_n = 0 и dir = 1, то данные передаются с a на b. Если oe_n = 1, то a и b имеют значение высокого импеданса. 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 12 hahanova@mail.ru
  • Контрольные вопросы и задания.21. Нарисовать схему, соответствующую следующему оператору generate: generate genvar stage for (stage = 1; stage <= 4; stage = stage +1) begin: Ui d_ff delay_ff (.clk(sys_clk), .d(delayed_data[stage-1]), .q(delayed_data[stage])); end endgenerate2. Создать условный оператор generate, который соединяет переменную external_clk с сигналом internal_clk, если параметр positive_clk = 1. В противном случае на линию internal_clk подается инверсное значение external_clk. 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 13 hahanova@mail.ru
  • Контрольные вопросы и задания.31. Разработать структурную A0 модель устройства, состоящую из n C0 мультиплексоров 2-в-1, B0 соединенных параллельно. Sel Входами устройства являются сигнал ... управления Sel, два n- битовых вектора A и B. An-1 Выход описан n-битовым сектором C. Величина n Cn-1 определена с помощью Bn-1 директивы `define. 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 14 hahanova@mail.ru
  • Модель регистра с двунаправленной шинойmodule io2(data, read, write); inout [15:0] data; input read, write; reg [15:0] internal_reg; always @(posedge write) internal_reg = data; assign data = read ? internal_reg: 16bz ;endmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 15 hahanova@mail.ru
  • Оператор disablemodule disable1; initial begin do_it; $display("Finished do it at time %0d",$time); end initial begin #55 disable do_it; end task do_it; forever #10 $display("doing it at time %0d",$time); endtaskendmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 16 hahanova@mail.ru
  • Mux with Parameterized Width and Number of Inputsmodule muxMto1 (Z, SEL, D);parameter N = 8; // number of bits wideparameter M = 4; // number of inputsparameter S = 2; // number of select linesparameter W = M * N;`define DTOTAL W-1:0`define DWIDTH N-1:0`define SELW S-1:0`define WORDS M-1:0input [` DTOTAL] D;input [` SELW] SEL;output [` DWIDTH] Z;integer i;reg[`DWIDTH] tmp, Z; // tmp will be use to minimize eventsalways @(SEL or D) beginfor(i=0; i < N; i = i + 1) // for bits in the widthtmp[i] = D[N*SEL + i];Z = tmp;endendmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 17 hahanova@mail.ru
  • Параметризируемый модуль // параметризируемый n-битовый сумматорmodule nadder(cout,sum, a,b,cin);// Размер по умолчанию 32 бита #(parameter size = 32) (output cout, output [size-1 :0] sum, input [size-1 : 0] a,b, input cin); assign {cout,sum} = a + b + cin;endmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 18 hahanova@mail.ru
  • Использование параметризируемого модуляmodule use_defparam; wire [4:0] a5, b5, c5; // some 5 bit wires wire [31:0] a32, b32, c32; // some 32 bit wires wire [127:0] biga, bigb, bigc; // some 128 bit wires wire x,y,z; // create some instances of the n bit adder nadder a1 (z,a5,b5,c5,x); nadder a2 (z,a32,b32,c32,x); nadder a3 (z,biga,bigb,bigc,x); defparam a1.size = 5; defparam a3.size = 128;endmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 19 hahanova@mail.ru
  • module mux4caa( y, sel, a, b, c, d); output [3:0] y; input [3:0] a, b, c, d; input [1:0] sel; assign y = (sel == 2b00) ? a : (sel == 2b01) ? b : (sel == 2b10) ? c : d;endmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 20 hahanova@mail.ru
  • Сумматорmodule adder8ca(carry_out, sum, a, b, carry_in); output carry_out; output [7:0] sum; input [7:0] a, b ; input carry_in; assign {carry_out,sum} = a + b + carry_in;endmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 21 hahanova@mail.ru
  • Мультиплексор через assign и функциюmodule mux4caf( y, sel, a, b, c, d) ; output [3:0] y; input [3:0] a, b, c, d; input [1:0] sel; assign y = muxf(a, b, c, d, sel); function [3:0] muxf; input [3:0] a, b, c, d; input [1:0] sel; case (sel) 0: muxf = a; 1: muxf = b; 2: muxf = c; 3: muxf = d; endcase endfunctionendmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 22 hahanova@mail.ru
  • Счетчик (не синтезируемый)module counterf(clock, out); input clock; output [7:0] out; reg [7:0] out;initial begin out = 0; forever @(posedge clock) out <= #(`REG_DELAY) out + 1; endendmodule 21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: 23 hahanova@mail.ru