Помощь в написании студенческих работ
Антистрессовый сервис

Структура программы. 
Разработка АЛУ на микросхеме ПЛИС

РефератПомощь в написанииУзнать стоимостьмоей работы

Output flagZ, flagO, flagN; Divide (res, xdata, ydata); Operation_RS=Operation_RS; If ((x>0 && y>0)||(x0)). If ((x>0 && y<0)||(x0)). Always @(posedge clock). Output Operation_not; Output Operation_and; O = (ydata==0)? 1: 0; Parameter numbits=3; Output Operation_or; Output Operation_RS; If ((x==1)&&(y==1)). If ((x==1)&&(y==0)). If ((x==0)&&(y==1)). If ((x==0)&&(y==0)). Case (command_code). Z… Читать ещё >

Структура программы. Разработка АЛУ на микросхеме ПЛИС (реферат, курсовая, диплом, контрольная)

Программа имеет следующую структуру: главный модуль ALU ВЫЗЫВАЕТ задачи-обработчики операндов, т. е. соответствующие части программы, которые описывают соответствующую операцию. Задача вызывается главным модулем как функция с передачей соответствующих параметров главного модуля.

По результату вызова задачи главный модуль производит установку соответствующих флагов.

По положительному фронту сигнала clock результат и флаги подаются на выход устройства.

Тело программы

module ALU (command_code, xdata, ydata, clock, result, flagZ, flagO, flagN);

parameter numbits=3;

input [3:0] command_code;

input clock;

input [numbits:0] xdata, ydata;

output [2*numbits+1:0] result;

output flagZ, flagO, flagN;

reg [2*numbits+1:0] res;

reg z, o, n, temp;

task Disable;

output [2*numbits+1:0] Disable;

input [numbits:0] x, y;

begin.

y=x;

Disable=x;

end.

endtask.

task Summator;

output [2*numbits+1:0] Summator;

input [numbits:0] x, y;

input c_in;

integer i;

reg a, b, c, d, a1,b1,c1,bit, summa;

begin.

for (i=0; i<=numbits; i=i+1).

begin.

a= ~x[i]&y[i]&c_in;

b= ~x[i]&y[i]&~c_in;

c= c_in&x[i]&y[i];

d= x[i]&~y[i]&~c_in;

Summator[i]=a|b|c|d;

a1=x[i]&y[i]&~c_in;

b1=x[i]&~y[i]&c_in;

c1=~x[i]&y[i]&c_in;

bit=c|a1|b1|c1;

c_in=bit;

end.

Summator[numbits+1]=bit;

for (i=numbits+2; i<=2*numbits+1; i=i+1).

Summator[i]=0;

end.

endtask.

task Substance;

output [2*numbits+1:0] Substance;

input [numbits:0] x, y;

begin.

if (x>=y).

Substance=x-y;

else.

Substance=y-x;

end.

endtask.

task Multiple;

output [2*numbits+1:0] Multiple;

input [numbits:0] x, y;

begin.

if ((x>=0 && y>=0)||(x<=0 && y<=0)).

Multiple=x*y;

if ((x>0 && y<0)||(x0)).

Multiple=-x*y;

end.

endtask.

task Divide;

output [2*numbits+1:0] Divide;

input [numbits:0] x, y;

begin.

if (!y).

Divide='bx;

else.

begin.

if ((x>=0 && y>0)||(x<=0 && y<0)).

Divide= x/y;

if ((x>0 && y>0)||(x0)).

Divide=-x/y;

end.

end.

endtask.

task Operation_and;

output [2*numbits+1:0] Operation_and;

input [numbits:0] x, y;

integer i;

begin.

for (i=0; i<=numbits; i=i+1).

Operation_and[i]=x[i]&&y[i];

for (i=numbits+1; i<=2*numbits+1; i=i+1).

Operation_and[i]=0;

end.

endtask.

task Operation_or;

output [2*numbits+1:0] Operation_or;

input [numbits:0] x, y;

integer i;

begin.

for (i=0; i<=numbits; i=i+1).

Operation_or[i]=x[i]||y[i];

for (i=numbits+1; i<=2*numbits+1; i=i+1).

Operation_or[i]=0;

end.

endtask.

task Operation_not;

output [2*numbits+1:0] Operation_not;

input [numbits:0] x, y;

integer i;

begin.

y=x;

for (i=0; i<=numbits; i=i+1).

Operation_not[i]=~x[i];

for (i=numbits+1; i<=2*numbits+1; i=i+1).

Operation_not[i]=0;

end.

endtask.

task Operation_RS;

output [2*numbits+1:0] Operation_RS;

input [numbits:0] x, y;

integer i;

reg temp;

begin.

if ((x[0]==1)&&(y[0]==0)).

Operation_RS[0]=0;

if ((x[0]==0)&&(y[0]==1)).

Operation_RS[0]=1;

if ((x[0]==0)&&(y[0]==0)).

Operation_RS[0]=Operation_RS[0];

if ((x[0]==1)&&(y[0]==1)).

Operation_RS[0]=1;

for (i=1; i<=2*numbits+1; i=i+1).

Operation_RS[i]=0;

end.

endtask.

always @(posedge clock).

begin.

case (command_code).

'b0000:

begin.

Disable (res, xdata, ydata);

z = (res==0)? 1: 0;

if (res<0).

n=1;

else.

n=0;

o=0;

end.

'b0001:

begin.

Summator (res, xdata, ydata, 0);

z = (res==0)? 1: 0;

if (res<0).

n=1;

else.

n=0;

o=0;

end.

'b0010:

Begin.

Substance (res, xdata, ydata);

z = (res==0)? 1: 0;

if (xdata.

n=1;

else.

n=0;

o=0;

end.

'b0011:

begin.

Multiple (res, xdata, ydata);

z = (res==0)? 1: 0;

if (res<0).

n=1;

else.

n=0;

if ((xdata0)||(xdata>0&&ydata<0)).

n=1;

else.

n=0;

o=0;

end.

'b0100:

begin.

Divide (res, xdata, ydata);

o = (ydata==0)? 1: 0;

z = (res==0)? 1: 0;

if ((xdata0)||(xdata>0&&ydata<0)).

n=1;

else.

n=0;

end.

'b0101:

begin.

Operation_and (res, xdata, ydata);

z = (res==0)? 1: 0;

n=0;

o=0;

end.

'b0110:

begin.

Operation_or (res, xdata, ydata);

z = (res==0)? 1: 0;

n=0;

о=0;

end.

'b0111:

begin.

Operation_not (res, xdata, ydata);

z = (res==0)? 1: 0;

n=0;

o=0;

end.

'b1111:

begin.

Operation_RS (res, xdata, ydata);

z = (res==0)? 1: 0;

if (res<0).

n=1;

else.

n=0;

o=0;

end.

default: res='bx;

endcase.

end.

assign result=res;

assign flagZ=z;

assign flagN=n;

assign flagO=o;

endmodule.

Показать весь текст
Заполнить форму текущей работой