1. 8. Синтезируемые Verilog-
модели цифровых устройств
Автоматизация проектирования
компьютерных систем
Хаханова И.В, каф.АПВТ, ХНУРЭ e-
13.03.2011 mail: hahanova@mail.ru 1
2. Цель лекции и содержание
Цель – изучить принципы построения
синтезируемых моделей цифровых
устройств на Verilog
План
Модели комбинационных устройств
Арифметические устройства
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 2
e-mail: hahanova@mail.ru
4. Мультиплексор 4 в 1 с использованием IF
module mux (input a,b,c,d, input [1:0] s, output reg o);
always @(a, b, c, d, s) [0]
begin [1]
if (s == 2'b00) o = a; o6
else if (s == 2'b01) oa= b;
else if (s == 2'b10) o = c; e
d
else o = d; [0]
[1] e
end o7
d
o
e
endmodule c
d
b e
d d
o
[1]
[1]
[1:0] [0]
s[1:0]
o8 un1_s_1
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 4
e-mail: hahanova@mail.ru
5. Мультиплексор 4 в 1 с использованием
CASE
module mux
(input a,b,c,d, input [1:0] s,
output reg o); [0]
[1]
always @(a, b, c, d, s) o6
begin
a
case (s)
e
2'b00 : o = a; [0]
d
[1] e
2'b01 : o = b; d
o
o7 e
2'b10 : o = c; d
c
default : o = d; b e
d d
endcase [1] o
[1:0] [0]
s[1:0] [1]
end o8 un1_o8
endmodule
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 5
e-mail: hahanova@mail.ru
6. Мультиплексор на тристабильных буферах
[3:0] [3]
s[3:0]
module mux a o
(input a,b,c,d, un3_o
input [3:0] s, [2]
output o); b
un8_o
assign o = s[3] ? a :1'bz; [1]
assign o = s[2] ? b :1'bz; c
un13_o
assign o = s[1] ? c :1'bz;
assign o = s[0] ? d :1'bz; [0]
d
endmodule
un18_o
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 6
e-mail: hahanova@mail.ru
9. Дешифратор на операторе case
00
res[7:0]
module mux (sel, res);
[0]
(input [2:0] sel, [2:0]
[2]
[1]
sel[2:0]
output reg [7:0] res); res35
always @(sel, res) [2]
case (sel)
[0]
[1]
res34
3'b000 : res = 8'b00000001;
3'b001 : res = 8'b00000010; [0]
[1]
3'b010 : res = 8'b00000100; [2]
res33
3'b011 : res = 8'b00001000;
3'b100 : res = 8'b00010000; [1]
[0]
[2]
3'b101 : res = 8'b00100000; res32
// 110 and 111 selector values are unused
[0]
default : res = 8'bxxxxxxxx; [1]
[2]
endcase res31
endmodule [0]
[1]
[2]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ res30 9
e-mail: hahanova@mail.ru
10. Устройства сдвига
Xilinx проектирует логические схемы сдвига как комбинационную схему
с двумя входами и 1 выходом
Первый вход - сдвигаемые данные
Второй вход - определяет число разрядов, на которые выполняется
сдвиг
На выход поступает результат операции сдвига.
Следует использовать один тип операции сдвига.
Значение n для операции сдвига должно увеличиваться или
уменьшаться только на 1 для каждого последующего двоичного
значения селектора.
Значение n может быть только положительным
Все значения селектора должны присутствовать
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 10
e-mail: hahanova@mail.ru
11. Комбинационное устройство сдвига 1
module lshift
(input [7:0] DI, input [1:0] SEL,
output reg [7:0] SO);
always @(DI, SEL)
case (SEL)
2'b00 : SO <= DI;
2'b01 : SO <= DI << 1;
2'b10 : SO <= DI << 2;
default : SO <= DI << 3;
endcase
endmodule
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 11
e-mail: hahanova@mail.ru
12. Комбинационное устройство сдвига 2
[0]
[1]
SO21
e
[7:0]
d
[0]
[1] e
[6:0]
d [7:0] [7:0]
=0 SO[7:0]
SO22 e
[7:0] [5:0] d
DI[7:0]
=00
e
d
[4:0]
=000
[1] SO[7:0]
[1:0] [0]
SEL[1:0] [1]
SO23 un1_SO23
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 12
e-mail: hahanova@mail.ru
13. Арифметические устройства
Сумматоры:
С переносом из младшего разряда
С переносом в старший разряд
С переносом из младшего и в старший разряд
Устройство вычитания
Сумматор/вычитатель
Компаратор (=, /=,<, <=, >, >=)
Устройство умножения
Устройство деления
Сложение, вычитание, сравнение и умножение разрешено для
знаковых и беззнаковых чисел
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 13
e-mail: hahanova@mail.ru
14. Сумматор (беззнаковый) 1
Без переноса С переносом из мл. раз.
module adder module adder
(input [7:0] A, B, input CI,
(input [7:0] A, B,
output [7:0] SUM);
output [7:0] SUM);
assign SUM = A + B + CI;
assign SUM = A + B; endmodule
endmodule
[7:0] [7:0]
[7:0] [7:0]
A[7:0]
A[7:0]
[7:0] [7:0]
+ [7:0] [7:0]
SUM[7:0] B[7:0]
[7:0] [7:0]
+ [7:0] [7:0]
SUM[7:0]
B[7:0]
SUM_1[7:0] CI
SUM_1[7:0]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 14
e-mail: hahanova@mail.ru
15. Сумматор (беззнаковый) 2
с переносом в ст. разр.
module adder
(input [7:0] A, B, output [7:0] SUM, output CO);
wire [8:0] tmp;
assign tmp = A + B;
assign SUM = tmp [7:0];
assign CO = tmp [8];
endmodule
[7:0] [7:0]
A[7:0]
[7:0] [7:0]
+ [8:0] [7:0] [7:0] [7:0]
SUM[7:0]
B[7:0]
tmp[8:0] SUM[7:0]
[8]
CO
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 15
e-mail: hahanova@mail.ru
16. Сумматор (беззнаковый) 3
module adder
(input CI, input [7:0] A, B,
output [7:0] SUM, output CO);
wire [8:0] tmp;
assign tmp = A + B + CI;
assign SUM = tmp [7:0];
assign CO = tmp [8];
endmodule
[7:0] [7:0]
A[7:0]
B[7:0]
[7:0] [7:0]
+ [8:0] [7:0] [7:0] [7:0]
SUM[7:0]
CI SUM[7:0]
tmp[8:0]
[8]
CO
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 16
e-mail: hahanova@mail.ru
17. Сумматор (знаковый)(XST)
Для прог. синтеза XST
module adder
(input signed [7:0] A, B, output signed [7:0]
SUM);
assign SUM = A + B;
endmodule
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 17
e-mail: hahanova@mail.ru
18. Устройство вычитания
module subtr
(input [7:0] A, B, output [7:0] RES);
assign RES = A - B;
endmodule
[7:0] [7:0]
A[7:0]
B[7:0]
[7:0] [7:0]
+ [7:0] [7:0]
RES[7:0]
1
RES_1[7:0]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 18
e-mail: hahanova@mail.ru
21. Устройство деления
Поддерживается деление на константу
степени 2
module divider(DI, DO);
input [7:0] DI; output [7:0] DO;
assign DO = DI / 2;
endmodule
=0
DO[7:0]
[7:0] [7:1]
DI[7:0]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 21
e-mail: hahanova@mail.ru
22. Совместное использование ресурсов
(Resource Sharing)
Цель уменьшить размер схемы основываясь
на принципе, что два подобных
арифметических ресурса могут быть
реализованы на одной схеме, если она
никогда не используется ими одновременно
XST поддерживает совместное использование
ресурсов для сумматоров, вычитателей,
сумматоров/вычитателей и умножителей.
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 22
e-mail: hahanova@mail.ru
23. Совместное использование ресурсов
module addsub
(input OPER,
input [7:0] A, B, C,
output reg [7:0] RES);
always @(A, B, C, OPER)
if (OPER==1'b0) RES = A + B;
else RES = A - C;
endmodule
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 23
e-mail: hahanova@mail.ru
26. Триггеры 1
module flop Задний фронт синхронизации и
асинхронный сброс
(input C, D, module flop
(input C, D, CLR,
output reg Q);
output reg Q);
always @(posedge C) always @(negedge C, posedge CLR)
Q = D; if (CLR) Q = 1’b0;
else Q = D;
endmodule endmodule
C
C D D Q Q
D D Q Q R
Q CLR
Q
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 26
e-mail: hahanova@mail.ru
27. Триггеры 2
Передний фронт Передний фронт
синхронизации и синхронная синхронизации и сигнал
установка в 1 разрешения синхронизации
module flop CE
(input C, D, S, module flop
output reg Q); (input C, D, CE,
always @(posedge C)
output reg Q);
if (S) Q = 1’b1;
always @(posedge C)
else Q = D;
if (CE) Q = D;
endmodule
endmodule
C
D D Q Q C
S S D D Q Q
CE E
Q
Q
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 27
e-mail: hahanova@mail.ru
28. Триггеры-защелки
module latch module latch
(input G, D, (input G, D, CLR, output reg
Q);
output reg Q);
always @(G, D, CLR)
always @(G, D) if (CLR)
if (G) Q = D; Q = 1'b0;
endmodule else if (G)
Q = D;
lat endmodule latr
D D
Q Q D D
G C
G C Q Q
Q CLR R
Q
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 28
e-mail: hahanova@mail.ru
33. 8-битовый сдвиговый регистр с
последовательными входом и выходами
module shift
(input C,SI, output SO);
reg [7:0] tmp;
always @(posedge C) begin
tmp = tmp << 1;
tmp[0] = SI;
end
assign SO = tmp[7];
C
endmodule
[6:0] [7:0] [7]
D[7:0] Q[7:0] SO
SI
tmp[7:0]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 33
e-mail: hahanova@mail.ru
34. 8-битовый сдвиговый регистр с последовательными
входом и выходами, с входом разрешения
module shift
(input C,SI, CE, output SO);
reg [7:0] tmp;
always @(negedge C)
if (CE) begin
tmp = tmp << 1;
tmp[0] = SI; C
end
assign SO = tmp[7]; [6:0]
D[7:0] Q[7:0]
[7]
SO
[7:0]
endmodule SI E
CE
tmp[7:0]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 34
e-mail: hahanova@mail.ru
35. 8-битовый сдвиговый регистр со сбросом
module shift
(input C,SI,CLR, output SO);
reg [7:0] tmp;
always @(posedge C, posedge CLR)
if (CLR) tmp = 8'b00000000;
elsetmp = {tmp[6:0], SI};
assign SO = tmp[7]; C
endmodule [6:0] [7:0] [7]
D[7:0] Q[7:0] SO
SI R
CLR
tmp[7:0]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 35
e-mail: hahanova@mail.ru
38. Представление автомата Мили и Мура
Reset
Функция Регистр Функция
Выходы
переходов состояний выходов
Входы Clock
Только для автомата Мили
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 38
e-mail: hahanova@mail.ru
40. Пример описания автомата
Двух-блоковая модель 1
module FSM1_synplify
(input clk, rst, enable, input [2:0] data_in,
output data_out, state0, state1, state2);
/* Определены метки состояний*/
parameter deflt=3'bxxx; parameter idle=3'b001;
parameter read=3'b010; parameter write=3'b100;
reg data_out, state0, state1, state2;
reg [2:0] state, next_state;
/* Блок Always для последовательностной логики*/
always @(posedge clk, negedge rst)
if (!rst) state <= idle;
else state <= next_state;
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 40
e-mail: hahanova@mail.ru
41. Пример описания автомата
Двух-блоковая модель 2
/* Блок Always для комбинационной логики*/
always @(state, enable, data_in) begin
/* Значения по умолчанию для выходов автомата FSM*/
state0 <= 1'b0; state1 <= 1'b0; state2 <= 1'b0; data_out <= 1'b0;
case (state)
idle : if (enable) begin
state0 <= 1'b1; data_out <= data_in[0];
next_state <= read; end
else next_state <= idle;
read : if (enable) begin
state1 <= 1'b1; data_out <= data_in[1];
next_state <= write; end
else next_state <= read;
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 41
e-mail: hahanova@mail.ru
42. Пример описания автомата
Двух-блоковая модель 3
write : if (enable) begin
state2 <= 1'b1;
data_out <= data_in[2];
next_state <= idle;
end
else next_state <= write;
/* Default assignment for simulation*/
default : next_state <= deflt;
endcase
end
endmodule
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 42
e-mail: hahanova@mail.ru
43. Двух-блоковая модель
Результат синтеза
[0]
state0
statemachine
enable I state0
[2:0]
clk C Q[2:0]
rst R
e
[0]
d
e
state[2:0] 0
d
[1] data_out
e
[1]
d
state1 e
[2]
[2:0] d
data_in[2:0]
data_out
state1
[2]
state2
state2
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 43
e-mail: hahanova@mail.ru
45. Пример модели автомата
с одним блоком 1
module fsm_1xst
(input clk, reset, x1,
output reg outp);
reg [1:0] state;
parameter s1 = 2'b00;
parameter s2 = 2'b01;
parameter s3 = 2'b10;
parameter s4 = 2'b11;
always @(posedge clk, posedge reset)
begin
if (reset) begin
state = s1; outp = 1'b1;
end
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 45
e-mail: hahanova@mail.ru
46. Пример модели автомата
с одним блоком 2
else begin s3: begin state = s4;
case (state) outp = 1'b0;
s1: begin end
if (x1==1'b1) state = s2; s4: begin state = s1;
else state = s3; outp = 1'b0;
outp = 1'b1; end
end endcase
s2: begin state = s4; end
outp = 1'b1; end
end endmodule
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 46
e-mail: hahanova@mail.ru
47. Пример модели автомата
Результаты синтеза
Модель с одним блоком
[0]
e
statemachine 0
d
x1 I [1]
[3:0] e S
clk C Q[3:0] 0
d
reset R D Q outp
[2]
e
1
d outp s4
[3]
state[3:0] e
1
d
un1_state[1]
Модель с двумя блоками s2 s3
[0]
e
statemachine 0
d s1
x1 I [1]
[3:0] e
clk C Q[3:0] 0
d
reset R outp
[2]
e
1
d un1_un1_state[1]
state[3:0] [3]
e
1
d
un1_state[1]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 47
e-mail: hahanova@mail.ru
48. Модель памяти с асинхронным чтением
module raminfr
(input clk, we, input [4:0] a, input [3:0] di,
output [3:0] do); ram1
[4:0]
reg [3:0] ram [31:0]; di[3:0] RADDR[4:0]
[3:0] [3:0]
DATA[3:0]
[3:0] [3:0]
[4:0] [4:0] DOUT[3:0] do[3:0]
a[4:0] WADDR[4:0]
we WE
clk CLK
always @(posedge clk)
ram[3:0]
if (we) ram[a] <= di;
assign do = ram[a];
endmodule
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 48
e-mail: hahanova@mail.ru
49. Модель памяти с синхронным чтением
module raminfr (input clk, we, input [4:0] a,
input [3:0] di, output [3:0] do);
reg [3:0] ram [31:0]; reg [4:0] read_a;
always @(posedge clk) begin
if (we) ram[a] <= di;
read_a <= a;
end
assign do = ram[read_a];
endmodule
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 49
e-mail: hahanova@mail.ru
50. Модель двухпортовой памяти с
асинхронным чтением
module raminfr
(input clk, we, input [4:0] a, dpra, input [3:0] di,
output [3:0] spo, dpo); ram1
reg [3:0] ram [31:0];
[4:0] [4:0]
dpra[4:0] RADDR[4:0]
[3:0] [3:0]
di[3:0] DATA[3:0]
[3:0] [3:0]
[4:0] [4:0] DOUT[3:0] dpo[3:0]
a[4:0] WADDR[4:0]
always @(posedge clk) begin we
clk
WE
CLK
if (we) ram[3:0]
ram[a] <= di;
end ram1
[4:0]
RADDR[4:0]
[3:0]
DATA[3:0]
[3:0] [3:0]
assign spo = ram[a]; [4:0]
WADDR[4:0]
WE
DOUT[3:0] spo[3:0]
assign dpo = ram[dpra]; CLK
endmodule ram_1[3:0]
13.03.2011 Хаханова И.В, каф.АПВТ, ХНУРЭ 50
e-mail: hahanova@mail.ru