问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

跪求一个用VHDL设计一个CPU,请各位大侠帮帮忙!!

发布网友 发布时间:2024-10-06 08:54

我来回答

1个回答

热心网友 时间:2024-10-28 20:10

CPU具有的功能:能完成一些简单的指令
MOV AX,ADDRESS4 --将address4中的内容赋给AX寄存器(在8086/8088汇编语言中称这种寻址方式为直接寻址方式)
ADD AX,ADDRESS4 -- 将address4中的内容加到AX寄存器中
SUB AX,ADDRESS4 -- 用address4中的内容减去AX寄存器中的内容
OUT -- 输出AX寄存器中的内容
HLT -- CPU停止运行
S0状态:程序计数器(PC)将值赋给MAR

S1状态:PC<=PC+1 注意:因为在设计状态机时引入了复位键(RST),为了避免一个信号有多个源,因而将时序进程(REG:PROCESS)和组合进程(COM:PROCESS)合二为一。但是产生了一个比较麻烦的事情--------------即一个状态占用了两个时钟周期。所以在设计PC<=PC+1时,引入了标志寄存器(FLAG),以确保在S1状态PC只加一次

S2状态:从只读存储器(ROM)中读取汇编指令,并且将赋给指令寄存器(IR)IR<=DATABUS
------------------------------------------------------------------------------------------------------------------------------------------------
从S0-S2状态每条指令的执行都是相同的

S3状态:取出指令寄存器的高4位(汇编的指令代码)进行译码
if (temp="0000") or (temp="0001")or (temp="0010") then
mar<=ir(3 downto 0); --将数据存储的地址赋给MAR
elsif temp="1110" then
output_data<=ax; -- out over
elsif temp="1111" then
run<='0'; --Hlt over
end if;
有上面的程序可以看出,当指令是MOV、ADD、SUB中的一个时,取出地址
当指令是OUT时将累加器中的值输出,该条指令做完
当指令是HLT(1111)时,程序停止运行,该条指令做完

S4状态:
if temp="0000" then - -MOV AX,data over
ax<=dataBus;
elsif temp="0001" then --ADD ax,data
bx<=databus;
f1<='1';
elsif temp="0010" then --SUB ax,bx
bx<=databus;
f1<='1';
end if;
读出RAM 中的内容(在此设计中,用ROM代替了RAM)在此状态MOV指令结束

S5状态:为计算状态
if temp="0001" and f1='1' then
ax<=ax+bx;
f1<='0';
elsif temp="0010" and f1='1' then
ax<=ax-bx;
f1<='0';
end if;
当指令是ADD(0001)时,AX<=AX+BX
当指令是SUB(0010)时, AX<=AX-BX

源程序:
ROM16_4.VHD
--//////////////////////////////////////////////////////////
--16*8ROM
--CE=0时允许读
--huyugui
--2005,1,28
--//////////////////////////////////////////////////////////
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity rom16_8 is
port( addr:in std_logic_vector(3 downto 0);
ce:in std_logic;
dataout:out std_logic_vector(7 downto 0)
);
end entity rom16_8;

architecture behave of rom16_8 is
begin
--10+20+60-10=80h
dataout<="00001001" when addr="0000" and ce='0' else --mov ax,9h
"00011010" when addr="0001" and ce='0' else --add ax,ah
"00011011" when addr="0010" and ce='0' else --add ax,bh
"00101100" when addr="0011" and ce='0' else --sub ax,ch

"11100000" when addr="0100" and ce='0' else --out
"11110000" when addr="0101" and ce='0' else --hlt
"00000000" when addr="0110" and ce='0' else
"00000000" when addr="0111" and ce='0' else

"00000000" when addr="1000" and ce='0' else
"00010000" when addr="1001" and ce='0' else --10h
"00100000" when addr="1010" and ce='0' else --20h
"01100000" when addr="1011" and ce='0' else --60h

"00010000" when addr="1100" and ce='0' else --10h
"00000000" when addr="1101" and ce='0' else
"00000000" when addr="1110" and ce='0' else
"00000000" when addr="1111" and ce='0' else
"11111111";
end architecture behave;

CPU_CONTROL.VHD
--/////////////////////////////////////////////////////////////////////////////
--8_CPU
--mov ax,address /add ax,address/sub ax,address/out /hlt
--说明:address为4位的地址(9H-fH)
--完善:每个状态为一个时钟周期,这样的话PC<=PC+1在S1状态将只做一次,时钟将
--得到很大的改善
--设计者:胡玉贵
--时间:2005,1,29A
--/////////////////////////////////////////////////////////////////////////////
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity cpu_control is
port(clk:in std_logic;
rst:in std_logic;
output_data,databus_out:out std_logic_vector(7 downto 0)
);
end entity cpu_control;

architecture behave of cpu_control is
component rom16_8 is
port( addr:in std_logic_vector(3 downto 0);
ce:in std_logic;
dataout:out std_logic_vector(7 downto 0)
);
end component rom16_8;
type states is (s0,s1,s2,s3,s4,s5);
signal current_state,next_state:states;
signal flag:std_logic;
signal pc,addrbus:std_logic_vector(3 downto 0);
signal ax,bx:std_logic_vector(7 downto 0);--Ax,Bx
signal cs:std_logic;
signal databus:std_logic_vector(7 downto 0);
signal run:std_logic;
signal mar:std_logic_vector(3 downto 0);
signal ir:std_logic_vector(7 downto 0);

signal f1:std_logic;
begin
reg:process
variable temp:std_logic_vector(3 downto 0);
begin
if rst='1' then --系统复位
pc<="0000";
ax<="00000000";
bx<="00000000";
run<='1';
flag<='1'; --PC可以加1
f1<='1';
current_state<=s0;
--databus<="00000000";
elsif rising_edge(clk) then
if run='1' then
case current_state is
when s0=>next_state<=s1; --Address State&Fetch
mar<=pc; --将PC的值赋给MAR,在S2状态时从ROM中读出指令(IR<=databus)
when s1=>next_state<=s2;
if flag='1' then
pc<=pc+1; --地址加1
flag<='0';
end if;
when s2=>next_state<=s3;
flag<='1' ;
ir<=databus; --将ROM中的指令赋给IR(指令寄存器)
when s3=>next_state<=s4;
temp:=ir(7 downto 4); --取指令寄存器的高4位(指令代码 MOV 0000,ADD 0001,SUB 0010)
-- Mov Add Sub
if (temp="0000") or (temp="0001")or (temp="0010") then
mar<=ir(3 downto 0); --将数据存储的地址赋给MAR
elsif temp="1110" then
output_data<=ax; -- out over
elsif temp="1111" then
run<='0'; --Hlt over
end if;

when s4=>next_state<=s5; --在S4状态,将从数据总线上读取数据
if temp="0000" then --MOV AX,data over
ax<=dataBus;
elsif temp="0001" then --ADD ax,data
bx<=databus;
f1<='1';
elsif temp="0010" then --SUB ax,bx
bx<=databus;
f1<='1';
end if;

when s5=>next_state<=s0;
if temp="0001" and f1='1' then
ax<=ax+bx;
f1<='0';
elsif temp="0010" and f1='1' then
ax<=ax-bx;
f1<='0';
end if;
end case;
current_state<=next_state; --此设计使每个状态为两个时钟周期�(Attention!!!!)
end if;
end if;
end process reg;
u1:rom16_8 port map(addrbus,cs,databus);
addrbus<=mar when (current_state=s2) or (current_state=s4) else
"0000";
cs<='0' when (current_state=s2) or (current_state=s4) else
'1';
databus_out<=databus;
end architecture behave;

参考资料:微机原理及应用第3章:清华大学出版社;VHDL和数字电路设计:科学出版社;VHDL实用教程:电子科技大出版社

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 关于动画专业对电脑CPU和显卡的要求孰高孰低。。最近要配电脑。。求大 ... 5s手机用着用着突然出现了黑色阴影怎么回事,刚刚按键都不好用,会自动... 苹果5s回执信息时框里出现黑色,看不见内容 龙之谷浪客转职哪个好(龙之谷新角色浪客刷图加点) 龙之谷手游刺客(龙之谷手游刺客转职哪个好介绍_龙之谷手游刺客(龙之... 十几年的qq号能卖多少钱啊 龙之谷刺客转职(龙之谷手游刺客职业转职什么好介绍_龙之谷刺客转职(龙之... 苹果5s屏幕快照后出现大概屏幕三分之一的黑色部分,请问这是怎么了,有... 龙之谷手游刺客一转选择哪个职业 一转职业选择介绍 龙之谷手游刺客转什么职业好 刺客一转什么好 多功能洒水车洒水车日常使用技巧 我有1984年的地方国营茅台酒市场价值多少? ...世界上许多国家过母亲节,但母亲节的日期不尽相同:美国、意大利... 从孟子、岳母、冰心中推事一人作为母亲节的形象代言人,应推举谁?写出... 狐臭到底传染不啊??? 急急急 假如从下面的候选人中推举一人作为母亲节的形象代言人,你推举谁?写出... 急!急!谁告诉我怎么治疗狐臭 ...我跟着母亲,二十三岁时和大我六岁离婚有七岁女儿的老婆相识相爱 结 ... 帮忙看下我是不是有狐臭 急!!! 急、我今年15岁,昨晚洗澡时闻到液底下好像有狐臭、 新手要如何开始学习超频? ...只是普通的学习,小弟是外行,各位大侠帮我建议一下,在下不胜感激_百... 清华大学的校园环境有哪些优势和不足? 该怎么评价清华大学的校园环境 哪个大学的宿舍好 如何确保基坑安全? 关于基坑支护安全控制要点,正确的有( )。 如何支护基坑才能不塌方? 重庆市疾控中心 21年教师资格笔试成绩查询 真珠美学创始人是谁 短期理财买什么产品好 樟树到衢州的火车票为什么不可网上预订 孩子没有乙肝抗体怎么回事 在衢州火车站可以买到杭州到济南 的 火车票吗 我在网上预约的英国签证是下午两点半,我可以一点就去么排队么。担心提前... 我要去英国探亲,可不可以直接去英国签证中心交材料?年龄大网上予约不... asksbdo还是todo呢? ...跑车尾部有个标志是一个圆圈当中是一个大写的英文T不知道是什么牌子... ...一辆跑车,标志像翅膀,后尾很漂亮,像保时捷,写着很长的英文字母...