Создание модели накопителя АЗУ на языке C++
Рабочее задание:
1. При помощи любого известного Вам средства моделирования (или языка программирования) создать модель накопителя АЗУ размером 2n+1x2N-n+1 ячеек, где N=24, n=1.
2. Продемонстрировать работоспособность модели преподавателю.
3. Провести моделирование спроектированного накопителя(заполнение накопителя случайными и заданными данными, а также данными из файла).
4. Дополнить модель необходимыми блоками для реализации сложного ассоциативного поиска. Провести моделирование. Необходимо провести поиск минимума.
5. Результаты моделирования оформить в виде отчета
Теоретический материал:
1. Поиск минимума/максимума:
Поиск минимума производится путём поразрядного сравнения каждого слова накопителя с нулём и выявления тех строк, в которых данный разряд равен нулю. Сравнение начинается со старших разрядов, и в каждом последующем действии участвуют только те строки, в которых все предыдущие сравнения дали положительный результат. Таким образом, в результате, останутся строки, в которых находится минимум. Для максимума актуальны те же действия, только поразрядное сравнение происходит с единицей.
Поиск заканчивается после 16777 тактов. По окончанию поиска данные из найденной строки копируются в выходной регистр.
2. График зависимости количества тактов поиска от разрядности слов:
Рассмотрим работу программы.
Модель спроектированного накопителя АЗУ выглядит так
В программе предусмотрена обработка ситуации, которая может привести к ошибке: если во всех обрабатываемых на данном этапе строках записаны 1, то в таком случае в память фиксации реакций вместо обнуления всех строк останутся прежние данные.
Найдем минимум:
Выводы
В смоделированной программе мы можем работать как и с отдельной ячейкой, так и с целым ЗУ. Ассоциативная среда позволяет совместить операции хранения и обработки данных. И это позволяет избежать всё возрастающей разницы в производительности между процессором и памятью.
Код программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;type
TForm1 = class(TForm)
GroupBox2: TGroupBox;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
StringGrid3: TStringGrid;
StringGrid4: TStringGrid;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
CheckBox4: TCheckBox;
CheckBox5: TCheckBox;
CheckBox6: TCheckBox;
Button2: TButton;
Button4: TButton;
Button5: TButton;
Button7: TButton;
Button1: TButton;
StringGrid5: TStringGrid;
Label4: TLabel;
StringGrid6: TStringGrid;
StringGrid7: TStringGrid;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
trigger:integer;
mas:array[1..5,1..16778]of byte;
p:array[1..5]of byte;
exit:boolean;
implementationuses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
randomize;
exit:=false;
trigger:=-1;
for i:=1 to 5 do
for j:=1 to 16778 do
begin
StringGrid1.Cells[j-1,i-1]:=IntToStr(0);
mas[i,j]:=0;
end;
//———————————————
for j:=1 to 16778 do
StringGrid2.Cells[j-1,0]:=IntToStr(0);
//———————————————
for j:=1 to 16778 do
StringGrid3.Cells[j-1,0]:=IntToStr(0);
//———————————————
for j:=1 to 5 do
StringGrid4.Cells[0,j-1]:=IntToStr(0);end;
procedure TForm1.Button1Click(Sender: TObject);
var i,j,k,t,i0:integer; temp,temp2:array[1..4]of byte; flag,flagvixoda:boolean;
begin
for i:=1 to 4 do p[i]:=1;
flagvixoda:=false; t:=0;for j:=1 to 16778 do
begin
flag:=false;
StringGrid2.Cells[j-1,0]:=IntToStr(1);
for i:=1 to 4 do begin temp[i]:=0; temp2[i]:=0;end;
if flagvixoda=false then
begin
//—————-
for i:=1 to 4 do
begin
StringGrid2.Cells[j-1,0]:=IntToStr(0);
if (StrToInt(StringGrid1.Cells[j-1,i-1])=0)and(p[i]<>0) then
begin
temp[i]:=1;
flag:=true;
end;
end;if(flag=false) then
for i:=1 to 4 do
if (p[i]=1) then begin temp2[i]:=1;inc(t);end;if(t=0) then
begin
//—————-
if flag=true then
for k:=1 to 4 do
if p[k]=1 then begin p[k]:=temp[k]; end;
end
//—————-
else t:=0;for k:=1 to 4 do t:=t+p[k];
if(t=0) then
begin
flagvixoda:=true;
end;t:=0;
flag:=false;
StringGrid2.Cells[j-1,0]:=IntToStr(1);
for i:=1 to 4 do
begin
StringGrid5.Cells[0,i-1]:=IntToStr(p[i]);
StringGrid6.Cells[0,i-1]:=IntToStr(temp2[i]);
if(p[i]=1) then begin i0:=i;end;
end;
//ShowMessage(‘LLIar= ‘+IntToStr(j));
end;
end;
for j:=1 to 16778 do
StringGrid7.Cells[j-1,0]:=StringGrid1.Cells[j-1,i0-1];// ShowMessage(‘OTBET=’+IntToStr(i0));
end;procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer; F1:textfile; temp:byte; error:boolean;
begin
error:=false;
if(CheckBox4.Checked=true)and(CheckBox5.Checked=false)and(CheckBox6.Checked=false) then
for i:=1 to 5 do
for j:=1 to 16778 do
begin
mas[i,j]:=0;
StringGrid1.Cells[j-1,i-1]:=IntToStr(0);
end
else if (CheckBox4.Checked=true)and(CheckBox5.Checked=true)or
(CheckBox4.Checked=true)and(CheckBox6.Checked=true) then begin
ShowMessage(‘HeBepHo 3agaHo ycJIoBue’); error:=true; end;
if(CheckBox5.Checked=true)and(CheckBox4.Checked=false)and(CheckBox6.Checked=false)and(error=false)then
begin
assignFile(F1,’file.txt’);
Reset(F1);
for i:=1 to 5 do
for j:=1 to 16778 do
begin
Read(F1,temp);
StringGrid1.Cells[j-1,i-1]:=IntToStr(temp);
mas[i,j]:=temp;
end
end
else if(CheckBox5.Checked=true)and(CheckBox6.Checked=true)and(error=false)or
(CheckBox5.Checked=true)and(CheckBox4.Checked=true)and(error=false) then begin
ShowMessage(‘HeBepHo 3agaHo ycJIoBue’); error:=true; end;
if(CheckBox6.Checked=true)and(CheckBox4.Checked=false)and(CheckBox5.Checked=false)and(error=false)then
for i:=1 to 5 do
for j:=1 to 16778 do
begin
temp:=random(2);
StringGrid1.Cells[j-1,i-1]:=IntToStr(temp);
mas[i,j]:=temp;
end
else if (CheckBox6.Checked=true)and(CheckBox4.Checked=true)and(error=false)or
(CheckBox6.Checked=true)and(CheckBox5.Checked=true)and(error=false)then begin
ShowMessage(‘HeBepHo 3agaHo ycJIoBue’); error:=true; end;for i:=1 to 5 do
for j:=1 to 16778 do
begin
if (StrToInt(StringGrid1.Cells[j-1,i-1])=1) then
begin
StringGrid3.Cells[j-1,0]:=IntToStr(1);
StringGrid4.Cells[0,i-1]:=IntToStr(1);
end;if (StrToInt(StringGrid1.Cells[j-1,i-1])=0) then
begin
StringGrid2.Cells[j-1,0]:=IntToStr(1);
end;
StringGrid2.Cells[j-1,0]:=IntToStr(0);
end;
end;procedure TForm1.Button3Click(Sender: TObject);
var F1:textfile;
r:byte; i,j:integer;
begin
assignFile(F1,’file.txt’);
ReWrite(F1);
for i:=1 to 5 do
for j:=1 to 16778 do
begin
r:=random(2);
write(f1,r);
write(f1,’ ‘);
end;
closeFile(F1);
end;procedure TForm1.Button4Click(Sender: TObject);
begin
Close;
end;procedure TForm1.Button5Click(Sender: TObject);
var i,j:integer;
begin
for j:=1 to 16778 do
if (StrToInt(StringGrid3.Cells[j-1,0])=0) then
for i:=1 to 5 do
begin
if (StrToInt(StringGrid4.Cells[0,i-1])=1) then
begin
StringGrid1.Cells[j-1,i-1]:=IntToStr(0);
mas[i,j]:=0;
end;
end; // D1=0 D0=0
//———————————————
for j:=1 to 16778 do
if (StrToInt(StringGrid2.Cells[j-1,0])=1) then
for i:=1 to 5 do
begin
if (StrToInt(StringGrid4.Cells[0,i-1])=1) then
begin
StringGrid1.Cells[j-1,i-1]:=IntToStr(1);
mas[i,j]:=1;
end;
end; // M=1 => D1=1 D0=0
//———————————————
for i:=1 to 5 do
if (StrToInt(StringGrid4.Cells[0,i-1])=1) then
for j:=1 to 16778 do
begin
if (StrToInt(StringGrid3.Cells[j-1,0])=1) then
begin
StringGrid1.Cells[j-1,i-1]:=IntToStr(1);
mas[i,j]:=1;
end
else
begin
if not(StrToInt(StringGrid2.Cells[j-1,0])=1) then
StringGrid1.Cells[j-1,i-1]:=IntToStr(0);
mas[i,j]:=0;
end;
end; // Ai=1
//———————————————
end;procedure TForm1.Button7Click(Sender: TObject);
begin
Form3.Show;
end;end.