返回信息流最近在编VHDL程序,发现有很多东西和想象的不一样,比如一个进程里不能判断两个时钟沿。这些导致很多原来想当然的逻辑编不成功,于是自己摸索,用测试程序测试,总结了一些VHDL语言的小技巧和经验总结,在这里分享一下。错误之处,还请各位指正。
----------------------------------------------------------------------------------------------------
2010.07.27_20'02
问题描述:在VHDL中,如何使用两个时钟更改同一个数据?
解决方法:使用“异或”(xor)逻辑。示例如下:
process (clk1)
begin
if rising_edge(clk1) then
SIG_DOUT1 <= SIG_DOUT2 xor SIG_DIN1;
end if;
end process;
process (clk2)
begin
if rising_edge(clk2) then
SIG_DOUT2 <= SIG_DOUT1 xor SIG_DIN2;
end if;
end process;
SIG_DOUT <= SIG_DOUT1 xor SIG_DOUT2;
DOUT <= SIG_DOUT;
----------------------------------------------------------------------------------------------------
2010.07.28_09'17
问题描述:在VHDL中,如何使用一个时钟的两个沿(上升沿、下降沿)对同一信号进行修改?
解决方法:使用“异或”(xor)逻辑。示例如下:
process (CLK)
begin
if rising_edge(CLK) then
SIG_RISE_OUT <= SIG_FALL_OUT xor D_IN0;
end if;
end process;
process (CLK)
begin
if falling_edge(CLK) then
SIG_FALL_OUT <= SIG_RISE_OUT xor D_IN1;
end if;
end process;
D_OUT <= SIG_RISE_OUT xor SIG_FALL_OUT;
----------------------------------------------------------------------------------------------------
2010.07.27_20'13
问题描述:VHDL中integer是如何实现的?
解决方法:测试发现integer使用最少的无符号二进制数位实现;
----------------------------------------------------------------------------------------------------
2010.07.27_20'16
问题描述:如何模拟一个与主时钟同频的计数器?
解决方法:
process (CLK) --可以用这种方法模拟一个与主时钟同频的计数器
begin
if (falling_edge(CLK)) then
SIGNAL_CLK_CNT(3 downto 1) <= SIGNAL_CLK_CNT(3 downto 1) + 1;
end if;
end process;
SIGNAL_CLK_CNT(0) <= CLK;
----------------------------------------------------------------------------------------------------
2010.07.27_20'18
问题描述:为什么for-generate语句不能通过编译?
解决方法:for-generate语句要加标号才通过。
----------------------------------------------------------------------------------------------------
2010.07.27_20'19
问题描述:process中,信号间赋值是“值传递”还是“地址传递”?
解决方法:process中的信号赋值是:将值赋给信号,不是将信号赋给信号。
也就是说,是“值传递”。我猜想其硬件是使用触发器实现的。
----------------------------------------------------------------------------------------------------
2010.07.27_20'21
问题描述:如何实现信号延时(上升沿同步,但下降沿延迟几个时钟出现)?
解决方法:
PROC_ADJ_VSYNCS: process (CLK_IN,CLK)--可实现信号线延时
variable VAR_VSYNC_CNT: std_logic_vector(3 downto 0):= "0000";
constant CONST_VSYNC_CNT_MAX: std_logic_vector(3 downto 0):= "1100";
begin
if CLK_IN='1' then
CLK_OUT <= '1';
VAR_VSYNC_CNT := "0000";
elsif rising_edge(CLK) then
if (VAR_VSYNC_CNT<CONST_VSYNC_CNT_MAX) then
CLK_OUT <= '1';
VAR_VSYNC_CNT := VAR_VSYNC_CNT + 1;
else
CLK_OUT <= '0';
end if;
end if;
end process PROC_ADJ_VSYNCS;
----------------------------------------------------------------------------------------------------
2010.07.28_12'08
问题描述:VHDL语言如何实现数据选择器?
解决方法:
SIG_DOUT <= SIG_DINS(SIG_IDX); --多路输入,单路输出
SIG_DOUTS(SIG_IDX) <= SIG_DIN; --单路输入,多路输出
----------------------------------------------------------------------------------------------------
这是一条镜像帖。来源:北邮人论坛 / circuit / #14587同步于 2010/7/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
个人编VHDL总结的一些小技巧,分享一下
bupteinstein
2010/7/28镜像同步77 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
表示我过几天也要开始纠结一下HDL了。。。
不知道选啥呢。。。。
【 在 lanphon (上善若水) 的大作中提到: 】
: 赞哇,虽然喜欢verilog多点儿