在实施HDL代码时应该遵循哪些最佳实践?
与更常见的软件开发领域相比,有哪些共性和差异?
有什么区别:
if (dataoutput[7:0] == 8'bx) begin
和
if (dataoutput[7:0] === 8'bx) begin 
执行后dataoutput = 52'bx,第二个给出1,但第一个给出0.为什么?(0或1是比较结果.)
reg和wire之间有什么区别?我们什么时候应该使用reg以及何时应该在verilog模块中使用wire.我有时也注意到输出再次被声明为reg.例如,在D触发器中的reg Q. 我已经在某处读过 - "程序赋值语句的目标输出必须是reg数据类型." 什么是程序转让声明?我已经彻底搜索了这个,但未能找到明确的解释.
虽然我标记了这个作业,但它实际上是我自己做的一个免费课程.无论如何,该课程被称为"从Nand到俄罗斯方块",我希望有人在这里看过或参加过课程,这样我就可以得到一些帮助.我正处于使用提供的hdl语言构建ALU的阶段.我的问题是我无法正确编译芯片.当我尝试为ALU设置输出标志时,我收到错误.我认为问题是我不能下标任何中间变量,因为当我只是尝试根据一些随机变量(比如一个输入标志)将标志设置为true或false时,我没有得到错误.我知道问题不在于我尝试使用的芯片,因为我使用的是所有内置芯片.
到目前为止,这是我的ALU芯片:
/**
 * The ALU.  Computes a pre-defined set of functions out = f(x,y)
 * where x and y are two 16-bit inputs. The function f is selected 
 * by a set of 6 control bits denoted zx, nx, zy, ny, f, no.
 * The ALU operation can be described using the following pseudocode:
 *     if zx=1 set x = 0       // 16-bit zero constant
 *     if nx=1 set x = !x      // Bit-wise negation
 *     if zy=1 set …是否可以在verliog中有条件地实例化模块?
例如:
if (en==1)  
  then module1 instantiation  
else  
  module2 instantiation  
我正在尝试用verilog创建一个多级比较器,我无法弄清楚如何在单个生成循环中增加多个genvars.我正在尝试以下方法:
genvar i,j;
//Level 1
generate
  j=0;
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    assign ci1[i] = minw(tc[j],tc[j+1]);
    j = j+2;
  end
endgenerate
并收到以下错误:
Error-[SE] Syntax error
  Following verilog source has syntax error :
  "encoder.v", 322: token is '='
    j=0;
任何人都知道如何在同一个生成语句中增加多个genvars?或者至少获得相同的功能?
我正在寻找非递归奇偶合并排序算法,并找到了两个来源:
两种算法都相同但是错误.生成的排序网络不是奇偶合并排序网络.
以下是具有32个输入的结果网络的图像.2条水平线之间的垂直线表示将值a [x]与[y]进行比较,如果大于,则交换数组中的值.
32个输入的奇偶合并排序http://flylib.com/books/3/55/1/html/2/images/11fig07.gif(可点击)
我将代码从Java复制到C并用excha 替换了函数printf来打印交换候选者.
当绘制对的图时,可以看出生成了太多对.
有谁知道如何修复此算法?
为什么我需要非递归版本?
我想将这个排序网络转换为硬件.将流水线阶段插入非递归算法很容易.
我还调查了递归版本,但是将算法转换为流水线硬件太复杂了.
我的C代码:
#include <stdlib.h>
#include <stdio.h>
void sort(int l, int r)
{ int n = r-l+1;
  for (int p=1; p<n; p+=p)
    for (int k=p; k>0; k/=2)
      for (int j=k%p; j+k<n; j+=(k+k))
        for (int i=0; i<n-j-k; i++)
          if ((j+i)/(p+p) == (j+i+k)/(p+p))
              printf("%2i cmp %2i\n", l+j+i, l+j+i+k);
}
int main(char* argv, int args)
{ const int COUNT = 8; …而不是使用
module ... ( .. )  ;
     #15 
endmodule
我想用
module ... ( ... ) ;
 // GateDelay is a const, like in c language const int GateDelay = 15 ;
 # GateDelay     
endmodule
或者同样的事情
module ... ( ... ) ;
 // assume Wordsize is defined at " define Wordsize 15 "
 reg [ Wordsize -1 : 0 ] mem ;
endmodule
我能用verilog做那个愿望吗?
它似乎接近工作,显然只是在第7行搞砸了?
/**
 * 4-way demultiplexor.
 * {a,b,c,d} = {in,0,0,0} if sel==00
 *             {0,in,0,0} if sel==01
 *             {0,0,in,0} if sel==10
 *             {0,0,0,in} if sel==11
 */
CHIP DMux4Way {
    IN in, sel[2];
    OUT a, b, c, d;
    PARTS:
    DMux(in = in, sel = sel[0], a = out1, b = out2);
    DMux(in = out1, sel = sel[1], a = a, b = b);
    DMux(in = out2, sel = sel[1], a = c, b = d);
}
我已经实现了我的DMux,如下所示,我只是使用它,就好像它是一棵树:
/**
 * Dmultiplexor.
 * {a,b} = …我正在学习VHDL,我正在尝试从示例,语法指南和实验中学习.
有一点我不太明白为什么你想要提供多个架构.例如,这个示例MUX代码:
architecture behv1 of Mux is
begin
    process(I3,I2,I1,I0,S)
    begin
        -- use case statement
        case S is
        when "00" =>    O <= I0;
        when "01" =>    O <= I1;
        when "10" =>    O <= I2;
        when "11" =>    O <= I3;
        when others =>  O <= "ZZZ";
    end case;
    end process;
end behv1;
architecture behv2 of Mux is
begin
    -- use when.. else statement
    O <=    I0 when S="00" else
        I1 when S="01" else
        I2 when S="10" else …hdl ×10
verilog ×6
hardware ×2
nand2tetris ×2
vhdl ×2
alu ×1
c ×1
conditional ×1
const ×1
mergesort ×1
mux ×1
sorting ×1
syntax ×1
syntax-error ×1