Home > Hardware-Architecture > 堆栈电路设计(Design Stack memory circuit)

堆栈电路设计(Design Stack memory circuit)

1、实践项目原理 (Nguyên lí của stack)

堆栈的工作原理是很简单“先进后出”(FILO)。数据进入最早被压在栈底,接着进入的数据被压在上面,所以当要弹出一个数据时先要把它上面的所有数据要弹出来。

Nguyên lí của stack rất đơn giản “vào trước ra trước” (FIFO). Dữ liệu vào trước nhất được lưu(push) vào đáy của stack, các dữ liệu tiếp theo được lưu lên trên, cho nên khi cần lấy (pop) một dữ liệu ra thì trước hết cần pop hết những dữ liệu phía trên nó.

2、实践项目的设计 (Thiết kế Stack)

使用MaxPlus软件可以用两种方法来进行设计:用硬件描述语言来写(VHDL)和设计电路图。

Sử dụng phần mềm MaxPlus có 2 cách tiến hành: dùng ngôn ngữ mô tả phần cứng (VHDL) và thiết kế mạch điện.

使用VHDL:类似于高级语言,容易修改,设计能力强且很方便。下面代码是设计一个含有16字节的堆栈。输入端包括push(压入数据),pop(弹出),clk(脉冲),reset(重新设置),8位数据输入din0到din7。输出端包括empty(堆栈是否空),full(是否满)和8位数据输出dout0到dout7。代码中cnt表示第几个单元。

Sử dụng VHDL: tương tự các ngôn ngữ lập trình, dễ chỉnh sửa, dễ thiết kế, rất tiện. Đoạn code sau dành cho 1 stack có 16 byte. Đầu nhập gồm push (đưa data vào stack), pop (lấy data ra), clk (clock), reset, 8 bit nhập (din0–>din7). Đầu xuất có empty(xóa sạch stack), full (stack đầy chưa) với 8 bit xuất (dout0–>dout7). cnt trong code biểu thị thứ tự của các byte.

library ieee;

use ieee.std_logic_1164.all;

Entity mstack is

port(reset,push,pop,clk:in std_logic;

din:in std_logic_vector(7 downto 0);

empty,full:out std_logic;

dout:out std_logic_vector(7 downto 0));

end mstack;

architecture a1 of mstack is

type stack is array (15 downto 0) of std_logic_vector(7 downto 0);

begin

process(clk,reset)

variable s:  stack;

variable x: std_logic;

variable cnt: integer range 0 to 15;

begin

if reset=’1′ then

dout<=”00000000″;   x:=’0′;     cnt:=0;

else

if clk’event and clk=’1′ then

if push=’1′ and pop=’0′ and x=’0′ then

if cnt/=15 then  empty<=’0′; s(cnt):=din; cnt:=cnt+1;

else  s(15):=din; x:=’1′;

end if;

elsif  push=’0’and pop=’1′ and cnt/=0 then

if x=’0′ then cnt:=cnt-1; dout<=s(cnt);

else dout<=s(15);  x:=’0′;

end if;

elsif cnt=0 then  empty<=’1′;

end if;

end if;

end if;

full<=x;

end process;

end a1;

电路图:因为电路比较复杂所以我只设计4bytes堆栈,但后面指出扩展到8在字节的方法。

Mạch điện: do mạch điện tương đối phức tạp nên tôi chỉ thiết kế stack gồm 4 bytes, sau đó chỉ ra cách mở rộng thành 8 bytes.

首先要设计每个单元(1字节)的电路,它能实现三个功能:写入数据,保存和输出数据。这里用两个74175芯片(每个芯片是4D触发器)来构成

Trước hết thiết kế mạch của 1byte bộ nhớ, có 3 chức năng: viết dữ liệu vào, lưu dữ liệu và xuất ra. Dùng 2 con chip 74175 (mỗi con là 1 cái 4D trigger)

上面图中的4d标记就是74175芯片,结构如下:

kí hiệu 4d trong hình trên là 74175, kết cấu bên trong như sau:

单元的标记如下:

kí hiệu đơn vị bộ nhớ như sau:

分析上面电路的工作方式:当CLRN=0时就把单元的8位清零,当CLRN=1,如果有脉冲CLK到来就把8位输入I0~I7写入8个D触发器,但是8位输出O0~O7仍然是0,只有当isOUT=1时,这8位输出才是单元的内容。

Phân tích mạch trên: khi CLRN=0 sẽ xóa đi 8 bit( mỗi bit lưu 0), khi CLRN=1, nếu có tín hiệu CLK thì dữ liệu nhập I0~I7 được viết vào 8 con D trigger, O0~O7 vẫn là 0, chỉ khi isOut=1 thì 8 bit xuất mới là nội dung của byte.

接着设计堆栈的8位输出部分:

kế tiếp thiết kế 8 bit xuất:

4端E12,E34,E56,E78的共同端口要接到POP脉冲(输出脉冲)。如POP=0的话,OUT0~OUT7仍然保持原来输出的数据,当POP=1时OUT0~OUT7是新输出值。

Cổng chung của 4 đầu E12,E34,E56,E78 nối với POP. Nếu POP=0, Out0~Out7 vẫn giữ kết quả cũ, nếu POP=1 thì mới mang giá trị mới.

图中stackout是由或门组成

stackout trong hình do or gate cấu thành

一位输出电路如下:

mạch 1 bit xuất như sau:

八位输出电路如下(图中每个OR是一位输出电路):

mạch của 8 bit xuất như sau(mỗi OR trong hình là 1 bit xuất):

分析输出电路的工作方式:把4个单元的第0位输出一次连接到IN00,IN01,IN02,IN03,那么输出位OUT0就是这4位的或。把4个单元的第1位输出一次连接到IN10, IN11, IN12, IN13,输出位OUT1就是这4位的或。其他输出位也这样连接。上面已分析过,当哪个单元的isOUT=1它的输出才是它的内容,否则输出0。所以这里OUT0~OUT7就是有信号isOUT=1的单元的内容(因那时POP=1)。

Phân tích mạch xuất: đem bit 0 của 4 byte lần lượt nối với IN00,IN01,IN02,IN03, vậy thì OUT0 là or của 4 bit đó; đem bit 1 của 4 byte lần lượt nối với IN10, IN11, IN12, IN13…Ở trên đã phân tích, khi isOut=1 thì mới xuất ra, nếu không thì xuất 0. Cho nên OUT0~OUT7 là nội dung của byte khi isOUT=s (lúc đó POP=1).

设计输入输出控制部分:

Thiết kế bộ Output Control:

这图中的RESET信号通过非门连接到4个单元的CLRN端,当RESET=0 时4个单元正常工作,当RESET=1时,把4个单元清零。

RESETtrong hình qua not gate nối với CLRN của 4 byte, khi RESET=0 thì 4 byte hoạt động bình thường, khi RESER=1 thì xóa 4 byte.

图中SP的具体电路如下:

Mạch của SP như sau:

分析上面电路的工作方式:LOW接到低电平,HIGH接到高电平,PUSH0~PUSH3一次接到4个单元的CLK端,POP0~POP3一次接到4个单元的isOUT端。

Phân tích mạch trên: LOW nối với điện thế thấp, HIGH nối điện thế cao, PUSH0~PUSH3 lần lượt nối với CLK của 4 byte, POP0~POP3 lần lượt nối với isOUT của 4 byte.

当RESET=1时,74194和4D都被清零。

Khi RESER=1, 74194 và 4D đều bằng 0

当 RESET=0时,开始时QA,QB,QC,QD,PUSH0~PUSH3和POP0~POP3都是0。如果CLK=0,PUSH0~PUSH3都是0(没有单元被选);如果POP=0,POP0~POP3都是0(没有单元被选,输出端OUT0~OUT7保持原来输出的值)。

Khi RESET=0, lúc đầu QA,QB,QC,QD,PUSH0~PUSH3 và POP0~POP3đều =0. Nếu CLK=0, PUSH0~PUSH3 đều =0(ko có byte nào được chọn); nếu POP=0, POP0~POP3 đều =0 (OUT0~OUT7 đều giữ giá trị cũ).

数据写入(用两个控制端PUSH和CLK):给脉冲PUSH(上升沿) 则74194有脉冲且S1S0=01所以右移QAQBQCQD=1000,如CLK=1,PUSH0~PUSH3=1000, 第0单元被选,数据写入第0单元。如CLK=0,没有单元被选。再给脉冲PUSH则QAQBQCQD=1100,如CLK=1,PUSH0~PUSH3=0100, 第1单元被选,数据写入第一单元。再给脉冲PUSH和CLK数据就写入第2单元。

Viết dữ liệu (dùng PUSH và CLK): PUSH có tín hiệu(thấp lên cao) thì 74194 có tín hiệu và S1S0=01 nên dịch phải QAQBQCQD=1000, nếu CLK=1,PUSH0~PUSH3=1000, byte 0 được chọn, data viết vào byte 0. Nếu CLK=0, ko có byte nào được chọn. Tiếp tục PUSH nữa thì QAQBQCQD=1100,nếu CLK=1,PUSH0~PUSH3=0100, byte 1 được chọn, viết data vào byte 1. Nếu PUSH tiếp thì viết vào byte 2…

数据输出(用POP控制端):假如数据已经写入到第2个单元(QAQBQCQD=1110),给脉冲POP,4D因为有脉冲把输入端送到输出端,因POP=1, POP3~POP0=0100,第2单元被选,数据输出。74194有脉冲且S1S0=10所以左移à QAQBQCQD=1100。

Xuất dữ liệu(dùng POP): giả sử data viết vào tới byte 2 rồi (QAQBQCQD=1110), cho tín hiệu POP, 4D có tín hiệu nên data đầu vào được xuất ra đầu ra, do POP=1 và POP3~POP0=0100, byte 2 được chọn, data được viết ra. 74194 có tín hiện và S1S0=10nên dịch trái QAQBQCQD=1100

完整的电路:

Mạch hoàn chỉnh:

扩展到8为的方法:单元的结构不变,输出部分的Stackout的每一位输出是8为输入的或。关键在于SP的电路中,需要两个74194和两个4D 。第二个74194的SRSI端要接到第一个74194的QD端,第一个74194的SLSI端要接到第二个74194的QA端。其他东西都跟上面图类似。SP扩展电路如下:

Cách mở rộng sang 8 byte: cấu trúc byte ko đổi, mỗi bit xuất của Stackout là or của 8 bit vào. Mạch SP cần 2 con 74194 với 2 con 4D. SRSI của con 74194 thứ 2  nối với QD của con 74194 thứ nhất, SLSI của 74194 thứ nhất nối với QA của 74194 thứ 2, các thứ khác giống hình trên. Mạch mở rộng của SP như sau:

3、实践项目调试过程 (Quá trình test)

i)  使用VHDL(dùng VHDL):

要注意的事项(chú ý):

o        编写程序(khi viết chương trình ):选File/New/Text Editor File,文件扩展名为VHD(đuôi file là VHD),存放在MaxPlus2目录(đặt trong folder MaxPlus2)。

o        编译(biên dịch):选File/Project/Set Project to Current File,然后选MAX+plusⅡ/Compiler 进行编译。

o        验证VHDL程序(kiểm tra code VHDL):打开Waveform Editor,在File/End Time 设置时间(thiết lập thời gian),将输入输出端口名选入波形编辑器,然后选MAX+plusⅡ\Simulator。这里进栈出栈系列为:81H,42H进栈;42H出栈;24H进栈;24H出栈;32H,60H进栈;60H,32H,81H出栈(thứ tự xuất nhập: 81H,42H vào; 42H ra; 24H vào; 24H ra; 32H, 60H vào; 60H, 32H,81H ra)。波形如下:

o        下载到芯片(download xuống hardware):在Assign/Device选芯片系列,在Assign/ Pin/Location/Chip选脚位,在Max+PlusII/ Programmer选configure进行下载。

ii)     用电路图(dùng mạch):

上面的电路图已经用Waveform Editor进行Simulator,结果如下:

可以看到波形结果和上面分析是完全一样的。进栈出栈系列为:81H, 42H, 24H进栈;24H出栈;92H,75H进栈;75H,92H,42H,81H出栈。

Kết quả với phân tích ở trên hoàn toán giống nhau. 81H, 42H, 24H vào; 24H ra; 92H,75H vào; 75H, 92H, 42H, 81H ra.

这是笔者在上海大学大二时完成的实习作业(Đây là bài tập hè năm 2 của tôi khi học ở ĐH Thượng Hải)

Categories: Hardware-Architecture Tags:
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: