基于Verilog HDL的并口总线设计与仿真
作者:李高峰
来源:《河南科技》2018年第02期
摘 要:本文介绍了FPGA/CPLD作为外设挂接在MCU并口总线上的工作原理,使用Verilog HDL进行了模块化设计,并进行了仿真验证,还指出了使用双向端口(inout)和三态门(tri)应注意的问题,以期为相关学者提供参考。 关键词:Verilog HDL;并口总线;三态门
中图分类号:TP302 文献标识码:A 文章编号:1003-5168(2018)02-0027-03 Design and Simulation of Parallel Bus Based on Verilog HDL LI Gaofeng
(Qingdao Ainuo Intelligent Instrument Co., Ltd., Qingdao Shandong 266101) Abstract: This paper introduced the working principle of FPGA/CPLD as an external device mounted on MCU parallel port bus, modularized design with Verilog HDL, and carried out simulation verification. It also pointed out the problems that should be noticed when using two-way port (inout) and three state gate (tri), in order to provide reference for relevant scholars. Keywords: Verilog HDL; parallel bus;tri
目前,FPGA/CPLD的应用越来越多,在和MCU组成数字系统时,有时需要把FPGA/CPLD作为外设挂接在MCU的并口总线上,这既可提高数据交换速度,又可节省引脚。此时,MCU作为主设备,其并口总线包括:单向的地址线、单向的读写控制线、双向的数据线。而FPGA/CPLD作为外设(可能还有其他外设),实现正确地挂接在总线上,既要准确接收、发送数据,又要不影响其他外设,就显得非常重要[1]。
本文通过例程,说明如何设计基于Verilog HDL的并口总线[2,3]。所用的软件平台为ise_13.2和modelsim_se_10.0,硬件平台为xc6slx9。 1 系统原理 1.1 系统模型
龙源期刊网 http://www.qikan.com.cn
系统模型如图1所示,其中:①前缀“i_、iv_”表示输入(input),“o_、ov_”表示输出(output),“io_、iov_”表示输入/输出(inout),“w_、wv_”表示网线(wire);②后缀“_n”,表示低电平有效;③u1、u2为v74377元件例化,寄存器(reg),类似74hc377的功能;④u3、u4为v8tri元件例化,三态门(tri),类似74hc244的功能;⑤i_mcu_cs1_n、i_mcu_cs2n,来自mcu的片选地址线;⑥i_mcu_rd_n、i_mcu_wr_n,来自mcu的读、写控制线;⑦iov_mcu_d[7:0],来自mcu的双向数据线;⑧ov_qa[7:0]、ov_qb[7:0]和mcu无关,用于仿真观察;⑨输入、输出,要对于具体模块而言,如wv_qa[7:0]是u1的输出,是u3的输入。
1.2 工作原理
该系统是挂接mcu总线的简化模型,其工作原理如下。
①空闲时,u3、u4均输出高阻态z,与数据线隔离,避免影响总线。
②u1、u2一直挂在数据线上,随时准备接收数据:当i_mcu_wr_n和i_mcu_cs1_n有效时,u1接收数据并输出到wv_qa[7:0],并保持到下次有效再更新数据;当i_mcu_wr_n和i_mcu_cs2_n有效时,u2接收数据并输出到wv_qb[7:0],并保持到下次有效再更新数据。 ③当i_mcu_rd_n和i_mcu_cs2_n有效时,u3接通总线,把wv_qa[7:0]发送到总线上,由mcu接收;当i_mcu_rd_n和i_mcu_cs1_n有效时,u4接通总线,把wv_qb[7:0]发送到总线上,由mcu接收。
④非常重要的是,同一时刻,数据总线上只允许有一个发送方(含mcu)发送数据,不发送的发送方必须输出高阻态z,以与总线隔离,否则数据将陷入混乱;但可以有多个接收方同时接收数据。
⑤应注意,输入/输出、三态门(tri),最好只在顶层(top)使用,底层模块不要使用,可使用的输入(input)、输出(output)。
⑥还可用另一种设计方案,先用多路选择器(mux)选出数据源,如wv_qa[7:0]、wv_qb[7:0],之后经过一组三态门挂接在总线上,这样可节省三态门资源。 2 模块设计
系统分为底层模块(v74377、v8tri)和顶层模块(top)。 2.1 顶层模块
2.1.1 v74377模块。该模块功能类似74hc377,源程序如下:
龙源期刊网 http://www.qikan.com.cn
module v74377(
input i_clk, input i_clken_n,
input [7:0] iv_d, output [7:0] ov_q); reg [7:0] q;
always @( posedge i_clk ) if( !i_clken_n ) q assign ov_q = q; endmodule
2.1.2 v8tri模块。该模块功能类似74hc244,源程序如下: module v8tri(
input i_oe_n, input [7:0] iv_d, output [7:0] ov_q); assign ov_q = ~i_oe_n? iv_d : 8'hzz; endmodule 2.2 顶层模块
顶层模块对底层模块进行例化,源程序如下: module top(
input i_mcu_rd_n, i_mcu_wr_n, input i_mcu_cs1_n, i_mcu_cs2_n, inout [7:0] iov_mcu_d, output [7:0] ov_qa, ov_qb); wire [7:0] wv_qa, wv_qb;
龙源期刊网 http://www.qikan.com.cn
v74377 u1(
.i_clk( i_mcu_wr_n ), .i_clken_n( i_mcu_cs1_n ), .iv_d( iov_mcu_d ), .ov_q( wv_qa )); v74377 u2(
.i_clk( i_mcu_wr_n ), .i_clken_n( i_mcu_cs2_n ), .iv_d( iov_mcu_d ), .ov_q( wv_qb )); v8tri u3(
.i_oe_n( i_mcu_rd_n | i_mcu_cs2_n ), .iv_d( wv_qa ), .ov_q( iov_mcu_d )); v8tri u4(
.i_oe_n( i_mcu_rd_n | i_mcu_cs1_n ), .iv_d( wv_qb ), .ov_q( iov_mcu_d )); assign ov_qa = wv_qa; assign ov_qb = wv_qb; endmodule 3 仿真验证
仿真波形如图2所示,其流程如下。
①向i_mcu_cs1_n写数据8’h5a,从ov_qa[7:0]输出;向i_mcu_cs2_n写数据8’ha5,从ov_qb[7:0]输出。
②从i_mcu_cs1_n读数据,ivo_mcu_d[7:0]得到8’ha5;从i_mcu_cs2_n读数据,iov_mcu_d[7:0]得到8’h5a。
③其余,iov_mcu_d[7:0]保持三态8’hzz。 从仿真波形可看出,该设计达到了设计目的。
龙源期刊网 http://www.qikan.com.cn
仿真的部分源程序如下: `timescale 1 ns/ 1 ps module top_sim();
reg i_clk, i_rst_n, i_mcu_rd_n, i_mcu_wr_n; reg i_mcu_cs1_n, i_mcu_cs2_n; wire [7:0] ov_qa, ov_qb, iov_mcu_d; reg [7:0] reg_iov_mcu_d; assign iov_mcu_d = reg_iov_mcu_d; top u1(
.i_mcu_rd_n(i_mcu_rd_n), .i_mcu_wr_n(i_mcu_wr_n), .i_mcu_cs1_n(i_mcu_cs1_n), .i_mcu_cs2_n(i_mcu_cs2_n), .iov_mcu_d(iov_mcu_d),
.ov_qa(ov_qa), .ov_qb(ov_qb) ); initial begin i_rst_n = 0; #5; i_rst_n = 1; end initial begin i_clk = 0; forever #5 i_clk = ~i_clk; end reg [7:0] i;
always @(posedge i_clk) begin if(!i_rst_n) begin i {i_mcu_rd_n, i_mcu_wr_n }
龙源期刊网 http://www.qikan.com.cn
{i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d else begin case(i) 0: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 1: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 2: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 3: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 4: begin i
{i_mcu_rd_n, i_mcu_wr_n }
龙源期刊网 http://www.qikan.com.cn
{i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 5: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 6: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 7: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 8: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 9: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n}
龙源期刊网 http://www.qikan.com.cn
reg_iov_mcu_d 10: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 11: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 12: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 13: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 14: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d
龙源期刊网 http://www.qikan.com.cn
15: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 16: begin i
{i_mcu_rd_n, i_mcu_wr_n } {i_mcu_cs1_n, i_mcu_cs2_n} reg_iov_mcu_d 17: begin i
endcase end end endmodule
需要注意的是,iov_mcu_d[7:0]应定义为wire,同时,reg_iov_mcu_d[7:0]定义为reg,以替代(仿真)mcu向iov_mcu_d[7:0]发送数据,不发送时应为8’hzz。 4 结语
本设计通过了综合、仿真、实践,已在实际项目中应用,且完全用verilog编写,和软件及硬件平台无关,非常便于学习参考和应用移植。 参考文献:
[1]吴厚航.深入浅出玩转FPGA[M].2版.北京:北京航空航天出版社,2013.
[2]杨开陵,徐巧玉,王志慧,等.FPGA那些事儿——Verilog HDL建模设计[M].北京:北京航空航天出版社,2013.
[3]夏宇闻.Verilog数字系统设计教程[M].2版.北京:北京航空航天出版社,2008.
龙源期刊网 http://www.qikan.com.cn
龙源期刊网 http://www.qikan.com.cn
龙源期刊网 http://www.qikan.com.cn
龙源期刊网 http://www.qikan.com.cn
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务