在实施HDL代码时应该遵循哪些最佳实践?
与更常见的软件开发领域相比,有哪些共性和差异?
有什么区别:
if (dataoutput[7:0] == 8'bx) begin
Run Code Online (Sandbox Code Playgroud)
和
if (dataoutput[7:0] === 8'bx) begin
Run Code Online (Sandbox Code Playgroud)
执行后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 …Run Code Online (Sandbox Code Playgroud) 是否可以在verliog中有条件地实例化模块?
例如:
if (en==1)
then module1 instantiation
else
module2 instantiation
Run Code Online (Sandbox Code Playgroud) 我正在尝试用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
Run Code Online (Sandbox Code Playgroud)
并收到以下错误:
Error-[SE] Syntax error
Following verilog source has syntax error :
"encoder.v", 322: token is '='
j=0;
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何在同一个生成语句中增加多个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; …Run Code Online (Sandbox Code Playgroud) 而不是使用
module ... ( .. ) ;
#15
endmodule
Run Code Online (Sandbox Code Playgroud)
我想用
module ... ( ... ) ;
// GateDelay is a const, like in c language const int GateDelay = 15 ;
# GateDelay
endmodule
Run Code Online (Sandbox Code Playgroud)
或者同样的事情
module ... ( ... ) ;
// assume Wordsize is defined at " define Wordsize 15 "
reg [ Wordsize -1 : 0 ] mem ;
endmodule
Run Code Online (Sandbox Code Playgroud)
我能用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);
}
Run Code Online (Sandbox Code Playgroud)
我已经实现了我的DMux,如下所示,我只是使用它,就好像它是一棵树:
/**
* Dmultiplexor.
* {a,b} = …Run Code Online (Sandbox Code Playgroud) 我正在学习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 …Run Code Online (Sandbox Code Playgroud) 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