D触发器的问题 我用VHDL编写的维阻DFF
本帖最后由 fpgaw 于 2010-7-3 06:41 编辑我用VHDL编写的维阻DFF。
-- dff.vhd
library IEEE;
use IEEE.Std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity dff is
port(
D: instd_logic;
CP : in std_logic;
Sd: in std_logic;
Rd: in std_logic;
Q : out std_logic;
Q_fan : out std_logic
);
end dff;
architecture dff_a of dff is
signal q1 : std_logic;
signal q2 : std_logic;
begin
process(CP,Sd,Rd)
begin
if (Sd='0') and (Rd='1') then
q1<='1';
q2<='0';
elsif (Sd='1') and (Rd='0') then
q1<='0';
q2<='1';
elsif rising_edge(CP) then
q1<=D;
q2<=not D;
end if;
Q<=q1;
Q_fan<=q2;
end process;
end dff_a;
可是仿真结果不对
请大家看看哪儿出了问题
谢谢! 学校后天开网,目前在网吧,没有quartus 软件,到时候再看看 复制你的程序在quartus运行,直接用波形图方式进行的仿真,选择的器件是EP1C3T1448,有大概8ns的延迟,如果你的时钟周期很小如10ns,这样波形就延迟了一个大半个周期,所以看起来感觉不对,我也不很明白此延迟是由器件造成的还是由quartus自带的波形仿真不准确造成的?望各位大侠指点,谢谢!<br>
<br>
我按照类似于你的程序用verilog编写并在ISE环境下运行,然后用modesim仿真,波形没有延迟<br>
程序如下:<br>
module dff_test(clk,d,clear,set,q,q_fan);<br>
input clk,d,set,clear;<br>
output q,q_fan;<br>
<br>
reg q1,q2;<br>
assign q = q1;<br>
assign q_fan = q2;<br>
<br>
always @ (posedge clk or negedge clear or negedge set)<br>
begin<br>
if(!set)<br>
begin<br>
q1 <= 1'b1;<br>
q2 <= 1'b0;<br>
end<br>
else if(!clear)<br>
begin<br>
q1 <= 1'b0;<br>
q2 <= 1'b1;<br>
end<br>
else<br>
begin<br>
q1 <= d;<br>
q2 <= ~d;<br>
end<br>
end<br>
<br>
endmodule<br>
<br>
仿真程序如下:<br>
`timescale 1ns / 1ns <br>
module dff_test_tp;<br>
reg clk;<br>
reg d;<br>
reg clear,set;<br>
wire q,q_fan;<br>
parameter step = 50;<br>
<br>
dff_test dff_test_inst(<br>
.clk(clk),<br>
.d(d),<br>
.clear(clear),<br>
.set(set),<br>
.q(q),<br>
.q_fan(q_fan)<br>
);<br>
<br>
always <br>
#(step/10) clk = ~clk;<br>
<br>
always<br>
#(step/5) d = ~d;<br>
<br>
initial <br>
begin<br>
clk = 1'b0;<br>
set = 1'b1;<br>
clear = 1'b1;<br>
d = 1'b1; <br>
#(step/5) set = 1'b0;<br>
#(step/2) set = 1'b1;<br>
#step clear = 1'b0;<br>
#(step/2) clear = 1'b1; <br>
end<br>
endmodule 我也直接画的波形,感觉不对<br>
我用modesim试试 我找到错误的原因了!<br>
去掉信号:<br>
signal q1 : std_logic;<br>
signal q2 : std_logic;<br>
这些信号会造成延时!<br>
程序改为:<br>
-- dff.vhd<br>
library IEEE;<br>
use IEEE.Std_logic_1164.all;<br>
use IEEE.std_logic_unsigned.all;<br>
entity dff is<br>
port(<br>
D: in std_logic;<br>
CP : in std_logic;<br>
Sd: in std_logic;<br>
Rd: in std_logic;<br>
Q : out std_logic;<br>
Q_fan : out std_logic<br>
);<br>
end dff;<br>
<br>
architecture dff_a of dff is<br>
<br>
<br>
begin<br>
process(CP,Sd,Rd)<br>
begin<br>
if (Sd='0') and (Rd='1') then<br>
Q<='1';<br>
Q_fan<='0';<br>
elsif (Sd='1') and (Rd='0') then<br>
Q<='0';<br>
Q_fan<='1';<br>
elsif rising_edge(CP) then<br>
<br>
Q<=D;<br>
Q_fan<=not D;<br>
<br>
<br>
end if;<br>
<br>
<br>
end process;<br>
<br>
end dff_a;<br>
<br>
然后用Modesim编写测试文件仿真。 谢谢,又学到东西了,非常感谢 再次感谢,看了一下,挺好的,并且运行了一下 新手请教~dff在vhdl中有特别的意思么? 新手请教~dff在vhdl中有特别的意思么?
页:
[1]