我想问下这个rtl图里面的这些东西。。。
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496005.JPG(原文件名:未命名.JPG)
如上图所示,那些rtl图里面有一个译码器下面有一长串的连线。我想是因为我定义的状态机是8位的,导致了有几百条输出,我想问的是,这么多的输出线,会占用很多的资源么?还是没有什么影响? 呃,没人愿意解答么、、、、、、、、 看不明白,,你的源码都不提供,,或许是你源码的描述,本身就与你的真实意图,有很大的差距..
20:11————看见你帖上的,源码,,不好意思::我只初懂 VHDL ,你这个是 V???G,
如果只是把“主CLK”分频,出来多个时钟,应该很容易做出来的。。。
你不妨,把你定义好的几个:输入,,输出信号的:关系用:“汉语”先描述一次。。 没有源码,怎么解释 哦。。。。。
我以为。。。。。
好吧。源代码是这样的。
module clk_gen (clk,reset,clk1,clk2,clk4,fetch,alu_clk,state);
input clk,reset;
output clk1,clk2,clk4,fetch,alu_clk,state;
wire clk,reset;
reg clk2,clk4,fetch,alu_clk;
reg state;
parameter s1=8'b00000001;
parameter s2=8'b00000010;
parameter s3=8'b00000100;
parameter s4=8'b00001000;
parameter s5=8'b00010000;
parameter s6=8'b00100000;
parameter s7=8'b01000000;
parameter s8=8'b10000000;
parameter idle=8'b00000000;
assign clk1=~clk;
always @ (negedge clk)
if(reset)
begin
clk2<=0;
clk4<=1;
fetch<=0;
alu_clk<=0;
state<=idle;
end
else
begin
case(state)
s1:
begin
clk2<=~clk2;
alu_clk<=~alu_clk;
state<=s2;
end
s2:
begin
clk2<=~clk2;
clk4<=~clk4;
alu_clk<=~alu_clk;
state<=s3;
end
s3:
begin
clk2<=~clk2;
state<=s4;
end
s4:
begin
clk2<=~clk2;
clk4=~clk4;
fetch<=~fetch;
state<=s5;
end
s5:
begin
clk2<=~clk2;
state<=s6;
end
s7:
begin
clk2<=~clk2;
clk4<=~clk4;
state<=s7;
end
s8:
begin
clk2<=~clk2;
clk4<=~clk4;
fetch=~fetch;
state<=s1;
end
idle:state<=s1;
default:state<=idle;
endcase
end
endmodule
源代码就是用一个信号分频成几个信号。 好吧,我这个呢,其实是一本书上的例子。有人建议我从简单的入手,所以呢,我就看看这些例子,发现在rtl图里面确实是很多东西自己不明白。
我用汉语解释:
首先定义了一个模块的端口,有输入的主频clk,复位信号rest,输出信号,clk1,clk2,clk4,fetch,alu_clk,这几个呢,都是由主频分频得到的,分频是用状态机实现的,还有一个输出信号是state,这个state信号是输出状态转换的,是我自己加的,我想查看在什么状态执行了什么操作。
clk1呢,是用连续复制语句实现的对clk信号的一个求反。
clk2信号呢,其实是个2分频信号,在每个状态都实现一次翻转,因为状态是由clk信号的下降沿触发的,这样,翻转也只会发生在clk信号的下降沿,实现了2分频。
clk4信号呢,其实是个4分频信号,在偶数状态实现一次翻转。
。。。。。
然后领我不解的是,rtl图里面的那个decoder后面跟了那么多条线,我想知道的是这么多的线到底占不占实际的资源。 恩,,CLK1,CLK2,CLK4 我猜测也正好是你的本意,,还不理解fetch,alu_clk这两个干什么的!!
我只简单COPY出 我用 VHDL 写的 24 分频 的源码。。我本来是需要 1MHz 的时钟,但是买来的板子 只有 24 MHz的晶振。
感觉你的 “程序”思路比较乱,,(我、没学 v???g,,,,我只初步能用 VHDL,,共参考而已。。)
LIBRARY IEEE;
USE IEEE.Std_Logic_1164.ALL;
USE IEEE.Std_Logic_Arith.ALL;
USE IEEE.Std_Logic_Unsigned.ALL;
entity My_Clk is
port (clk24:IN Std_Logic;
CKout,C_out:Out Std_Logic);
end My_Clk;
architecture inference of My_Clk is
signal count_4:Std_Logic_Vector(3 Downto 0);
signal div12,clk_1M:Std_Logic;
begin
CKout <= clk_1M;
C_out <= not clk_1M;
process (clk24)
begin
if (clk24'EVENT and clk24='1') then
if (count_4 = "1011") then
count_4 <= "0000";
div12 <= '1';
else
count_4 <= count_4 + '1';
div12 <= '0';
end if;
end if;
end process;
process (div12)
begin
if (div12'EVENT and div12='0') then
clk_1M <= Not clk_1M;
end if;
end process;
end inference ;
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496300.jpg
对称的输出,,正,,反,波型不难。 (原文件名:temp.jpg) 你想下,你用了one-hot的状态机编码,而且还有default,那么你的下一状态逻辑将是多么复杂呢?(2^8种总状态数中只有8个是有用的,所以给你综合出一个8-to-256译码器……)。
你这个情况,如果要求不高,直接用计数器不行么?
one-hot编码一般不是在这种情况下用的。使用one-hot一般是为了简化输出逻辑,在不过大地复杂化次态逻辑的前提下;或者说是一般是为了性能考虑。你这个情况完全没有必要这么做,直接做个计数器搞定。 哦,谢谢啊、、。
页:
[1]