Рисунок 7 – Моделирование функционального блока в режиме Functional
1.5 КОД НА HDL
Ниже представлен код на System Verilog:
module lab8_code (
input logic RD, Reset, C_ext, C_int, input logic [1:0] C,
input logic D, output logic C_out,
output logic [4:0] outData );
logic CLN, RST, resetOut, start; logic [1:0] code;
logic [7:0] data; logic [4:0] count; logic [4:0] F; logic [2:0] OP1; logic [3:0] OP2; logic [4:0] result;
logic [2:0] AddrCode; reg[1:0] state;
assign CLN = RST | resetOut;
assign OP1[2] = ~(data[5] ^ data[2]); assign OP1[1] = ~(data[4] ^ data[1]); assign OP1[0] = ~(data[3] ^ data[0]); assign OP2 = data[5:3] + data[2:0];
always_ff@(posedge C_ext, posedge CLN) begin
if (CLN) begin
AddrCode <= 3'b000; RST <= 0;
end
else if (Reset) RST = 1'b1; else
begin
AddrCode <= AddrCode + 1; RST <= 0;
end
end
always_ff@(posedge C_ext, posedge RST) if (RST) data = 8'b00000000;
else data[7:0] = {data[6:0], D};
always_ff@(posedge RD, posedge RST) if (RST) count = 5'b00000;
else count = count + 1;
always_ff@(posedge C_int, posedge CLN) if(CLN) start = 1'b0;
else if(RD) start = 1'b1;
always_ff@(posedge C_int, posedge resetOut) if(resetOut)
begin
resetOut <= 1'b0; state <= 0; C_out <= 1'b0;
end else
case(state) 0: begin
if (start) begin C_out <= 1'b1; state <= 1; end
end
1: begin
C_out <= 1'b0; state <= 2; end
2: begin
resetOut <= 1'b1; state <= 3;
end
default: state <= 0; endcase
always_comb begin
case(AddrCode)
3'b000: code = data[7:6];
3'b001: code = {data[0], data[7]}; 3'b010: code = data[1:0];
3'b011: code = data[2:1]; 3'b100: code = data[3:2]; 3'b101: code = data[4:3]; 3'b110: code = data[5:4]; 3'b111: code = data[6:5]; endcase;
end
always_comb begin case(data[3:0]) 4'b0000: F = 5'b01010; 4'b0001: F = 5'b01011; 4'b0010: F = 5'b10010; 4'b0011: F = 5'b10011; 4'b0100: F = 5'b01110; 4'b0101: F = 5'b01111; 4'b0110: F = 5'b10110; 4'b0111: F = 5'b10111; 4'b1000: F = 5'b01001; 4'b1001: F = 5'b11001; 4'b1010: F = 5'b11010; 4'b1011: F = 5'b11011; 4'b1100: F = 5'b01101; 4'b1101: F = 5'b11101; 4'b1110: F = 5'b11110; 4'b1111: F = 5'b10101; endcase;
end
always_ff@(negedge C_out, posedge RST) begin if(RST) outData = 5'b00000;
else
begin case(code)
2'b00: outData = count; 2'b01: outData = F;
2'b10: outData = {2'b0, OP1[2:0]}; 2'b11: outData = {1'b0, OP2[3:0]}; endcase;
end
end
endmodule
На рисунке 8 изображено RTL Viewer представления устройства:
Рисунок 8 – RTL Viewer представление
На рисунке 9 представлено моделирование схемы, описанной с помощью HDL, в режиме Timing. В промежуток 0-720нс промоделирована работа первого сигнала, 760-1460нс – второго, 1480-2310нс – третьего, 23203160нс – четвертого, 3160-3990нс – пятого, 4040-4850нс – шестого, 49205240нс – седьмого, 5400-5480 нс – восьмого и 5560-6000нс – девятого.
Рисунок 9 – Моделирование в режиме Timing
На рисунке 10 представлено моделирование схемы в режиме Functional.
Рисунок 10 – Моделирование в режиме Functional
Заключение
В результате выполнения лабораторной работе были получены навыки совместного применения устройства средней степени интеграции.
Была разработана обобщенная функциональная схема устройства,
описана схема с помощью HDL, промоделирована схема в двух режимах.
Отчет был оформлен согласно ОС ТУСУР 01–2021.