verilog中使用乘法运算符的问题

2024-05-19 03:04

1. verilog中使用乘法运算符的问题

verilog不像C语言,它不是高级语言,你写乘号有时是可以的,但是有时是不可以的,所以不要使用乘号,更不要使用除号,因为除法在FPGA中是不能在一个周期之内出结果的。为什么有时可以有时不可以呢?因为用来综合你的程序的软件(例如XILINX 的XST)还没有那么智能,有时候它会根据你的乘号自动给你生成乘法器,但是有时不会,而且有时会生成错误的乘法器,除法器这个问题要更突出,所以不要使用乘除号,在参数定义中可以使用

verilog中使用乘法运算符的问题

2. 关于verilog 的assign

关于问题补充:其实如果想做赋值的话,一般都会习惯性地定义一下reg型变量,然后在always语句块内直接赋值就可以了,类似于:reg a;a=1。很少有人定义wire型变量然后再赋值的,wire型一般都是在上层模块中调用下层模块的输入输出时才会定义的类型,一般都是这样。而assign命令一般都习惯性地当做连线用,比如想把一个模块的输出给另一个模块当输入,就可以assign Input=Output;
至于时钟那两句,其实那个也是习惯性的写法,一般都习惯使用时钟信号同步整个模块,而时钟信号就是从testbench文件中发出的。特别是对于大的工程,这样的设定会方便各个模块之间的同步。我可不是什么工程师,只不过是刚学了verilog一年的研究生而已,呵呵
初学者吧?你写的这个有太多不规范的地方= =
虽然assign可以这样用,不过很少有人这么写。assign相当于连线,一般它的用处是将一个变量的值不间断地赋值给另外一个,就像把这两个变量连在一起一样。
替你写了个testbench,应该还算是比较规范的,你可以参考我的改一下。如果还不行的话你把你的源代码给我我可以帮你看一下
`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   11:03:54 07/01/2010
// Design Name:   tb_bin27seg
// Module Name:   D:/Xilinx/11.1/myproject/test12/testbench.v
// Project Name:  test12
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: tb_bin27seg
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:搞吓米飞机
//
// Create Date:   17:14:55 05/08/2010
// Design Name:   test
// Module Name:   D:/Xilinx/11.1/myproject/convolution/convolutiontest.v
// Project Name:  convolution
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: convolution
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module test;

 // Inputs
 reg clk;
 reg din;
 reg en;

 // Outputs
 wire dout;


 // Instantiate the Unit Under Test (UUT)
 bin27seg tb(
  .din(din),
  .en(en),
  .dout(dout));

 initial begin
  // Initialize Inputs
  clk=0;
  din=0;
  en=1;

  // Wait 100 ns for global reset to finish
  #100;
  en=0;
      
  // Add stimulus here

  
 end
always #4 Clk=~Clk;
always@(posedge clk)
begin
 if(din<=4'b1111)
 begin
  din=din+1;
 end
 else
 begin
  din=0;
 end
 
end
endmodule

3. 如何查看ISE IP核的verilog代码

这个ce的意思是clock enable,是你生成IP核的过程中设置了这个选项才会有的,叫做时钟使能,是一个输入控制信号,而不是输出
但是呢这个只会导致warning,不会导致仿不出数据,仿真结果应该会把这个信号挂Z,但是dout还是有的
我建议你,去掉调用IP核的那个模块,直接一个裸核,也是可以仿真的,然后你直接生成TEST文件,你就会看到哪些是输入,哪些是输出,然后输入给了,是肯定有输出的
然后你再写模块调用IP核,再进行TEST,一步一步来。
觉得答案可以的话,就采纳吧,有什么不懂可以继续问我,最近查文档百度财富用完了,所以在做任务,你采纳了我就有难题奖励了

如何查看ISE IP核的verilog代码

4. 在Verilog HDL中如何使用系统任务$readmemb

系统任务$readmemb和$readmemh
这两个系统任务用来从文件中读取数据到存储器中。可以在仿真的任何时刻被执行使用,使用格式共六种:
(1) $readmemb(“”,);
(2) $readmemb(“”,,);
(3) $readmemb(“”,,,);
(4) $readmema(“”,);
(5) $readmema(“”,>);
(6) $readmema(“”,,,);
  在这两个系统任务中,被读取的数据文件的内容只能包含:空白位置(空格、换行、制表格、注释行、二进制或十六进制的数字。数字中不能包含位宽说明和格式说明,对于$readmemb系统任务,每个数字必须使二进制数字,对于$readmemh系统任务,每个数字必须使十六进制数字。数字中不定值x或X,高阻值z或Z,和在下划线(_)的使用方法及代表的意义与一般Verilog HDL程序中的用法和意义是一样的。另外,数字必须用空白位置或注释行来分隔开。
对于上面6种系统任务格式,需补充说明一下5点:
(1) 如果系统任务声明语句中和数据文件里都没有进行地址说明,则默认存放起始地址为该存储器定义语句中的起始地址。数据文件里的数据被连续存放到该存储器中,直到该存储单元存满为止或数据文件里的数据存完。
(2) 如果系统任务中说明了存放的起始地址,没有说明存放的结束地址,则数据从起始地址开始存放,存到该存储器定义语句中的结束地址为止。
(3) 如果系统任务声明语句中,结束地址和起始地址都进行了说明,则数据文件里的数据按该起始地址开始存放到存储单元中,直到该结束地址,而不考虑该存储器的定义语句的起始地址和结束地址。
(4) 如果地址信息在系统任务和数据文件里面都进行了说明,那么数据文件里的地址必须在系统任务中地址参数声明的范围之内。否则提示错误,并且装载数据到存储器中的操作被中断。
(5) 如果数据文件里的数据个数和系统任务中起始地址及结束地址暗示的数据个数不同的话,也要提示错误信息。

5. Verilog语言写的一个小程序出错,在ISE软件中,大概实现一个跑马灯

always 里面还套always?

Verilog语言写的一个小程序出错,在ISE软件中,大概实现一个跑马灯

6. Xilinx ISE14.4语法要求提高之后又程序出现error的问题 程序如下:

你的问题是出现了竞争想象,如果D触发器的数据输出在上升沿,数据的检测也在上升沿就会出现触发位置的偶然偏差,如果检测放在下降沿就会很好的避免这种情况.

你可以试试always@(negedge clk or negedge rst)

如果一定要上升沿的也可以试试改成电平触发
always@ (clk=1 or reset=1)

7. verilog的网表是什么啊?

网表:
首先声明不是HDL语言里面的东西,而是综合工具里面的东西~~

综合的概念就是你写的是verilog代码。但是他只是代码。其实不起到任何作用,只是做了这个模块的行为级的描述。但是电脑对verilog不能直接识别。所以要通过编译器和综合工具进行翻译。编译器检查你的语法错误,以及初步逻辑功能的检查。然后综合工具将对应的设计转化成“网表”。

真正将你的HDL代码变为可用的电路过程如下:
     xilinx的步骤synphysize(综合) translate(注译),map(映射),和place and route(布局布线)
     altera的步骤为complie(编译)synphysize(综合) fitter(布线)

    综合以后生成的就为网表文件。这个文件只是一个电路的雏形,这步完成以后你可以看到RTL(寄存器传输级)电路。也可以看到technology 电路。两者区别等你看到就很快明白。这两张图片是对网表的一种直观的显示。也就是综合器最后综合出了你的逻辑电路。放在网表文件中。

    注意:到网表层时,你的HDL语言已经无用,这个时候需要用综合器生成的网表文件来做下面的步骤。也就是说,你的语言已经转化成电路了!!!下面步骤就是把电路移植到fpga上面了!!!!!
    
    转化成电路以后:下面的步骤是根据不同的FPGA来具体的细化这张网表。比如说工具可以具体的算出某个信号的延迟是多少。其中包括多少的走线延迟和多少的组合逻辑延迟。然后最后根据FPGA的内部结构决定把这个门放到哪里。这个就是place&route。
    
    到此,你就生成了一个真正的逻辑电路了,然后么。。呼呼~~生成个下载文件,你的FPGA或者CPLD就可以跑起来了。

verilog的网表是什么啊?

8. xilinx ISE FPGA ALTERA 高手给点verilog HDL程序阅读技巧吧,谢谢,有时候看程序看的晕乎。

我真是深有体会啊。。。看别人写的模块很头疼,大多时候,我看懂后自己重写一遍。最最重要的是两部分
1.状态机。必须看懂,牵扯到各个子模块的使能等问题,从idle状态开始自己划清楚状态图,看清楚每个状态他干了什么。
2.各个模块,包括主模块和子模块的端口含义。
当然下一步就是各个子模块的状态机和子模块里的小模块的端口含义。以此类推
 
你说的技巧。。还是编译器的问题。我常用的vim.ultra edit也有很多人用。方便你对一个端口进行追踪查询。必备啊。千万别用QUARTUS或者MODELSIM编译器去看。。累死你
最新文章
热门文章
推荐阅读