ece123 发表于 2015-5-27 16:50:15

verilog位组合语法请教 assign outdata = {a'b1,b'b0,c'b1,d'b0}

在verilog 中,数据可以这样组合

wire outdata;
assign outdata = {4'b1,5'b0,2'b1,5'b0};

如果有4个寄存器
reg a,b,c,d; 其中a=4,b=5,c=2,d=5;

将assign outdata = {a'b1,b'b0,c'b1,d'b0};这样组合是非法的,不能带变量表示位宽。

那么我想将abcd中的4个1,5个0,2个1,5个0,按照{4'b1,5'b0,2'b1,5'b0}这个顺序放到outdata中去,用verilog 该怎么写呢?请教大家

如果用每个时钟周期将这些0,1移位进去也可以实现,但速度太慢,接受不了,希望一个周期可以实现。

ece123 发表于 2015-5-27 17:24:54

不要沉。。。。。。。

yuyu87 发表于 2015-5-27 17:27:05

慢么?你时钟快点不就好了?位宽只能是常量,

aammoo 发表于 2015-5-27 17:27:08

你把位宽搞成变量太有创意了,位宽编译好了之后就没法改变了,硬件的东西很多都是不能变的。另外,即使写成a'b1它还是一个1而不是a个1,跟直接拼接起来的是一样的。

yuyu87 发表于 2015-5-27 17:27:28

你可以看看多级流水线 相关的资料

aammoo 发表于 2015-5-27 17:32:44

如果用每个时钟周期将这些0,1移位进去也可以实现,但速度太慢,接受不了,希望一个周期可以实现。
FPGA可以并行的,一个周期完全可以搞定

zxq6 发表于 2015-5-27 18:24:27

把所有的可能都列出来,用case表示。没其他办法。
for循环也是一样的。

lusson 发表于 2015-5-27 18:45:27

本帖最后由 lusson 于 2015-5-27 18:47 编辑

assign outdata = {a,b,c,d}

这样不行吗?------理解错误
--------------------
楼主是想把数据中的1提出来?
将abcd中的4个1,5个0,2个1,5个0,按照{4'b1,5'b0,2'b1,5'b0}这个顺序放到outdata中去

4个1是哪里的?
5个0是哪里的?
怎么又出来2个1,前面不是已经有4个1吗?还有又5个0....

RAMILE 发表于 2015-5-27 19:28:07

本帖最后由 RAMILE 于 2015-5-27 19:35 编辑

表述不明,理解不了

我想到一种多重优先比较的MUX阵列可能是LZ想要的,大部分是组合逻辑,需要大约80个4输入LE

zhangalex88 发表于 2015-5-27 20:07:57

zxq6 发表于 2015-5-27 18:24
把所有的可能都列出来,用case表示。没其他办法。
for循环也是一样的。

赞同zxq6的方法,想一个周期搞定,只能这样。

ece123 发表于 2015-5-27 20:35:56

for不行的,速度上不去
位宽有40~80bit, 流水单周期搞定的话要多少级流水啊
时钟200MHz

ece123 发表于 2015-5-27 20:38:11

我知道位宽不能用变量,打个比方了。
case不行,太多组合,速度上不去,而且资源消耗太大

辰星和月 发表于 2015-5-27 20:40:53

我知道VHDL里面可以放到一个函数里面搞定。

辰星和月 发表于 2015-5-27 20:43:42

用了VHDL之后就不怎么想用Verilog了。Verilog功能比VHDL弱好多。当然,这也和我水平低有直接的关系

Liyicheng 发表于 2015-6-5 21:24:31

兄弟 首先理解一下4'b1的意思 意思是4位二进制数值为1 如果是4个1,5个0,2个1,5个0 那应该是 4'b1111 5'b0 2'b115'b0   

Liyicheng 发表于 2015-6-5 21:25:39

兄弟 首先理解一下4'b1的意思 意思是4位二进制数值为1 如果是4个1,5个0,2个1,5个0 那应该是 4'b1111 5'b0 2'b115'b0   

Liyicheng 发表于 2015-6-5 21:37:30

然后你提的那个想法很有意思,总结一下就是读出四位寄存器中的数据然后按照那几个寄存器的数据来输出想要的结果
然后按照你的意思a+b+c+d=16
然后要一个周期
让我想想

Liyicheng 发表于 2015-6-5 22:01:41

本帖最后由 Liyicheng 于 2015-6-5 22:05 编辑

想到个方法,verilog中可以定义Integer
然后定义a,b,c,d
我们可以先定义一个16位的1
然后
左移a位,取反
左移b位,取反
左移c位,取反
左移d位,取反
然后就是你要的结果

一个周期的话有点困难
想不出来,好久没有用verilog了 待我写几个东西 回忆一发

zhangfeng0115 发表于 2015-6-9 08:18:05

不能这么写,这不是Verilog规定的

McuPlayer 发表于 2015-6-9 08:38:25

如果你写每条语句的时候,都在大脑中想一下对应的电路,然后,一切都明了了

sme 发表于 2015-6-9 11:58:03

被你搞晕了,几个1/几个0,这就不是常数了,你要用电路运算出来才知道。
常数是固定的数,1/0个数是确定的。

如果你只是需要提出一组wire/reg中的某些位,用assign就可以,否则,要计算1/0的个数,这是电路设计的范畴了,不是语法问题。

Jach 发表于 2015-6-25 17:35:07

語言的Compiler(C or Verilog)基本上就是一個產生codes或者Circuits的工具. 當Compiler執行時(Compiler time)所有的xx都要被確定(to be resolved), 它才能把東西做出來. 將來這個東西(Program or Circuit)在運行的時候(Run time), 再產生你要的結果. 你不能要求Compiler在Compiler time的時候替你做出將來在Run time時才能決定的東西.
页: [1]
查看完整版本: verilog位组合语法请教 assign outdata = {a'b1,b'b0,c'b1,d'b0}