Verilog 83优先编码器

作者&投稿:恽侦 (若有异议请与网页底部的电邮联系)
用verilog实现的8-3优先编码器,为什么仿真的数据跟我写的测试数据不同,谢谢,在线等~

testbench中
未加`timescale 1ns / 1ps

而且a = 00000001;也不对,没指示位宽
应该是 a = 8‘b00000001; 其他赋值类同;

还有个问题就是后面的#200,没有在#200后加分号

问题:(1)always里面必须是寄存器型,所以mc要改成寄存器型
(2)assign必须是用网线型,所以可以改用mc部分赋值的方法给端口
(3)case语句里面含有无关量“x" 要用casex,否则case里面永远不能匹配
(4)输入输出端口像你样写,S被理解成8位的输入,同理,gs,es被理解成3位输出
(5)always后的敏感变量列表中要加上s

module en(incode,outcode,s,gs,es);

input[7:0]incode;
input s;
output[2:0]outcode;
output gs,es;

wire[7:0]incode;
wire s,gs,es;
wire[8:0]a;

reg[4:0]mc; //输入输出端口定义

assign a={s,incode};

assign outcode=mc[4:2];
assign gs=mc[1];
assign es=mc[0];

always@(incode or s)
begin
casex(a)
9'b1XXXXXXXX: mc=5'b11111;
9'b011111111: mc=5'b11101;
9'b0XXXXXXX0: mc=5'b00010;
9'b0XXXXXX01: mc=5'b00110;
9'b0XXXXX011: mc=5'b01010;
9'b0XXXX0111: mc=5'b01110;
9'b0XXX01111: mc=5'b10010;
9'b0XX011111: mc=5'b10110;
9'b0X0111111: mc=5'b11010;
9'b001111111: mc=5'b11110;

endcase
end
endmodule

先回答你第二个问题
assign A={B,C} 代表 A = B+C 的组合位宽的值
例如:
wire [1:0]A ;
wire B,C;
A={B,C}; //A 是2位宽的, B是1位宽的, C是1位宽的,这样 A[1] 就对应 B ,A[0] 就对应C.

//如果
A={C,B}; //哪么 这样 A[1] 就对应 C ,A[0] 就对应B.

再回答你第一个问题
可以用你的方法写(即用always)。但是你写的程序有个地方有错,改一下就可以了。书上用的是function ,而你用的是always。这两种方法比较如下:
1,如果在本模块内,你需要实现2个83优先编码器,哪么就可以直接调用 function 模块就行了,这样使程序更简洁。
2,如果在本模块内只需要实现一个83优先编码器,就可以用 always ,在需要的地方直接调用该模块。更利于综合。

//修改后代码如下

module code8_3(I,Y);
input[7:0]I;
output[2:0]Y;
reg[2:0]Y
always @ (I or Y) //这里必须包括所有的下面要用到的信号名称 你原来是(I).少了一个Y .(也可以用*号代替 I 和 Y).
begin
if(I[7]) Y=3'b111;
else if(I[6]) Y=3'b110;
else if(I[5]) Y=3'b101;
else if(I[4]) Y=3'b100;
else if(I[3]) Y=3'b011;
else if(I[2]) Y=3'b010;
else if(I[1]) Y=3'b001;
else Y=3'b000;
end
endmodule

能写成你那样啊,下面是我使用你那个程序的仿真结果,达到了93优先编码器的效果,两个程序的功能是一样的,只不过书上的程序使用了fuction函数,使用的fuction函数的好处是使程序模块化,便于在本程序内调用,但是这个程序相对简单,使用fuction函数有画蛇添足的效果,呵呵。




都安瑶族自治县18962263830: 8 - 3优先编码器怎么写verilog代码啊,我总是仿不对 -
检耐多维: 问题:(1)always里面必须是寄存器型,所以mc要改成寄存器型 (2)assign必须是用网线型,所以可以改用mc部分赋值的方法给端口 (3)case语句里面含有无关量“x" 要用casex,否则case里面永远不能匹配 (4)输入输出端口像你样写...

都安瑶族自治县18962263830: 用verilog语言实现二进制优先编码器 -
检耐多维: 这个可以有,就是一个if语句嘛你要几级啊,当你要两级好了 module adder( input rst_n,rst, input clk, input a,b,c, output reg dout ); always @ (posedge clk) begin if(!rst_n) dout else if(rst)dout else doutend endmodule 当rst_n为0时则为a,当rst_n为1时看rst:rst为1时选b,当rst为0时,选c当然这个比较简陋,有什么问题可以继续追问

都安瑶族自治县18962263830: 用verilog hdl语言编写一个8—3译码器程序 -
检耐多维: 首先要纠正一下,相对多的输入转化成为相对少的输出,一般叫编码器;相对少的输入转化成为相对多的输出,一般叫译码器.所以,确切地说你要做的应该是8-3编码器(还是3-8译码器). //8-3编码器verilog代码 module enc_83(datain, ...

都安瑶族自治县18962263830: verilog中if else和case语句有什么区别 -
检耐多维: 一般来说,if else 会实现成优先编码器,即先写的IF逻辑会短,各分支之间的逻辑延迟不一样,而CASE实现起来都是一样的,另外,采用CASEX,也可以达到优先编码的效果

都安瑶族自治县18962263830: 用verilog编的4 - 2优先编码器,有谁帮忙看下什么错误,怎么改? -
检耐多维: 在最后一个?:语句中,你多打了一个“:”.

都安瑶族自治县18962263830: 优先编码器的功能是什么?
检耐多维: 优先编码器的功能是允许同时在几个输入端有输入信号,编码器按输入信号排定的优先顺序,只对同时输入的几个信号中优先权最高的一个进行编码

都安瑶族自治县18962263830: 优先编码器只对同时输入的信号中的优先级别最高的一个信号编码. -
检耐多维: 所谓优先编码器,本意就是指多个编码信号同时有效时,只响应最高优先级的编码输入,而忽视低优先级的编码输入.因此,“不容许多个编码信号同时有效”的说法是错误的. “输入信号相互排斥”也是错误的,只有高优先级会排斥低优先级,低优先级不能排斥高优先级,因此,排斥不是相互的.

都安瑶族自治县18962263830: 请问普通4线 - 2线编码器的真值表为啥是这样的?是规定的还是怎么算的? -
检耐多维: 对,这是规定的,而且还有个优先编码条件,如 I3=1 时,可完全不考虑其他三个参数情况,而直接得到 Y0Y1=11 状态输出; Y1和Y0通过0,1组合来表示4种状态,是00,01,10,11 一个2-4译码器,只需要6个引脚,加上VCC,GND,是8个脚,就是...

都安瑶族自治县18962263830: 分频电路的设计,多路选择器的设计,8 - 3优先编码器的设计 -
检耐多维: 这个是8-3优先编码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decode IS PORT(DATAIN: IN STD_LOGCI_VECTOR(7 DOWNTO 0); DATAOUT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END decode;ARCHITECTURE rtl OF ...

都安瑶族自治县18962263830: 哪位程序高手帮我用VHDL语言设计一个8线—3线优先编码器,必须执行正确的,谢谢! -
检耐多维: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity p_encoder is port(st,in0,in1,in2,in3,in4,in5,in6,in7:IN bit; yex,ys,y0,y1,y2:out bit); end p_encoder; architecture rtl of p_encoder is signal tmp_in:bit_vector(7 downto 0); ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网