2

我在理解 Simulink(Xilink 库)中的时序信号概念时遇到了一些麻烦。

我会用一个例子来解释,

假设你有一个串行比特流,你想取奇数位和偶数位的总和,

所以你可能会写这样的 Matlab 代码:

Data_Bits=[1 2 3 0 4 5 1 2 0 9];

Sum_Bits=[];
for i=1:length(Data_Bits)/2
    Sum_Bits=[Sum_Bits Data_Bits(2*i-1)+Data_Bits(2*i)]
end

假设一会儿,我们忽略所有优化和极端情况,这些代码可能无法正常工作。

假设我们必须在硬件中实现它,它Data_Bits是串行的,所以你基本上等待 2 个时钟周期来获取 2 个输入位并将其相加并生成输出。

因此,每 2 个时钟周期,您就有一个输出。

那么是否可以在 Xilinx 中管理时序信号,以便我们获得有效的输出。

所以我不想在输出中有一个中间结果。

我们怎样才能做到这一点?我正在考虑使用某种带有自由运行时钟(计数器)的启用输入。

但是我们在设计一个非常复杂的系统时如何管理呢?

我在硬件设计方面没有太多经验。因此,如果我的问题危险地接近于简单和愚蠢,我为我的智慧感到抱歉。

谢谢阅读

基兰

4

2 回答 2

2

如果您希望输出仅在“有效”时更改,则在输出引脚上使用启用的寄存器,启用信号连接到在单个时钟滴答时为高电平的东西,同时值进入寄存器是您要在输出中呈现的那个。

在您的情况下,您的“有效”信号在交替时钟周期上在“1”和“0”之间切换,因此您可以使用触发器,其输出通过反相器反馈。(在 davidd 的代码中,您可以在注释为 的行中看到这一点//tflipflop)。

如果您有一个更复杂的系统,该系统仅在n周期内有效一次,您可以使用一个计数器来重置每个n周期并将重置脉冲用作“有效”信号。

于 2011-05-13T07:56:19.283 回答
0
Input stream -------------> AddSub -> register -> output stream
Input stream -> register -> AddSub    register
                                      register
                           counter -> register(enable)

将输入流和延迟1个周期的输入流相加。使用 1 位计数器(或 T 触发器)启用加法器输出上的寄存器。

那是你要找的吗?

另外,在运行复杂系统时“管理”它是什么意思?此构造的 verilog 或 vhdl 将非常简单,可以用来代替系统生成器块。

//note: initialization/reset and limit handling is not included and would need to be considered.
always@(posedge clk)
begin
    databits_1dly <= databits;  //create a once cycle delayed version of databits
    sum <= databits_1dly + databits; //adder
    every_other <= !every_other //t flip flop.
    if (every_other)  //invert if you want the other every_other
       sum_every_other <= sum
end
于 2011-05-12T15:35:32.323 回答