end else begin
res = 2'b00;
end
s2:
if (data) begin
res = 2'b10;
end else begin
res = 2'b01;
end
s3:
if (data) begin
res = 2'b11;
end else begin
res = 2'b00;
end
endcase
end
endmodule
Код модели автомата Мура на языке Verilog HDL
module moore (input c, data, reset, output reg [1:0] res);
reg [1:0] conditional;
parameter s0 = 0, s1 = 1, s2 = 2, s3 = 3;
always @ (state) begin
76
case (conditional) s0:
res = 2'b01;
s1:
res = 2'b10;
s2:
res = 2'b11;
s3:
res = 2'b00; default:
res = 2'b00;
endcase
end
always @ (posedge c or posedge reset) begin if (reset)
conditional <= s0;
else
case (conditional) s0:
state <= S1;
s1:
if (data)
state <= S2;
else
state <= S1;
s2:
if (data)
state <= S3;
else
state <= S1;
s3:
if (data)
state <= S2;
else
state <= S3;
endcase
end
endmodule
77
ПРИЛОЖЕНИЕ 5
Пример использования IP ядра Divider Generator для вывода двоичного числа от 00 до 99 в десятичном виде на 7- ми сегментный индикатор отладочной платы Spartan 3 Starter Kit [4].
`timescale 1ns / 1ps
module top( input [7:0] data, input c, output reg [6:0] code, output [3:0] stb);
wire clk_in;
reg [19:0] div; reg c_out = 0;
always @ (posedge c) begin
if (div == 100000) begin
div <= 0;
c_out <= ~c_out ; end
else
div <= div+1;
end
assign clk_in = c_out;
reg [1:0] sh_reg = 1; wire [7:0] digit0; wire [7:0] digit1; wire [7:0] data_10;
78
reg [6:0] digit0_code; reg [6:0] digit1_code;
//IP ядро для реализации операции деления.
div10 u_div10_1(.clk(clk_in), .dividend(data), .divisor(8'hA),
.quotient(data_10), .fractional());
div10 u_div10_2(.clk(clk_in), .dividend(data), .divisor(8'hA),
.quotient(), .fractional(digit0));
div10 u_div10_3(.clk(clk_in), .dividend(data_10), .divisor(8'hA),
.quotient(), .fractional(digit1));
always @ (posedge clk_in) begin
case(digit0)
8'h00 : digit0_code <= 7'b0000001; 8'h01 : digit0_code <= 7'b1001111; 8'h02 : digit0_code <= 7'b0010010; 8'h03 : digit0_code <= 7'b0000110; 8'h04 : digit0_code <= 7'b1001100; 8'h05 : digit0_code <= 7'b0100100; 8'h06 : digit0_code <= 7'b0100000; 8'h07 : digit0_code <= 7'b0001111; 8'h08 : digit0_code <= 7'b0000000; 8'h09 : digit0_code <= 7'b0000100; default : digit0_code <= 0;
endcase
case(digit1)
8'h00 : digit1_code <= 7'b0000001; 8'h01 : digit1_code <= 7'b1001111; 8'h02 : digit1_code <= 7'b0010010;
79
8'h03 : digit1_code <= 7'b0000110; 8'h04 : digit1_code <= 7'b1001100; 8'h05 : digit1_code <= 7'b0100100; 8'h06 : digit1_code <= 7'b0100000; 8'h07 : digit1_code <= 7'b0001111; 8'h08 : digit1_code <= 7'b0000000; 8'h09 : digit1_code <= 7'b0000100; default : digit1_code <= 0;
endcase
sh_reg = ~sh_reg;
case(sh_reg)
2'b01 : code_out <= digit0_code; 2'b10 : code_out <= digit1_code; default : code_out <= 0;
endcase
end
assign stb[1:0] = sh_reg; assign stb[3:2] = 2'b11;
endmodule
Содержимое файла пользовательских ограничений
NET "code_out[0]" LOC = N16;
NET "code_out[1]" LOC = F13;
NET "code_out[2]" LOC = R16;
NET "code_out[3]" LOC = P15;
NET "code_out[4]" LOC = N15;
NET "code_out[5]" LOC = G13;
NET "code_out[6]" LOC = E14;
80