Verilog设计练习进阶(10)------- 通过模块之间的调用实现自顶
此程序搞的有点麻烦,先不做分析了。modulep_to_s(D_in,T0,data,SEND,ESC,ADD_100);
output D_in,T0; // D_in 是串行输出,T0是移位时钟并给
// CPU中断,以确定何时给出下个数据。
input data; //并行输入的数据。
input SEND,ESC,ADD_100; //SEND、ESC 共同决定是否进行并到串
//的数据转化。ADD_100 决定何时置数。
wire D_in,T0;
reg DATA_Q,DATA_Q_buf;
assign T0 = ! (SEND & ESC); //形成移位时钟。.
assign D_in = DATA_Q; //给出串行数据。
always @(posedge T0 or negedge ADD_100)//ADD_100下沿置数,T0 上沿移位。
begin
if(!ADD_100)
DATA_Q = data;
else
begin
DATA_Q_buf = DATA_Q<<1; //DATA_Q_buf 作为中介,以令综合器
DATA_Q= DATA_Q_buf; //能辨明。
end
end
endmodule
module s_to_p(T1, data, D_out,DSC,TAKE,ADD_101);
output T1; //给CPU 中断,以确定CPU 何时取转化
//得到的并行数据。
output data;
input D_out, DSC, TAKE, ADD_101;//D_out提供输入串行数据。DSC、TAKE
// 共同决定何时取数。
wire data;
wire T1,clk2;
reg data_latch, data_latch_buf;
assign clk2 = DSC& TAKE ; //提供移位时钟。
assign T1 = !clk2;
assign data =(!ADD_101) ? data_latch : 8'bz;
always@(posedge clk2)
begin
data_latch_buf = data_latch << 1; //data_latch _buf作缓冲
data_latch = data_latch_buf; //,以令综合器能辩明。
data_latch = D_out;
end
endmodule
顶层代码
`include "./p_to_s.v"
`include "./s_to_p.v"
module sys(D_in,T0,T1, data, D_out,SEND,ESC,DSC,TAKE,ADD_100,AD D_101);
input D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101;
inoutdata;
output D_in,T0,T1;
p_to_s p_to_s(.D_in(D_in),.T0(T0),.data(data),
.SEND(SEND),.ESC(ESC),.ADD_100(ADD_100));
s_to_p s_to_p(.T1(T1),.data(data),.D_out(D_out),
.DSC(DSC),.TAKE(TAKE),.ADD_101(ADD_101));
endmodule
测试代码
`timescale 1ns/100ps
`include "./sys.v"
module Top;
reg D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101;
reg data_buf;
wire data;
wire clk2;
assigndata = (ADD_101) ? data_buf : 8'bz;
//data 在sys 中是inout 型变量,ADD_101
//控制 data是作为输入还是进行输出。
assignclk2 =DSC && TAKE;
initial
begin
SEND = 0;
ESC = 0;
DSC = 1;
TAKE = 1;
ADD_100 = 1;
ADD_101 = 1;
end
initial
begin
data_buf = 8'b10000001;
#90 ADD_100 = 0;
#100 ADD_100 = 1;
end
always
begin
#50;
SEND = ~SEND;
ESC = ~ESC;
end
initial
begin
#1500 ;
SEND = 0;
ESC= 0;
DSC= 1;
TAKE = 1;
ADD_100 = 1;
ADD_101 = 1;
D_out = 0;
#1150 ADD_101 = 0;
#100 ADD_101 =1;
#100 $stop;
end
always
begin
#50 ;
DSC = ~DSC;
TAKE = ~TAKE;
end
always @(negedge clk2) D_out = ~D_out;
sys sys(.D_in(D_in),.T0(T0),.T1(T1),.data(data),.D_out(D_out ),
.ADD_101(ADD_101), .SEND(SEND),.ESC(ESC),.DSC(DSC ),
.TAKE(TAKE),.ADD_100(ADD_100 ));
endmodule 硬汉哥还再研究Verilog吗?
最近领导要求要学习下fpga开发,用Verilog,能否推荐个入门的语法书和教程呢,谢谢 木兰花 发表于 2018-12-25 08:55
硬汉哥还再研究Verilog吗?
最近领导要求要学习下fpga开发,用Verilog,能否推荐个入门的语法书和教程呢, ...
数字电路课本后面的语法知识就可以。
eric2013 发表于 2018-12-25 10:13
数字电路课本后面的语法知识就可以。
好的,谢谢
页:
[1]