LIBRARY IEEE;
USE IEEESTD_LOGIC_1164ALL;
USE IEEEstd_logic_arithall;
USE IEEEstd_logic_unsignedall; ---调用常用的库
ENTITY add8b IS
PORT(
clk:IN STD_LOGIC; ---时钟信号
cin: IN STD_LOGIC; ---相加进位信号
a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);-----两个8位的二进制数
s:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ----输出
cout:OUT STD_LOGIC);
END;
ARCHITECTURE cheng OF add8b IS
SIGNAL adda1,adda2,addb1,addb2,reg1a,reg1b,add1,add2:STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL reg2:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL cin1:STD_LOGIC;
BEGIN
PROCESS(clk)
BEGIN
IF clk'EVENT AND clk='1' THEN
adda1<='0'&a(3 DOWNTO 0); ----adda1是a的低4位
addb1<='0'&b(3 DOWNTO 0);-----addb1是b的低4位
adda2<='0'&a(7 DOWNTO 4);------adda2是a的高4位
addb2<='0'&b(7 DOWNTO 4);------addb2是b的高4位
cin1<=cin;
END IF;
END PROCESS;
PROCESS(CLK)
BEGIN
IF clk'EVENT AND clk='1' THEN
add1<=adda1+addb1+cin1; ---低4位相加放入add1 注意考虑是否有进位
reg1a<=adda2;
reg1b<=addb2;
END IF;
END PROCESS;
PROCESS(CLK)
BEGIN
IF clk'EVENT AND clk='1' THEN----高4位相加,考虑低4位相加的进位
add2<=reg1a+reg1b+add1(4);
reg2<=add1(3 DOWNTO 0);
END IF;
END PROCESS;
s<=add2(3 DOWNTO 0)&add1(3 DOWNTO 0);----结果是高四位与低四位并置
cout<=add2(4); ---是否有进位
END cheng ;
第二个 只需要搞清 二进制数的乘法原理就可以了 两个4位二进制数相乘,如a=1010,b=1111 那么可以看成是1010(1000+0100+0010+0001),结果等于 将1010左移三位加上1010左移两位,加上1010左移1位加上1010不移位
就是结果
y<=("0000"& c0)+("000"& c1&'0')+("00"& c2&"00")+('0'&c3&"000");
第一个是不移动 第二个是b低二位与a相乘左移1位 第三是b低3位 与a相乘左移两位,第四是b最高位与a相乘左移三位 结果相加
VHDL不允许在一个进程中检测多个信号的边沿,只能检测某一个信号的边沿。if clk'event and clk='1'then if PUSH_IN'EVENT AND PUSH_IN='0' THEN 这种描述方式VHDL不认可。
carry(0)<=clk;
U0:counter10 PORT MAP(carry(0),count,carry(1),q0);
U1:counter10 PORT MAP(carry(1),count,carry(2),q1);
U2:counter6 PORT MAP(carry(2),count,carry(3),q2);
U3:counter10 PORT MAP(carry(3),count,carry(4),q3);
ledscanclk<=clktemp(5);
PROCESS(ledscanclk)--ledscanclk为扫描时钟
BEGIN
IF(ledscanclk'EVENT AND ledscanclk='1')THEN
CASE showwhat IS
WHEN 0=>shownumber<=CONV_INTEGER(q0);
showwhat<=1;
flag<='0';
WHEN 1=>shownumber<=CONV_INTEGER(q1);
showwhat<=2;
flag<='1';
WHEN 2=>shownumber<=CONV_INTEGER(q2);
showwhat<=3;
flag<='0';
WHEN OTHERS=>shownumber<=CONV_INTEGER(q3);
showwhat<=0;
flag<='1';
END CASE;
END IF;
END PROCESS;
WITH showwhat SELECT --具体要看你的数码管是共阴还是共阳的
scanshow<=B"1110" WHEN 1,--0
B"1101" WHEN 2,--1
B"1011" WHEN 3,--2
B"0111" WHEN OTHERS;--3
WITH shownumber SELECT --具体要看你的数码管是共阴还是共阳的
qtemp<=B"1111110" WHEN 0,--0
B"0110000" WHEN 1,--1
B"1101101" WHEN 2,--2
B"1111001" WHEN 3,--3
B"0110011" WHEN 4,--4
B"1011011" WHEN 5,--5
B"1011111" WHEN 6,--6
B"1110000" WHEN 7,--7
B"1111111" WHEN 8,--8
B"1111011" WHEN OTHERS;--9
show<=flag&qtemp; --show为输出
个人建议,像这样的代码还是自己写为好,这毕竟看完书学习完后是不难的,如果什么都要去问别人,不静下心来考虑,那你永远也无法成为一个高手(虽然我还不是),大家都是在学习,别人能懂的,相信我们也能明白的。我们没有理由比别人会差的,和大家一起加油努力。
--试试这个吧:
LIBRARY IEEE;
USE IEEESTD_LOGIC_1164ALL;
ENTITY Light IS
PORT (CLK,S:IN STD_LOGIC; --CLK选4Hz,或选择其他频率再通过分频产生4Hz
LOUT:OUT STD_LOGIC);--LOUT为输出,用于控制灯的闪灭
END Light;
ARCHITECTRRE bhv OF Light IS
BEGIN
LOUT<=CLK WHEN S='1' ELSE '0’;
END bhv;
VGA时序信号是图象显示的关键,行场扫描时序的产生,是利用逻辑编程的方法实现的,即用VHDL编写分频器,计时器模块,来获得T1、T2、T3、T4 时序。当输出数字、彩条信号和棋盘格图象时,由外部12M有源晶振提供时钟输入,其中行频HS:12MHZ ÷13÷29=31830Hz、场频VS:31830Hz÷480×093=6167Hz、T1=1/31830Hz×4/29=2596us、 T2=1/31830Hz×5/29=604us、T3为两个行周期(T1+T2),T4为480个行周期。
图象信号包括数字、彩条、棋盘格,和ROM中定制的图形等。数字信号和彩条信号的产生是按行场方向将屏幕各进行8等分,相当于一个8×8的点阵,在对应位置显示相应颜色即可获得所需图像信号;棋盘格信号是将横彩条和竖彩条相异或获得。ROM中定制的较为复杂的彩色图像,需采用像素点输出,即将图像各像素点的信息存储于ROM中,再以一定的频率输出。FPGA器件ROM的定制有两种方法:第一种方法是利用FPGA器件的嵌入式存储器定制LPM_ROM, 用MIF文件或HEX文件对其进行初始化,这种方法获得的ROM最大寻址空间为2 12,可以存储一幅分辨率为64×64的图像信息;第二种方法是在FPGA逻辑资源的限度内用VHDL语言定制一个ROM,采用CASE语句对其进行初始化,这种方法获得的ROM在存储深度较大时,编译时对时间的开销较大。ROM初始化完成后,在25MHz的时钟频率下输出存储的图像信息。其图象颜色种类的多少取决于存储空间的大小。
ROM定制的图象信息是利用FPGA嵌入的存储器定制LPM_ROM,可以用于存储一幅64×64分辨率的图像信息,数据线宽为3位,地址线12根,采用组合寻址方式,即行地址HSADDRESS占低6位,场地址VSADDRESS占高6位;若要显示更为复杂的图象信息,只需扩展存储器及寻址的数据线宽度,为了保证行地址信号输出与行扫描信号输出同步,场地址信号输出与场扫描信号输出同步,在VHDL编程时,可用25MHz时钟作为进程的启动信号。输出信号的时序波形如图6所示。各种图象信号的输出是由数据选择器通过VHDL编程实现的。
以上就是关于哪位高手帮我注释一下VHDL的程序,由心的万分感谢了全部的内容,包括:哪位高手帮我注释一下VHDL的程序,由心的万分感谢了、VHDL 脉冲检测程序设计、谁会用vhdl写一个用四位八段数码管动态显示四位数字的程序啊用clk时钟触发等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)