关于verilog 的assign
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于verilog 的assign相关的知识,希望对你有一定的参考价值。
以下是一个7段译码器的测试程序:
module tb_bin27seg;
reg [3:0] din;
wire [6:0] dout;
wire en=1;
bin27seg tb(din, en, dout);
assign en=1;
assign #35 en=0;
always
begin
if(din<=4'b1111)
#4 din<=din+1;
else
din<=4'b0;
end
endmodule
仿真的时候en的值是“X”,为什么?是不是assign不能用作数值赋值?困扰……
谢谢你的回答,搞吓米飞机!嗯,我是初学的,这个测试程序我自己也会改正,我不明白的是为什么assign不能这样用呢?你的程序好详细啊,应该是这行的工程师了。
请问为什么要写成这样,有什么好处?
always #4 Clk=~Clk;
always@(posedge clk)
路人花小白,我知道以上两句的意思,但不明白有什么好处?
#4 din<=din+1;这种写法是我参考过一些教程提供的例子,它们也这样写。或者always #4 clk=~clk这种产生时钟的写法更易理解吧,用时钟源去驱动下面的仿真代码。
至于时钟那两句,其实那个也是习惯性的写法,一般都习惯使用时钟信号同步整个模块,而时钟信号就是从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 参考技术A 带assign 赋值为显式连续赋值,只能在过程块之外使用,且赋值对象一般是wire型变量。 参考技术B 他说“虽然assign可以这样用,不过很少有人这么写。assign相当于连线,一般它的用处是将一个变量的值不间断地赋值给另外一个,就像把这两个变量连在一起一样。”
din=din+1;应该用din<=din+1; 吧
always #4 Clk=~Clk;
//产生一个波形,每4ns翻转一次,
always@(posedge clk)
//每次的时钟上升沿进入always语句,和你的 #4 din<=din+1;类似,只是没见过你这样的书写方法
初学,mark一下,只为了方便查找。
以上是关于关于verilog 的assign的主要内容,如果未能解决你的问题,请参考以下文章