我想用计数器和MUX制作分频器。
我为项目制作3个模块
// 4位计数器
module Counter (input clk, input reset, output reg[3:0] out);
always@(posedge clk or posedge reset)
begin
if(reset)
out = 4'b0000;
else
begin
if(clk)
if(out < 4'b1111)
out = out + 4'b0001;
else
out = 4'b0000;
end
end
endmodule
// module 4by1 Mux
module Mux (input [3:0] muxin , input [1:0] sel, output reg muxout);
function _4by1mux;
input [3:0] muxin;
input [1:0] sel;
case (sel)
2'b00 : _4by1mux = muxin[0];
2'b01 : _4by1mux = muxin[1];
2'b10 : _4by1mux = muxin[2];
2'b11 : _4by1mux = muxin[3];
endcase
endfunction
assign muxout = _4by1mux(muxin, sel);
endmodule
// module freqDivider
module freqDivider(input clk, input reset, input [1:0] sel, output reg muxout);
wire [3:0]counterbus;
Counter ct1 (clk, reset, counterbus);
Mux mux1 (counterbus, sel, muxout);
endmodule
模块freqDivider是top,我调用模块Counter和Mux
但模块Mux有问题
Error (10219): Verilog HDL Continuous Assignment error at Mux.v(19):
object "muxout" on left-hand side of assignment must have a net type
此错误
PS。输入sel将按时间更改
答案 0 :(得分:1)
错误是muxout
输出的类型为reg
而非类型wire
的结果。在verilog中,行可以有两种总体类型,网络(如wire
类型)或变量(如reg
类型)。要为网络类型分配值/逻辑,您需要使用assign
语句而不是always
块。要将值/逻辑分配给变量类型,您只能使用always
块而不能使用assign
语句。因此,您可以将assign
模块中的Mux
设为always
块,或者为了更简单的解决方案,不要将muxout
输出设为{{{} 1}},只需省略reg
关键字,它就是reg
。
答案 1 :(得分:0)
错误是您已将mux_out
声明为reg类型,而不是线型。任何端口的默认类型都是wire。您正通过assign
关键字在该网络上进行连续分配。在reg
类型的网络上,赋值只能在程序块(初始,始终)内完成。
仅从mux_out
更改为output reg
到output
。